pen-stack 6.10.0__tar.gz → 6.10.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pen_stack-6.10.0 → pen_stack-6.10.2}/CHANGELOG.md +62 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/CITATION.cff +1 -1
- {pen_stack-6.10.0 → pen_stack-6.10.2}/PKG-INFO +21 -17
- {pen_stack-6.10.0 → pen_stack-6.10.2}/README.md +20 -16
- pen_stack-6.10.2/benchmarks/offtarget/SHA256SUMS +4 -0
- pen_stack-6.10.2/docs/DEVIATIONS_AND_DISCLOSURES.md +57 -0
- pen_stack-6.10.2/docs/cards/offtarget_data.md +85 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/offtarget.md +19 -8
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/__init__.py +1 -1
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/immune_mhc2.py +13 -9
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/twin/position_effect.py +2 -1
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/immune_calibration.py +4 -3
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/offtarget_data.py +38 -7
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/offtarget_predict.py +76 -18
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack.egg-info/PKG-INFO +21 -17
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack.egg-info/SOURCES.txt +2 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pyproject.toml +1 -1
- pen_stack-6.10.2/scripts/offtarget_chromatin_validation.py +115 -0
- pen_stack-6.10.0/benchmarks/offtarget/SHA256SUMS +0 -4
- pen_stack-6.10.0/docs/cards/offtarget_data.md +0 -52
- {pen_stack-6.10.0 → pen_stack-6.10.2}/LICENSE +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/MANIFEST.in +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/bench/run.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/benchmarks/genome_writing_bench/README.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/benchmarks/genome_writing_challenge/README.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/benchmarks/position_effect/README.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/benchmarks/position_effect/SHA256SUMS +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/benchmarks/writer_efficiency/README.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/benchmarks/writer_efficiency/SHA256SUMS +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/antipeg.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/atlas_families.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/bridge_offtarget_profile.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/calibration/preexisting_nab_independent.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/capsid_epitope_oracle.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/capsid_sequences.fasta +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/cargo_polish.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/cell_types.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/datasets.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/delivery_constraints.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/delivery_rules.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/delivery_vehicles.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/expression/modifiers.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/expression/promoters.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/gates_v3.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/genotoxicity_oracle.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/gsh_validated_heldout.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/intent_weights.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/known_unknowns.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/llm.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/metric_guide.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/mhc_epitope_oracle.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/monitor_queries.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/oracles/execution.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/oracles/scope_cards.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/rules/delivery.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/rules/fold.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/rules/multiplex.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/rules/payload.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/rules/reachability.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/safety/hazard_registry.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/safety/policy.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/safety/probes.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/score_axes.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/seroprevalence.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/target_sites.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/universe_crosswalk.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/write_types.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/writer_sequences.fasta +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/configs/wtkb_curated.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/data/curated/bridge_offtarget_energetics.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/data/curated/gene_coords.parquet +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/data/curated/unified_editor_universe.parquet +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/BACKLOG.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/DEPLOY.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/INFRA.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/MCP.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/RELEASING.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/REPRO.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/STABILITY.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/agent.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/alphagenome_feasibility.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/autonomy.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/benchmark_circularity.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/biosecurity.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/build_interface.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/cards/atlas.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/cards/durability.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/cards/position_effect_data.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/cards/safety.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/cards/writer_efficiency_data.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/challenge.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/closed_loop.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/co_scientist.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/co_scientist_loop.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/delivery.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/delivery_immunology.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/digital_twin.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/dissemination.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/environment.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/experiment_design.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/generative_design.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/immune_profiler.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/index.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/integrations.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/live_oracles.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/mechanistic_constraints.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/oracles.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/position_effect.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/positioning.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/private_data_formats.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/quickstart.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/responsible_use.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/rules.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/scope.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/scorecard.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/tpe_bench.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/tutorials/compare-families.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/tutorials/score-deliverability.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/tutorials/where-can-i-write.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/tutorials/which-writer-reaches-locus.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/uncertainty.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/verify.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/world_model.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/writer_efficiency.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/writer_verification.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/docs/wtkb.md +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/_resources.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/active/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/active/acquire.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/active/design.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/active/validate.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/adapt/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/adapt/finetune.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/adapt/ingest.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/adapt/pipeline.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/adapt/recalibrate.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/adapt/report.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/agent/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/agent/cite.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/agent/co_scientist.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/agent/epistemic.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/agent/guardrails.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/agent/mcp_server.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/agent/orchestrator.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/agent/orchestrator_live.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/agent/pen_agent.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/agent/scope.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/agent/tools.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/api/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/api/manifest.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/atlas/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/atlas/build_wtkb.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/atlas/crosslink.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/atlas/expand.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/atlas/guide_design.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/atlas/schema.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/atlas/scorecard.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/atlas/universe.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/atlas/variant_propose.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/atlas/writer_efficiency.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/atlas/writer_predict.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/atlas/writer_recommend.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/atlas/writer_verify.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/bridge/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/bridge/activity.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/bridge/cli.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/bridge/fold_qc.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/bridge/guide_qc.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/bridge/ingest.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/bridge/offtarget.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/bridge/offtarget_energetics.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/bridge/ortholog_screen.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/bridge/pipeline.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/build/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/build/ingest.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/build/protocol.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/build/simlab.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/cli.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/data/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/data/encode.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/data/genome.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/data/ingest_chromatin.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/data/ingest_integration.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/data/ingest_safety_annot.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/data/ingest_trip.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/design/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/design/generate.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/design/pareto.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/design/space.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/design/writer_variants.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/env/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/env/genome_writing_env.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/env/policies.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/graph/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/graph/build.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/graph/cell_types.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/graph/ingest.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/graph/query.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/graph/schema.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/loop/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/loop/continual.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/loop/cycle.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/loop/drift.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/mech/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/mech/classify_atlas.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/mech/whitelist.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/monitor/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/monitor/europepmc.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/monitor/run.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/monitor/triage.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/oracles/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/oracles/cache.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/oracles/energetics.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/oracles/genome.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/oracles/protein_design.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/oracles/rna.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/oracles/schema.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/oracles/status.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/oracles/structure.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/oracles/vcell.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/ada_risk.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/antipeg_oracle.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/cargo.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/cargo_polish.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/delivery.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/delivery_constraints.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/delivery_immunology.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/delivery_vehicles.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/genotoxicity_oracle.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/immune_profile.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/innate_sensing.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/multiplex.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/optimize.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/pipeline.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/report.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/router.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/seroprevalence_oracle.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/planner/target_site.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/rag/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/rag/index.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/rag/llm.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/rag/qa.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/rules/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/rules/evaluators.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/rules/loader.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/rules/schema.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/rules/solver.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/safety/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/safety/audit.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/safety/gate.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/safety/policy.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/safety/redteam.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/safety/registry.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/safety/screen.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/score/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/score/recalibrate.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/score/therapeutic.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/server/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/server/api.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/twin/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/twin/calibrate.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/twin/data/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/twin/data/position_effect.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/twin/mechanistic.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/twin/outcome.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/ui/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/ui/app.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/adapt_demo.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/agent_eval.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/bench_graph_tasks.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/bench_rule_tasks.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/bench_trust_tasks.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/bench_writetype_tasks.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/blind_gsh_discovery.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/cargo_directionality.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/closed_loop.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/durability_baselines.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/experiment_design.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/expr_controls.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/forward_hypotheses.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/generative_design.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/guide_qc_demo.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/heldout_celltype_expr.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/intent_specification.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/known_biology_expr.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/out_of_scope_refusal.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/outcome_calibration.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/outcome_prediction.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/paper3_benchmark.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/paper4_real_validation.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/paper4_validation.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/protocol_safety.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/safety_screening.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/selective_prediction.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/seq_vs_measured.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/target_site_controls.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/uncertainty_eval.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/ungrounded_baseline.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/within_locus_ranking.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/validate/writer_recovery.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/verify/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/verify/schema.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/verify/service.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/web/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/web/guide.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/web/llm.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/web/router.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/web/server.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/web/tools.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/__init__.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/chromatin_seq.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/durability.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/export_tracks.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/features.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/gsh_baseline.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/mesh_features.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/offtarget_assay.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/ood.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/providers.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/safety.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/structure3d.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/uncertainty.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack/wgenome/writability.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack.egg-info/dependency_links.txt +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack.egg-info/entry_points.txt +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack.egg-info/requires.txt +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/pen_stack.egg-info/top_level.txt +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_phase0.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_phase1_5.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_phase2.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_phase3.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_a.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_acq.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_b.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_ba.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_bench.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_c.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_cal.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_calib.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_chat.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_cite.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_continual.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_crit.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_ct.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_d.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_drift.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_e.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_env.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_ep.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_expr2.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_f.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_g.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_gen.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_graph.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_h.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_immune.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_immune2.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_innate.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_loop.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_mc.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_mech.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_mon.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_o.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_offtarget.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_orch.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_peg.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_plan.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_policy.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_profile.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_proto.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_r.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_route.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_screen.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_uq.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_v.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_writer.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_wv.json +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/paper1.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/paper2.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/paper3.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/paper4.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/phase0.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_a.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_acq.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_aldesign.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_alvalidate.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_atlas.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_b.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_ba.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_ba_v33.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_ba_v45.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_bench.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_c.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_cal.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_calib.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_challenge.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_chat.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_cite.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_continual.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_cosci2.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_crit.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_ct.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_d.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_drift.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_e.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_env.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_ep.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_epitope.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_expr2.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_f.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_frontend.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_g.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_gen.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_genotox.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_graph.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_h.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_hybrid.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_immune.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_immune2.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_ingest.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_innate.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_loop.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_manifest.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_mc.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_mcp.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_mech.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_mon.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_o.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_offtarget.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_openapi.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_orch.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_outcome.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_pareto.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_peg.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_plan.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_policy.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_profile.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_proto.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_r.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_redteam.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_route.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_screen.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_seroprev.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_simlab.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_twincal.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_uq.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_v.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_vcell.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_writer.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/prereg/ws_wv.yaml +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/calibrate_immune_axes.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/fetch_licensed_sources.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/p1_build_atlas.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/p1_build_durability.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/p1_build_position_effect.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/p1_build_writer_eff.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/p1_export_tracks.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/p1_safety_concordance.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/p1_train_safety.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/p1_validation_report.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/p2_build_atlas.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/p3_benchmark_report.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/p4_genome_scan.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/p52_build_genotox_oracle.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/p53_build_epitope_oracle.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/ws_b_report.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/scripts/ws_c_report.py +0 -0
- {pen_stack-6.10.0 → pen_stack-6.10.2}/setup.cfg +0 -0
|
@@ -3,6 +3,68 @@
|
|
|
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.2] - 2026-06-20 - Chromatin context: controlled validation (honest weak/inconsistent result)
|
|
7
|
+
|
|
8
|
+
**PATCH — validate the chromatin axis for real, then scope it to what the data supports.** v6.10.1 wired a real
|
|
9
|
+
Stage B accessibility read but had not *demonstrated* it carries signal. v6.10.2 runs a controlled experiment and
|
|
10
|
+
reports the result honestly — it is **not** a clean win.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **A controlled chromatin validation** (`benchmarks/offtarget/chromatin_validation.json`,
|
|
14
|
+
`scripts/offtarget_chromatin_validation.py`). Off-target protospacers mapped to hg38 (GRCh38.fa, exact match both
|
|
15
|
+
strands, 98.5% mapped); AUROC of the Stage B K562 ATAC/DNase accessibility for active-vs-inactive off-targets per
|
|
16
|
+
assay, with **in-vitro assays as a NEGATIVE control** (cell-free → no chromatin). Result: the in-vitro controls hug
|
|
17
|
+
0.5 (method sound — no spurious signal); the canonical cell-based assay **GUIDE-seq is a textbook modest positive
|
|
18
|
+
(AUROC 0.58, CI [0.550, 0.613])** even with a cross-cell-type K562 proxy; but the second cell-based assay **TTISS
|
|
19
|
+
reverses (0.346)**. **Verdict: WEAK / INCONSISTENT — chromatin is NOT a validated quantitative axis on this data**
|
|
20
|
+
(the cross-cell-type proxy is the likely cause; a cell-type-matched accessibility track would settle it — deferred).
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- The chromatin-accessibility modifier is now an explicit **annotation only**, labelled `validated=false`: it reads
|
|
24
|
+
the real Stage B track (or a caller-supplied scalar) and notes the qualitative Lazzarotto-2020 direction, but it
|
|
25
|
+
**does not change the numeric off-target risk score**. `offtarget_data.CHROMATIN_VALIDATION` carries the result.
|
|
26
|
+
- Corrected the v6.10.1 disclosures-ledger entry that had marked chromatin "FIXED" — that was too strong;
|
|
27
|
+
it is now disclosed as *tested → weak/inconsistent → documented annotation, not a validated axis*.
|
|
28
|
+
|
|
29
|
+
This is an honest negative-ish result reported in full rather than dropped or overstated.
|
|
30
|
+
|
|
31
|
+
## [6.10.1] - 2026-06-20 - WS-OFFTARGET rigor pass + retroactive honesty audit (v6.7–v6.9)
|
|
32
|
+
|
|
33
|
+
**PATCH — complete the Stage E plan and disclose every remaining deviation.** Closes the v6.10.0 gaps and adds a
|
|
34
|
+
standing [DEVIATIONS_AND_DISCLOSURES.md](docs/DEVIATIONS_AND_DISCLOSURES.md) ledger; also retro-audited v6.7/v6.8/v6.9
|
|
35
|
+
(plan vs shipped vs code) and fixed/disclosed the findings. No item is reported complete if it is a silent
|
|
36
|
+
substitution/partial/deferral.
|
|
37
|
+
|
|
38
|
+
### Added / changed (Stage E completion)
|
|
39
|
+
- **Off-Target-Bench expanded to FOUR unbiased assays.** Added **CHANGE-seq** (Lazzarotto 2020, `10.1038/s41587-020-0555-7`)
|
|
40
|
+
+ **SITE-seq** (Cameron 2017, `10.1038/nmeth.4284`) on **independent broad guide panels** (20 + 11 guides). The real
|
|
41
|
+
**CRISOT-Score** (MD-physics, **assay-agnostic → leakage-clean**) beats the homology baseline on **all four**:
|
|
42
|
+
AUPRC 0.646/0.520/0.541/0.521 vs 0.467/0.266/0.249/0.233; per-guide bootstrap CI excludes 0 on each.
|
|
43
|
+
- **Chromatin wired to the real Stage B track + relabelled honestly.** `locus_accessibility(chrom, bin, ct)` reads
|
|
44
|
+
`phase_1/features/chromatin_{ct}.parquet` (ATAC/DNase) when present and **abstains** otherwise; the docs now say
|
|
45
|
+
"chromatin-accessibility modifier" (not "chromatin-aware engine") — the bare wheel / deployed atlas do not ship the
|
|
46
|
+
raw track, so the modifier is inactive there (disclosed).
|
|
47
|
+
- **Off-target task added to the Genome-Writing Challenge** (`benchmarks/genome_writing_challenge/harness.py`) —
|
|
48
|
+
non-circular (label = wet-lab Active call), data-gated on the fixture; the reference solver nominates correctly.
|
|
49
|
+
- **Disclosed (not eliminated):** CRISOT is used instead of the plan-named CCLMoff/CRISMER (CRISMER ships no license;
|
|
50
|
+
CCLMoff is GPU + trained on these assays → leakage; CRISOT is the leakage-clean, license-clean, CPU choice). A
|
|
51
|
+
genomic-coordinate **locus split** is not possible (harmonized data is coordinate-free) → held-out-guide + cross-assay.
|
|
52
|
+
|
|
53
|
+
### Fixed (retroactive honesty audit)
|
|
54
|
+
- **v6.9:** dropped the inaccurate "OOD-gated" claim in the MHC-II axis status (it is **coverage-gated**, abstains
|
|
55
|
+
when uncached — no distributional OOD gate); corrected the stale `AXIS_STATUS["mhc2_writer"].reason` + the
|
|
56
|
+
`immune_mhc2.py` module docstring (they still described the dropped v6.9.0 P1-anchor proxy as "the method" — the
|
|
57
|
+
production axis is the real NetMHCIIpan-4.0). Disclosed: the plan-named MHC-II tool ensemble + IEDB/ImmunoSeq/FVIII
|
|
58
|
+
ADA datasets were not used (single-tool NetMHCIIpan-4.0; the recovery bench is a 4-protein sanity check, not an
|
|
59
|
+
IEDB held-out leaderboard); the 6.9.1→6.9.2 MHC-II metric change (peptide-fraction → residue-coverage).
|
|
60
|
+
- **v6.8:** disclosed that v6.8.0's attB was a poly-G/C **schematic** (fixed with the real Bxb1 attB in v6.9.2);
|
|
61
|
+
inter-curator agreement is N/A (single contributor); "≥1 external submission" is unmet (forward-looking).
|
|
62
|
+
- **v6.7:** corrected the "chromosome-Mondrian" served-interval wording (per-chromosome Mondrian qhats are computed,
|
|
63
|
+
but the **global** qhat is served — correct, since a query has no chromosome at serve time); disclosed the prereg
|
|
64
|
+
consolidation + the deferred HEK293T-OOD demo / scope-manifest entry.
|
|
65
|
+
|
|
66
|
+
See the full ledger in [docs/DEVIATIONS_AND_DISCLOSURES.md](docs/DEVIATIONS_AND_DISCLOSURES.md).
|
|
67
|
+
|
|
6
68
|
## [6.10.0] - 2026-06-20 - WS-OFFTARGET (PEN-OFFTGT: cross-writer-family off-target nomination)
|
|
7
69
|
|
|
8
70
|
**Series III, Stage E.** Off-target moves from a single-family bridge pseudosite scan to a **cross-writer-family,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 6.10.
|
|
3
|
+
Version: 6.10.2
|
|
4
4
|
Summary: Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner.
|
|
5
5
|
Author-email: Anees Ahmed Mahaboob Ali <ahmedaneesm@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -90,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)
|
|
@@ -151,23 +151,27 @@ demonstrated (v5.12) and the benchmark went public (v5.13).
|
|
|
151
151
|
## What is new in v6.10 — PEN-OFFTGT (cross-writer-family off-target nomination)
|
|
152
152
|
|
|
153
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
|
|
155
|
-
(site + writer + off-target). It is scrupulously
|
|
156
|
-
ships with the empirical assay that would confirm it.
|
|
157
|
-
|
|
158
|
-
- **A real, validated benchmark** (`benchmarks/offtarget/`) over
|
|
159
|
-
|
|
160
|
-
(
|
|
161
|
-
|
|
162
|
-
|
|
154
|
+
v6.10 makes it a **cross-writer-family NOMINATION engine** with a real-data-calibrated risk band and a documented
|
|
155
|
+
chromatin-accessibility modifier — completing the safety triad (site + writer + off-target). It is scrupulously
|
|
156
|
+
honest that **nomination is not a clearance**: every candidate ships with the empirical assay that would confirm it.
|
|
157
|
+
|
|
158
|
+
- **A real, validated benchmark** (`benchmarks/offtarget/`) over **experimentally validated off-targets** from
|
|
159
|
+
**four** unbiased assays — GUIDE-seq (Tsai 2015) + CIRCLE-seq (Tsai 2017) on canonical guides, and CHANGE-seq
|
|
160
|
+
(Lazzarotto 2020) + SITE-seq (Cameron 2017) on **independent broad guide panels**. The licensed **CRISOT** predictor
|
|
161
|
+
(Chen et al. *Nat Commun* 2023; MD-physics, assay-agnostic → leakage-clean) **beats the sequence-homology baseline
|
|
162
|
+
on all four** — AUPRC 0.65/0.52/0.54/0.52 vs 0.47/0.27/0.25/0.23; per-guide bootstrap CI excludes 0 on each.
|
|
163
|
+
CRISOT is CC-BY-NC and runs only on the VM — only derived scores are cached (like the licensed MHC tools).
|
|
163
164
|
- **Grounded, calibrated risk** — the risk band IS the real-data fraction of candidates at *k* mismatches that were
|
|
164
165
|
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
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
or predictor for
|
|
169
|
-
|
|
170
|
-
|
|
166
|
+
- **Cross-family** — nucleases (mismatch-calibrated risk + the real CRISOT score + a chromatin-accessibility modifier
|
|
167
|
+
that reads the Stage B ATAC/DNase track when present, else abstains), serine integrases (cryptic **pseudo-attB**
|
|
168
|
+
scan on the real documented Bxb1 attB core), bridge recombinases (the existing Perry-DMS engine). Bridge/integrase
|
|
169
|
+
off-target is **honestly flagged data-thin** — there is no published genome-wide unbiased assay or predictor for
|
|
170
|
+
bridge recombinases (verified).
|
|
171
|
+
- **Surfaces** — REST `POST /offtarget`, MCP `offtarget_scan`, manifest `nominate_offtargets`, an Off-Target web
|
|
172
|
+
page, and an off-target task in the Genome-Writing Challenge. Abstains without inputs; never fabricates sites.
|
|
173
|
+
*(Plan deviations — e.g. the CRISOT-for-CCLMoff/CRISMER substitution — are disclosed in
|
|
174
|
+
[docs/DEVIATIONS_AND_DISCLOSURES.md](docs/DEVIATIONS_AND_DISCLOSURES.md).)*
|
|
171
175
|
|
|
172
176
|
## What is new in v6.9 — PEN-IMMUNE (MHC-II/CD4 + ADA + the writer enzyme as a distinct antigen)
|
|
173
177
|
|
|
@@ -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)
|
|
@@ -76,23 +76,27 @@ demonstrated (v5.12) and the benchmark went public (v5.13).
|
|
|
76
76
|
## What is new in v6.10 — PEN-OFFTGT (cross-writer-family off-target nomination)
|
|
77
77
|
|
|
78
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
|
|
80
|
-
(site + writer + off-target). It is scrupulously
|
|
81
|
-
ships with the empirical assay that would confirm it.
|
|
82
|
-
|
|
83
|
-
- **A real, validated benchmark** (`benchmarks/offtarget/`) over
|
|
84
|
-
|
|
85
|
-
(
|
|
86
|
-
|
|
87
|
-
|
|
79
|
+
v6.10 makes it a **cross-writer-family NOMINATION engine** with a real-data-calibrated risk band and a documented
|
|
80
|
+
chromatin-accessibility modifier — completing the safety triad (site + writer + off-target). It is scrupulously
|
|
81
|
+
honest that **nomination is not a clearance**: every candidate ships with the empirical assay that would confirm it.
|
|
82
|
+
|
|
83
|
+
- **A real, validated benchmark** (`benchmarks/offtarget/`) over **experimentally validated off-targets** from
|
|
84
|
+
**four** unbiased assays — GUIDE-seq (Tsai 2015) + CIRCLE-seq (Tsai 2017) on canonical guides, and CHANGE-seq
|
|
85
|
+
(Lazzarotto 2020) + SITE-seq (Cameron 2017) on **independent broad guide panels**. The licensed **CRISOT** predictor
|
|
86
|
+
(Chen et al. *Nat Commun* 2023; MD-physics, assay-agnostic → leakage-clean) **beats the sequence-homology baseline
|
|
87
|
+
on all four** — AUPRC 0.65/0.52/0.54/0.52 vs 0.47/0.27/0.25/0.23; per-guide bootstrap CI excludes 0 on each.
|
|
88
|
+
CRISOT is CC-BY-NC and runs only on the VM — only derived scores are cached (like the licensed MHC tools).
|
|
88
89
|
- **Grounded, calibrated risk** — the risk band IS the real-data fraction of candidates at *k* mismatches that were
|
|
89
90
|
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
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
or predictor for
|
|
94
|
-
|
|
95
|
-
|
|
91
|
+
- **Cross-family** — nucleases (mismatch-calibrated risk + the real CRISOT score + a chromatin-accessibility modifier
|
|
92
|
+
that reads the Stage B ATAC/DNase track when present, else abstains), serine integrases (cryptic **pseudo-attB**
|
|
93
|
+
scan on the real documented Bxb1 attB core), bridge recombinases (the existing Perry-DMS engine). Bridge/integrase
|
|
94
|
+
off-target is **honestly flagged data-thin** — there is no published genome-wide unbiased assay or predictor for
|
|
95
|
+
bridge recombinases (verified).
|
|
96
|
+
- **Surfaces** — REST `POST /offtarget`, MCP `offtarget_scan`, manifest `nominate_offtargets`, an Off-Target web
|
|
97
|
+
page, and an off-target task in the Genome-Writing Challenge. Abstains without inputs; never fabricates sites.
|
|
98
|
+
*(Plan deviations — e.g. the CRISOT-for-CCLMoff/CRISMER substitution — are disclosed in
|
|
99
|
+
[docs/DEVIATIONS_AND_DISCLOSURES.md](docs/DEVIATIONS_AND_DISCLOSURES.md).)*
|
|
96
100
|
|
|
97
101
|
## What is new in v6.9 — PEN-IMMUNE (MHC-II/CD4 + ADA + the writer enzyme as a distinct antigen)
|
|
98
102
|
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
8752efa5b6ada36cdf07707999380150f749e819178008be04dcc6b8cd70c084 split.json
|
|
2
|
+
e149d144c5b74499010b062cf9d3a7e2e290e71c8d3720d7b75811bf2ad7dbf3 offtarget_bench_fixture.csv
|
|
3
|
+
e699f399c1c640968aea1d4fe6cc679f035db3a653a5766fed795ab5eec2cecb offtarget_bench_metrics.json
|
|
4
|
+
42556ae9915037d8a041259daafa93265a5c3eb9f6377245fdb425a4c3418448 offtarget_calibration.json
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# PEN-STACK — Deviations & Disclosures Ledger
|
|
2
|
+
|
|
3
|
+
A standing, honest record of every place a shipped release **deviated** from its execution plan — a dataset/model
|
|
4
|
+
that was substituted, a deliverable that was narrowed or deferred, or wording that overclaimed — together with the
|
|
5
|
+
correction or the justification. Maintained from v6.10.1 onward (the rule: *no item is reported complete if it is a
|
|
6
|
+
silent substitution/partial/deferral; it is either fixed or disclosed here*). Audited retroactively for v6.7–v6.9.
|
|
7
|
+
|
|
8
|
+
Legend: **FIXED** = corrected in code/docs · **DISCLOSED** = a justified, permanent deviation · **N/A** = not
|
|
9
|
+
applicable (e.g. single contributor).
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## v6.10 / v6.10.1 — PEN-OFFTGT (Stage E, off-target nomination)
|
|
14
|
+
|
|
15
|
+
| Item | Status | Detail |
|
|
16
|
+
|---|---|---|
|
|
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
|
+
| 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" | **DISCLOSED (tested v6.10.2 — weak/inconsistent)** | v6.10.0 overclaimed "chromatin-aware" with only a caller-supplied hook. v6.10.1 added a **real** `locus_accessibility(chrom, bin, ct)` reading the Stage B `chromatin_{ct}.parquet` ATAC/DNase track (verified on the VM), abstaining when absent, and relabelled "chromatin-accessibility modifier". **v6.10.2 ran a controlled validation** (off-targets mapped to hg38, AUROC of K562 accessibility for active-vs-inactive per assay, in-vitro negative controls): the in-vitro controls are ~0.5 (method sound), GUIDE-seq is a textbook modest positive (**0.58**, CI excludes 0.5) but TTISS **reverses** (0.346) — the cross-cell-type K562 proxy is the likely cause. **VERDICT: weak/inconsistent → NOT a validated quantitative axis.** Chromatin stays a documented **annotation only** (does not change the numeric risk score), labelled `validated=false`. Full result: `benchmarks/offtarget/chromatin_validation.json`. The definitive refinement (cell-type-matched ENCODE accessibility) is deferred. *This corrects the v6.10.1 ledger entry, which had marked it "FIXED" — that was too strong.* |
|
|
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
|
+
| 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
|
+
| 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
|
+
| "≥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
|
+
| 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
|
+
|
|
26
|
+
## v6.9 — PEN-IMMUNE (Stage G) — *audited retroactively, corrected in v6.10.1*
|
|
27
|
+
|
|
28
|
+
| Item | Status | Detail |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| "OOD-gated" in the MHC-II axis status string | **FIXED (v6.10.1)** | No distributional OOD gate is computed for an in-panel sequence; the axis is **coverage-gated** (abstains when the antigen is uncached). Wording corrected in `immune_mhc2.py`. |
|
|
31
|
+
| Stale `AXIS_STATUS["mhc2_writer"].reason` + module docstring described the dropped v6.9.0 P1-anchor proxy as "the method" | **FIXED (v6.10.1)** | Updated to state the production method is the real **NetMHCIIpan-4.0** (v6.9.1/6.9.2); the P1-anchor density is offline-triage only. |
|
|
32
|
+
| Plan-named MHC-II tools (MixMHC2pred, Graph-pMHC, HLAIIPred, FIONA, iTope) + ADA datasets (IEDB held-out, ImmunoSeq-217, FVIII/ATHN/MLOF inhibitor sets) | **DISCLOSED** | The MHC-II axis is **NetMHCIIpan-4.0 only** (a single real tool, not the named ensemble); the Immuno-Bench panel is the 4 bundled origin-labelled proteins, **not** an IEDB/ADA held-out leaderboard. The named datasets/tools were **not used**. The single-tool result is real; the broader ensemble/benchmark is deferred. |
|
|
33
|
+
| Immuno-Bench "recovery" circularity | **DISCLOSED** | `recovery()` scores 3 foreign + 1 self protein; because `ada_risk = density × foreignness(origin)` and `foreignness(self)=0`, the self control is **zeroed by construction** — "foreign > self" cannot fail. It is a sanity check, not the IEDB/ADA held-out leaderboard the plan named. The ADA-incidence absence (stays 🟡) was already disclosed; this circularity note is new. |
|
|
34
|
+
| MHC-II metric changed (peptide-fraction → residue-coverage) between 6.9.1 and 6.9.2 | **DISCLOSED** | The 4× difference between the §6b (0.153…) and §6c/shipped (0.636…) numbers is a **metric-definition change** (now residue coverage), not a contradiction. No live surface emits the old numbers. |
|
|
35
|
+
|
|
36
|
+
## v6.8 — PEN-WRITER (Stage C) — *audited retroactively*
|
|
37
|
+
|
|
38
|
+
| Item | Status | Detail |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| attB was a poly-G/C **schematic** at v6.8.0, surfaced as a design candidate | **FIXED (v6.9.2)** | v6.8.0 emitted `("G"*18)+core+("C"*18)` and only tested the central dinucleotide, never disclosing the attB sequence was a placeholder. The **real documented Bxb1 minimal attB** (FlyBase FBto0000359; Ghosh 2003) replaced it in v6.9.2. Disclosed here as a v6.8.0 limitation. |
|
|
41
|
+
| Inter-curator agreement (pre-registered C-WS1 acceptance) | **N/A** | Single contributor (`ahmedanees-m`) — inter-curator agreement is structurally inapplicable; the curation is single-author with per-row DOI + verbatim quote. |
|
|
42
|
+
| "≥1 external submission" (success criterion) | **DISCLOSED** | Not met; forward-looking. |
|
|
43
|
+
| Writer predictor gate (beats baseline on held-out **family**) | **OK (already disclosed)** | It wins on held-out **locus** only, **not** family; KB ranking retained. Stated verbatim in code/docs — no fix needed. |
|
|
44
|
+
|
|
45
|
+
## v6.7 — PEN-EXPRESS (Stage H expression) — *audited retroactively*
|
|
46
|
+
|
|
47
|
+
| Item | Status | Detail |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| TPE-Bench headline: held-out-**cell-type** (plan) vs held-out-**chromosome** (shipped) | **OK (already disclosed)** | The live track is labelled `chrom_holdout` and the cell-type track is labelled `DATA-GATED` everywhere — an honestly-disclosed scope narrowing, not covert. |
|
|
50
|
+
| "chromosome-Mondrian" served interval | **FIXED (v6.10.1)** | Per-chromosome Mondrian qhats are computed, but the **served** band uses the global qhat (a query has no chromosome at serve time — which is correct). Wording corrected in `position_effect.py` to avoid implying per-query Mondrian serving. |
|
|
51
|
+
| Prereg consolidation (`ws_expr_{d,m,u,cal}` → single `ws_expr2.yaml`) | **DISCLOSED** | The four planned preregs were consolidated into one; the `cal` (wet-lab) prereg was dropped with the user-scoped wet-lab omission. |
|
|
52
|
+
| HEK293T-OOD acceptance demo + scope-manifest entry | **DISCLOSED** | Deferred with the data-gated cross-cell-type transfer track (needs a second cell-type epigenome). The OOD detector itself ships and is wired; titer/patient state are registered known-unknowns stack-wide. |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
*This ledger is updated on every release. If you find a deviation not listed here, it is a bug in our honesty, not
|
|
57
|
+
an intended omission — please flag it.*
|
|
@@ -0,0 +1,85 @@
|
|
|
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; 4 assays as of v6.10.1)
|
|
9
|
+
| Assay | Setting | Guide panel | Citation | DOI |
|
|
10
|
+
|---|---|---|---|---|
|
|
11
|
+
| GUIDE-seq | cell-based, unbiased | canonical (8) | Tsai et al., *Nat Biotechnol* 2015 | `10.1038/nbt.3117` |
|
|
12
|
+
| CIRCLE-seq | in vitro (cell-free), unbiased | canonical (8) | Tsai et al., *Nat Methods* 2017 | `10.1038/nmeth.4278` |
|
|
13
|
+
| CHANGE-seq | in vitro, high-throughput | independent broad (20) | Lazzarotto et al., *Nat Biotechnol* 2020 | `10.1038/s41587-020-0555-7` |
|
|
14
|
+
| SITE-seq | in vitro biochemical | independent broad (11) | Cameron et al., *Nat Methods* 2017 | `10.1038/nmeth.4284` |
|
|
15
|
+
|
|
16
|
+
Canonical Cas9 guides: **EMX1, VEGFA site 1/2/3, FANCF, HEK293 site 2/3/4**. CHANGE/SITE-seq use **independent broad
|
|
17
|
+
guide panels** (not the canonical 8) — a cross-assay generalization test. The harmonized candidate/label tables are
|
|
18
|
+
sourced from the CRISOT data release (Zenodo `10.5281/zenodo.8420032`), which redistributes the public assay
|
|
19
|
+
supplements; PEN-STACK cites the **original assay papers** as the ground-truth provenance.
|
|
20
|
+
|
|
21
|
+
## Learned predictor (real tool, VM-only)
|
|
22
|
+
**CRISOT-Score** — Chen et al., *Nat Commun* 2023, `10.1038/s41467-023-42695-4`; an XGBoost RNA-DNA interaction
|
|
23
|
+
fingerprint. **License: CC-BY-NC** → it runs only on the VM (`crisot:tools` Docker, `xgboost`/`pandas`/`numpy`);
|
|
24
|
+
its weights are NEVER redistributed. Only DERIVED scores are cached/committed (CI-safe), exactly like the licensed
|
|
25
|
+
NetMHC tools.
|
|
26
|
+
|
|
27
|
+
## Baseline (pre-registered)
|
|
28
|
+
Sequence-homology nomination = ascending **mismatch count** (Hamming over the 20-nt protospacer).
|
|
29
|
+
|
|
30
|
+
## Result (E-G2, full real data, on the VM)
|
|
31
|
+
CRISOT-Score is the MD-physics, **assay-agnostic** scorer (not fit on these labels) → a leakage-clean held-out
|
|
32
|
+
evaluation on every assay.
|
|
33
|
+
|
|
34
|
+
| Assay | guide panel | CRISOT AUPRC | homology AUPRC | gap | 95% CI (held-out-guide bootstrap) | beats |
|
|
35
|
+
|---|---|---|---|---|---|---|
|
|
36
|
+
| GUIDE-seq | canonical (8) | 0.646 | 0.467 | +0.179 | [0.014, 0.329] | ✅ |
|
|
37
|
+
| CIRCLE-seq | canonical (8) | 0.520 | 0.266 | +0.253 | [0.146, 0.370] | ✅ |
|
|
38
|
+
| CHANGE-seq | independent (20) | 0.541 | 0.249 | +0.292 | [0.235, 0.348] | ✅ |
|
|
39
|
+
| SITE-seq | independent (11) | 0.521 | 0.233 | +0.287 | [0.239, 0.335] | ✅ |
|
|
40
|
+
|
|
41
|
+
The learned predictor beats the homology baseline on **all four** assays (per-guide bootstrap CI excludes 0),
|
|
42
|
+
including two independent broad guide panels (cross-assay generalization).
|
|
43
|
+
|
|
44
|
+
## Chromatin-accessibility modifier (honest scope — tested, NOT validated)
|
|
45
|
+
The nominator applies a documented chromatin modifier (open chromatin raises realized off-target activity;
|
|
46
|
+
Lazzarotto 2020). It reads the **real Stage B accessibility track** (`phase_1/features/chromatin_{ct}.parquet`,
|
|
47
|
+
ATAC/DNase) when a candidate's genomic locus + cell type are supplied AND the feature store is present (verified on
|
|
48
|
+
the VM), or accepts a caller-supplied scalar; it **abstains** otherwise (the bare wheel / CI / deployed atlas do not
|
|
49
|
+
ship the raw track).
|
|
50
|
+
|
|
51
|
+
**v6.10.2 controlled validation** (`benchmarks/offtarget/chromatin_validation.json`): off-targets mapped to hg38
|
|
52
|
+
(98.5%), AUROC of K562 accessibility for active-vs-inactive off-targets per assay, with in-vitro assays as a
|
|
53
|
+
NEGATIVE control. Result — **weak / inconsistent**:
|
|
54
|
+
|
|
55
|
+
| Assay | modality | accessibility AUROC | 95% CI |
|
|
56
|
+
|---|---|---|---|
|
|
57
|
+
| GUIDE-seq | cell-based | **0.58** | [0.550, 0.613] — excludes 0.5 |
|
|
58
|
+
| TTISS | cell-based | 0.346 | [0.322, 0.368] — *reversed* |
|
|
59
|
+
| CHANGE-seq | in-vitro control | 0.496 | [0.480, 0.513] — null ✓ |
|
|
60
|
+
| CIRCLE-seq | in-vitro control | 0.519 | [0.501, 0.535] — ~null ✓ |
|
|
61
|
+
| SITE-seq | in-vitro control | 0.469 | [0.452, 0.489] — ~null ✓ |
|
|
62
|
+
|
|
63
|
+
The in-vitro controls hug 0.5 (the method has no spurious signal); the canonical cell-based assay (GUIDE-seq) shows
|
|
64
|
+
the textbook modest positive even with a **cross-cell-type** K562 proxy, but TTISS reverses. **Verdict: NOT a
|
|
65
|
+
validated quantitative axis** — chromatin is a documented **annotation only** (it does not change the numeric risk
|
|
66
|
+
score), labelled `validated=false`. A cell-type-matched accessibility track is the definitive refinement (deferred).
|
|
67
|
+
|
|
68
|
+
## Risk calibration (grounded)
|
|
69
|
+
The nomination risk band IS the empirical fraction of candidates at *k* mismatches that were validated-active
|
|
70
|
+
(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.
|
|
71
|
+
Mismatch counts outside the calibrated range abstain rather than extrapolate.
|
|
72
|
+
|
|
73
|
+
## Files
|
|
74
|
+
- `benchmarks/offtarget/offtarget_bench_fixture.csv` — real validated off-targets + cached CRISOT scores (CI-safe;
|
|
75
|
+
inactives downsampled with a fixed seed for a small committed file).
|
|
76
|
+
- `benchmarks/offtarget/offtarget_bench_metrics.json` — the AUTHORITATIVE full-data metrics.
|
|
77
|
+
- `benchmarks/offtarget/offtarget_calibration.json` — the full-data mismatch / CRISOT-decile calibration.
|
|
78
|
+
- `benchmarks/offtarget/split.json`, `SHA256SUMS` — split definition + checksums.
|
|
79
|
+
|
|
80
|
+
## Honest limits
|
|
81
|
+
Nomination is **not** a clearance — every result ships with the empirical assay that would confirm it. Genome-wide
|
|
82
|
+
candidate ENUMERATION needs the on-VM Cas-OFFinder/genome scan; this benchmark covers SCORING + RANKING of supplied
|
|
83
|
+
candidates. Bridge/integrase off-target is data-thin: there is **no published genome-wide unbiased off-target assay
|
|
84
|
+
or predictor for bridge recombinases** (verified), and the large-serine-integrase assays (Cryptic-seq/HIDE-seq) and
|
|
85
|
+
predictor (IntQuery) are recent single-company preprints with no public weights.
|
|
@@ -10,9 +10,16 @@ A nominated off-target is a candidate, and every result ships with the empirical
|
|
|
10
10
|
`nominate_offtargets(writer_family, ...)` dispatches by writer family:
|
|
11
11
|
|
|
12
12
|
- **Nuclease (Cas9):** given a guide + candidate sites (e.g. from a Cas-OFFinder scan), each candidate gets a
|
|
13
|
-
**mismatch-calibrated empirical risk** (the real
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
**mismatch-calibrated empirical risk** (the real active fraction at *k* mismatches — not a guessed curve), the
|
|
14
|
+
**real CRISOT-Score** when the (guide, site) is in the cached bench, and a documented **chromatin-accessibility
|
|
15
|
+
modifier** (open chromatin raises realized off-target activity; Lazzarotto 2020). The modifier reads the **real
|
|
16
|
+
Stage B accessibility track** (`phase_1/features/chromatin_{ct}.parquet`) when a candidate's genomic locus + cell
|
|
17
|
+
type are supplied and the store is present, accepts a caller-supplied scalar otherwise, and **abstains** when
|
|
18
|
+
neither is available (the bare wheel / current deployed atlas do not ship the raw track). A **v6.10.2 controlled
|
|
19
|
+
validation** (off-targets mapped to hg38; AUROC of accessibility for active-vs-inactive off-targets, in-vitro
|
|
20
|
+
negative controls) found the signal **weak/inconsistent** (GUIDE-seq 0.58 but TTISS 0.346; in-vitro controls
|
|
21
|
+
~null) — so chromatin is an **annotation only** (`validated=false`), it does **not** change the numeric risk
|
|
22
|
+
score. Full result: `benchmarks/offtarget/chromatin_validation.json`.
|
|
16
23
|
- **Serine integrase (Bxb1):** a cryptic **pseudo-attB** scan that seeds on the *real documented* Bxb1 attB core
|
|
17
24
|
(`GCGGTCTC`, central GT; FlyBase FBto0000359, Ghosh 2003) and reports candidate cryptic sites by arm mismatches.
|
|
18
25
|
- **Bridge recombinase:** delegates to the existing Perry-DMS pseudosite engine (`pen_stack.bridge.offtarget`).
|
|
@@ -22,11 +29,15 @@ candidate ENUMERATION needs the on-VM scan; this engine SCORES + RANKS + risk-ba
|
|
|
22
29
|
|
|
23
30
|
## The benchmark (E-G2, real data + real tool)
|
|
24
31
|
|
|
25
|
-
`benchmarks/offtarget/` is a held-out-guide nomination benchmark over
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
the
|
|
29
|
-
|
|
32
|
+
`benchmarks/offtarget/` is a held-out-guide nomination benchmark over **four** unbiased assays — GUIDE-seq +
|
|
33
|
+
CIRCLE-seq (canonical guides) and CHANGE-seq + SITE-seq (**independent broad guide panels**, a cross-assay test).
|
|
34
|
+
The licensed **CRISOT-Score** predictor (CC-BY-NC, run on the VM; MD-physics and **assay-agnostic** → leakage-clean)
|
|
35
|
+
beats the sequence-homology baseline on **all four** — AUPRC 0.65/0.52/0.54/0.52 vs 0.47/0.27/0.25/0.23, with the
|
|
36
|
+
per-guide bootstrap CI on the gap excluding 0 on each. The Off-Target-Bench also contributes a nomination task to the
|
|
37
|
+
**Genome-Writing Challenge**. Only derived CRISOT scores are cached/committed; the weights are never redistributed.
|
|
38
|
+
A genomic-coordinate locus split is not possible (the harmonized data ships sequences, not coordinates) — held-out-
|
|
39
|
+
guide + cross-assay is the leakage-clean evaluation. See `docs/cards/offtarget_data.md` and
|
|
40
|
+
`docs/DEVIATIONS_AND_DISCLOSURES.md` for full provenance and disclosed plan deviations.
|
|
30
41
|
|
|
31
42
|
## Validation-assay recommendation (`pen_stack/wgenome/offtarget_assay.py`)
|
|
32
43
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""PEN-STACK v3.0 - open infrastructure for genome writing."""
|
|
2
|
-
__version__ = "6.10.
|
|
2
|
+
__version__ = "6.10.2"
|
|
@@ -6,13 +6,16 @@ protein itself is immunogenic** (Cas9 elicits MHC-II-presented CD4 responses, Si
|
|
|
6
6
|
10.1038/s41467-021-25414-9; bridge recombinases / serine integrases are bacterial/phage) — yet Stage G scored
|
|
7
7
|
only the capsid. v6.9 adds an MHC-II epitope-load axis over the **writer** as a distinct antigen.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
PRODUCTION method (v6.9.1/6.9.2): the **real, licensed NetMHCIIpan-4.0** eluted-ligand %Rank over a frequent HLA-II
|
|
10
|
+
panel (residue-coverage metric), run on the VM with only the derived fractions cached (`configs/mhc_epitope_oracle.yaml`);
|
|
11
|
+
`mhc2_epitope_load(seq, name)` returns the real value for a cached antigen and otherwise **abstains** (no production
|
|
12
|
+
proxy). A population-level proxy (🟡), never a patient-HLA-specific magnitude (a known-unknown). Whether the epitopes
|
|
13
|
+
drive ADA depends on self-tolerance (foreign vs self) — handled in `ada_risk`.
|
|
14
|
+
|
|
15
|
+
OFFLINE-ONLY fallback (`mhc2_proxy_estimate`, NOT the production axis): a documented, dependency-free PROMISCUOUS-
|
|
16
|
+
binder density — MHC-II presents a 9-mer core in an open groove whose **P1 pocket** is the dominant hydrophobic
|
|
17
|
+
anchor (M/F/Y/W/L/I/V; Stern & Wiley, Nature 1994) with secondary pockets at P4/P6/P9 (Southwood 1998). Provided for
|
|
18
|
+
offline triage where NetMHCIIpan cannot be run; the production axis uses the real tool and abstains otherwise.
|
|
16
19
|
"""
|
|
17
20
|
from __future__ import annotations
|
|
18
21
|
|
|
@@ -75,8 +78,9 @@ def real_mhc2_load(name: str) -> dict | None:
|
|
|
75
78
|
"n_covered": rec.get("n_covered"), "length": rec.get("length"),
|
|
76
79
|
"method": f"NetMHCIIpan-4.0 EL %Rank<=2, {rec.get('metric', 'residue coverage')}, frequent HLA-II "
|
|
77
80
|
f"panel ({len(panel)} alleles): {', '.join(panel)}",
|
|
78
|
-
"status": "population-level (frequent-HLA panel; NetMHCIIpan-4.0 eluted-ligand),
|
|
79
|
-
"patient-HLA-specific
|
|
81
|
+
"status": "population-level (frequent-HLA panel; NetMHCIIpan-4.0 eluted-ligand), coverage-gated "
|
|
82
|
+
"(abstains for uncached antigens — NOT a distributional OOD gate); NOT a patient-HLA-specific "
|
|
83
|
+
"magnitude (known-unknown)", "backend": "netmhciipan_cache"}
|
|
80
84
|
|
|
81
85
|
|
|
82
86
|
def mhc2_epitope_load(seq: str, name: str | None = None) -> dict:
|
|
@@ -150,7 +150,8 @@ class PositionEffectModel:
|
|
|
150
150
|
lo, hi = self.conformal.interval(yhat, sigma=widen)
|
|
151
151
|
return {"yhat": yhat, "lo": lo, "hi": hi, "ood_widen": widen,
|
|
152
152
|
"nominal_coverage": 1 - self.conformal.alpha,
|
|
153
|
-
"interval_kind": "trained split-conformal (chromosome-Mondrian
|
|
153
|
+
"interval_kind": "trained split-conformal (chromosome-blocked OOF; per-chromosome Mondrian qhats "
|
|
154
|
+
"computed, GLOBAL qhat served — a query has no chromosome at serve time), OOD-widened"}
|
|
154
155
|
|
|
155
156
|
# ---- persistence ----------------------------------------------------------------------------
|
|
156
157
|
def save(self, path: str | Path) -> str:
|
|
@@ -96,9 +96,10 @@ AXIS_STATUS: dict[str, dict] = {
|
|
|
96
96
|
"rates (and induced post-dose-1 anti-PEG is a separate dynamic)."},
|
|
97
97
|
"mhc2_writer": { # v6.9 G-WS1 — CD4/MHC-II epitope load over the writer enzyme
|
|
98
98
|
"status": "mechanistic_proxy",
|
|
99
|
-
"label": "mhc2_writer:
|
|
100
|
-
"reason": "
|
|
101
|
-
"
|
|
99
|
+
"label": "mhc2_writer: population proxy — NOT outcome-validated",
|
|
100
|
+
"reason": "real NetMHCIIpan-4.0 eluted-ligand MHC-II epitope load over a frequent-HLA panel (v6.9.2; the "
|
|
101
|
+
"v6.9.0 P1-anchor proxy was replaced) — a population-level presentation potential, NOT a "
|
|
102
|
+
"patient-HLA-specific magnitude or an observed-ADA-validated number."},
|
|
102
103
|
"ada_writer": { # v6.9 G-WS2 — ADA-risk (MHC-II x foreignness, self-tolerance filtered)
|
|
103
104
|
"status": "mechanistic_proxy",
|
|
104
105
|
"label": "ada_writer: mechanistic/population proxy — NOT outcome-validated",
|
|
@@ -48,20 +48,51 @@ CANONICAL_GUIDES = {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
# ---- DERIVED, real-data risk calibration: empirical active fraction by mismatch count -----------
|
|
51
|
-
# (computed on the VM over ALL
|
|
52
|
-
#
|
|
51
|
+
# (computed on the VM over ALL candidates per assay; the off-target nomination risk band is grounded in how often a
|
|
52
|
+
# candidate at k mismatches was actually validated-active, not a guessed curve. Missing k -> abstain, not extrapolate.)
|
|
53
53
|
MISMATCH_ACTIVE_FRACTION = {
|
|
54
54
|
"guideseq": {0: 1.0, 1: 1.0, 2: 0.76471, 3: 0.23129, 4: 0.033, 5: 0.00276, 6: 0.00014},
|
|
55
55
|
"circleseq": {0: 1.0, 1: 1.0, 2: 1.0, 3: 0.67146, 4: 0.26566, 5: 0.05924, 6: 0.00985},
|
|
56
|
+
"changeseq": {0: 0.95, 2: 0.80851, 3: 0.56625, 4: 0.231, 5: 0.05505, 6: 0.00751},
|
|
57
|
+
"siteseq": {0: 1.0, 1: 1.0, 2: 1.0, 3: 0.67188, 4: 0.2491, 5: 0.03554, 6: 0.00478},
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# ---- chromatin-accessibility validation (v6.10.2): a CONTROLLED test of whether Stage B accessibility predicts
|
|
61
|
+
# off-target activity (Lazzarotto 2020). VERDICT: WEAK / INCONSISTENT -> NOT a validated quantitative axis.
|
|
62
|
+
# (off-targets mapped to hg38; AUROC of K562 accessibility for active-vs-inactive per assay; full result in
|
|
63
|
+
# benchmarks/offtarget/chromatin_validation.json). The in-vitro controls are ~null (method sound); GUIDE-seq is a
|
|
64
|
+
# textbook modest positive (0.58) but TTISS reverses (0.346) — the cross-cell-type K562 proxy is the likely cause.
|
|
65
|
+
CHROMATIN_VALIDATION = {
|
|
66
|
+
"verdict": "weak/inconsistent — NOT a validated quantitative axis on this data",
|
|
67
|
+
"auroc_accessibility_for_activity": {
|
|
68
|
+
"guideseq": {"modality": "cell-based", "auroc": 0.58, "ci95": [0.550, 0.613]},
|
|
69
|
+
"ttiss": {"modality": "cell-based", "auroc": 0.346, "ci95": [0.322, 0.368]},
|
|
70
|
+
"changeseq": {"modality": "in_vitro_control", "auroc": 0.496, "ci95": [0.480, 0.513]},
|
|
71
|
+
"circleseq": {"modality": "in_vitro_control", "auroc": 0.519, "ci95": [0.501, 0.535]},
|
|
72
|
+
"siteseq": {"modality": "in_vitro_control", "auroc": 0.469, "ci95": [0.452, 0.489]},
|
|
73
|
+
},
|
|
74
|
+
"validated": False,
|
|
75
|
+
"note": "documented biological effect (Lazzarotto 2020); on our cross-cell-type data the signal is weak and "
|
|
76
|
+
"inconsistent (GUIDE-seq 0.58 supports it, TTISS 0.346 contradicts, in-vitro controls ~null). Used as a "
|
|
77
|
+
"qualitative annotation only — it does NOT change the numeric risk score. A cell-type-matched "
|
|
78
|
+
"accessibility track would be needed to settle it.",
|
|
56
79
|
}
|
|
57
80
|
|
|
58
81
|
# ---- Off-Target-Bench headline (REAL full-data result; per-guide AUPRC, held-out-guide bootstrap CI) -----
|
|
82
|
+
# CRISOT-Score is the MD-physics, assay-AGNOSTIC scorer (not fit on these labels) -> a leakage-clean held-out
|
|
83
|
+
# evaluation on every assay. GUIDE/CIRCLE-seq use canonical guides; CHANGE/SITE-seq use INDEPENDENT broad guide
|
|
84
|
+
# panels (cross-assay generalization). CRISOT beats the homology baseline on ALL FOUR (per-guide bootstrap CI > 0).
|
|
59
85
|
BENCH_SUMMARY = {
|
|
60
|
-
"guideseq": {"n_guides": 8, "crisot_auprc": 0.6458, "homology_auprc": 0.4668,
|
|
61
|
-
"auprc_gap": 0.179, "gap_ci95": [0.
|
|
62
|
-
"circleseq": {"n_guides": 8, "crisot_auprc": 0.5197, "homology_auprc": 0.2664,
|
|
63
|
-
"auprc_gap": 0.2533, "gap_ci95": [0.
|
|
64
|
-
"
|
|
86
|
+
"guideseq": {"n_guides": 8, "guide_panel": "canonical", "crisot_auprc": 0.6458, "homology_auprc": 0.4668,
|
|
87
|
+
"auprc_gap": 0.179, "gap_ci95": [0.0136, 0.3292], "crisot_beats_homology": True},
|
|
88
|
+
"circleseq": {"n_guides": 8, "guide_panel": "canonical", "crisot_auprc": 0.5197, "homology_auprc": 0.2664,
|
|
89
|
+
"auprc_gap": 0.2533, "gap_ci95": [0.1463, 0.3704], "crisot_beats_homology": True},
|
|
90
|
+
"changeseq": {"n_guides": 20, "guide_panel": "independent_broad", "crisot_auprc": 0.541, "homology_auprc": 0.2486,
|
|
91
|
+
"auprc_gap": 0.2924, "gap_ci95": [0.2349, 0.3477], "crisot_beats_homology": True},
|
|
92
|
+
"siteseq": {"n_guides": 11, "guide_panel": "independent_broad", "crisot_auprc": 0.5207, "homology_auprc": 0.2332,
|
|
93
|
+
"auprc_gap": 0.2874, "gap_ci95": [0.2388, 0.3354], "crisot_beats_homology": True},
|
|
94
|
+
"metric": "per-guide AUPRC; baseline = ascending mismatch count; learned = real CRISOT-Score (assay-agnostic, "
|
|
95
|
+
"VM, cached); CRISOT beats homology on all 4 assays (bootstrap CI excludes 0)",
|
|
65
96
|
}
|
|
66
97
|
|
|
67
98
|
|