pen-stack 6.10.1__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.1 → pen_stack-6.10.2}/CHANGELOG.md +25 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/CITATION.cff +1 -1
- {pen_stack-6.10.1 → pen_stack-6.10.2}/PKG-INFO +2 -2
- {pen_stack-6.10.1 → pen_stack-6.10.2}/README.md +1 -1
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/DEVIATIONS_AND_DISCLOSURES.md +1 -1
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/cards/offtarget_data.md +21 -5
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/offtarget.md +5 -1
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/__init__.py +1 -1
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/offtarget_data.py +21 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/offtarget_predict.py +15 -13
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack.egg-info/PKG-INFO +2 -2
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack.egg-info/SOURCES.txt +1 -0
- {pen_stack-6.10.1 → 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.1 → pen_stack-6.10.2}/LICENSE +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/MANIFEST.in +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/bench/run.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/benchmarks/genome_writing_bench/README.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/benchmarks/genome_writing_challenge/README.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/benchmarks/offtarget/SHA256SUMS +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/benchmarks/position_effect/README.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/benchmarks/position_effect/SHA256SUMS +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/benchmarks/writer_efficiency/README.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/benchmarks/writer_efficiency/SHA256SUMS +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/antipeg.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/atlas_families.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/bridge_offtarget_profile.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/calibration/preexisting_nab_independent.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/capsid_epitope_oracle.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/capsid_sequences.fasta +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/cargo_polish.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/cell_types.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/datasets.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/delivery_constraints.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/delivery_rules.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/delivery_vehicles.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/expression/modifiers.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/expression/promoters.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/gates_v3.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/genotoxicity_oracle.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/gsh_validated_heldout.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/intent_weights.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/known_unknowns.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/llm.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/metric_guide.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/mhc_epitope_oracle.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/monitor_queries.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/oracles/execution.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/oracles/scope_cards.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/rules/delivery.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/rules/fold.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/rules/multiplex.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/rules/payload.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/rules/reachability.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/safety/hazard_registry.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/safety/policy.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/safety/probes.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/score_axes.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/seroprevalence.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/target_sites.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/universe_crosswalk.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/write_types.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/writer_sequences.fasta +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/configs/wtkb_curated.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/data/curated/bridge_offtarget_energetics.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/data/curated/gene_coords.parquet +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/data/curated/unified_editor_universe.parquet +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/BACKLOG.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/DEPLOY.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/INFRA.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/MCP.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/RELEASING.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/REPRO.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/STABILITY.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/agent.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/alphagenome_feasibility.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/autonomy.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/benchmark_circularity.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/biosecurity.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/build_interface.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/cards/atlas.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/cards/durability.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/cards/position_effect_data.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/cards/safety.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/cards/writer_efficiency_data.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/challenge.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/closed_loop.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/co_scientist.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/co_scientist_loop.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/delivery.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/delivery_immunology.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/digital_twin.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/dissemination.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/environment.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/experiment_design.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/generative_design.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/immune_profiler.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/index.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/integrations.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/live_oracles.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/mechanistic_constraints.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/oracles.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/position_effect.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/positioning.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/private_data_formats.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/quickstart.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/responsible_use.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/rules.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/scope.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/scorecard.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/tpe_bench.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/tutorials/compare-families.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/tutorials/score-deliverability.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/tutorials/where-can-i-write.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/tutorials/which-writer-reaches-locus.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/uncertainty.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/verify.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/world_model.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/writer_efficiency.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/writer_verification.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/docs/wtkb.md +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/_resources.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/active/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/active/acquire.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/active/design.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/active/validate.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/adapt/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/adapt/finetune.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/adapt/ingest.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/adapt/pipeline.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/adapt/recalibrate.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/adapt/report.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/agent/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/agent/cite.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/agent/co_scientist.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/agent/epistemic.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/agent/guardrails.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/agent/mcp_server.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/agent/orchestrator.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/agent/orchestrator_live.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/agent/pen_agent.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/agent/scope.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/agent/tools.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/api/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/api/manifest.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/atlas/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/atlas/build_wtkb.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/atlas/crosslink.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/atlas/expand.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/atlas/guide_design.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/atlas/schema.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/atlas/scorecard.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/atlas/universe.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/atlas/variant_propose.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/atlas/writer_efficiency.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/atlas/writer_predict.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/atlas/writer_recommend.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/atlas/writer_verify.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/bridge/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/bridge/activity.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/bridge/cli.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/bridge/fold_qc.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/bridge/guide_qc.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/bridge/ingest.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/bridge/offtarget.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/bridge/offtarget_energetics.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/bridge/ortholog_screen.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/bridge/pipeline.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/build/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/build/ingest.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/build/protocol.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/build/simlab.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/cli.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/data/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/data/encode.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/data/genome.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/data/ingest_chromatin.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/data/ingest_integration.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/data/ingest_safety_annot.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/data/ingest_trip.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/design/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/design/generate.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/design/pareto.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/design/space.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/design/writer_variants.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/env/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/env/genome_writing_env.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/env/policies.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/graph/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/graph/build.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/graph/cell_types.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/graph/ingest.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/graph/query.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/graph/schema.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/loop/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/loop/continual.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/loop/cycle.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/loop/drift.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/mech/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/mech/classify_atlas.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/mech/whitelist.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/monitor/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/monitor/europepmc.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/monitor/run.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/monitor/triage.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/oracles/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/oracles/cache.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/oracles/energetics.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/oracles/genome.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/oracles/protein_design.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/oracles/rna.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/oracles/schema.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/oracles/status.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/oracles/structure.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/oracles/vcell.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/ada_risk.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/antipeg_oracle.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/cargo.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/cargo_polish.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/delivery.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/delivery_constraints.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/delivery_immunology.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/delivery_vehicles.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/genotoxicity_oracle.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/immune_mhc2.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/immune_profile.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/innate_sensing.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/multiplex.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/optimize.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/pipeline.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/report.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/router.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/seroprevalence_oracle.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/planner/target_site.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/rag/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/rag/index.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/rag/llm.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/rag/qa.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/rules/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/rules/evaluators.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/rules/loader.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/rules/schema.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/rules/solver.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/safety/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/safety/audit.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/safety/gate.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/safety/policy.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/safety/redteam.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/safety/registry.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/safety/screen.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/score/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/score/recalibrate.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/score/therapeutic.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/server/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/server/api.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/twin/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/twin/calibrate.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/twin/data/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/twin/data/position_effect.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/twin/mechanistic.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/twin/outcome.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/twin/position_effect.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/ui/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/ui/app.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/adapt_demo.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/agent_eval.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/bench_graph_tasks.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/bench_rule_tasks.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/bench_trust_tasks.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/bench_writetype_tasks.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/blind_gsh_discovery.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/cargo_directionality.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/closed_loop.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/durability_baselines.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/experiment_design.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/expr_controls.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/forward_hypotheses.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/generative_design.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/guide_qc_demo.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/heldout_celltype_expr.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/immune_calibration.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/intent_specification.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/known_biology_expr.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/out_of_scope_refusal.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/outcome_calibration.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/outcome_prediction.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/paper3_benchmark.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/paper4_real_validation.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/paper4_validation.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/protocol_safety.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/safety_screening.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/selective_prediction.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/seq_vs_measured.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/target_site_controls.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/uncertainty_eval.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/ungrounded_baseline.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/within_locus_ranking.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/validate/writer_recovery.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/verify/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/verify/schema.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/verify/service.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/web/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/web/guide.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/web/llm.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/web/router.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/web/server.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/web/tools.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/__init__.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/chromatin_seq.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/durability.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/export_tracks.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/features.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/gsh_baseline.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/mesh_features.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/offtarget_assay.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/ood.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/providers.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/safety.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/structure3d.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/uncertainty.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack/wgenome/writability.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack.egg-info/dependency_links.txt +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack.egg-info/entry_points.txt +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack.egg-info/requires.txt +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/pen_stack.egg-info/top_level.txt +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_phase0.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_phase1_5.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_phase2.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_phase3.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_a.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_acq.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_b.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_ba.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_bench.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_c.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_cal.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_calib.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_chat.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_cite.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_continual.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_crit.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_ct.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_d.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_drift.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_e.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_env.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_ep.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_expr2.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_f.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_g.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_gen.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_graph.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_h.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_immune.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_immune2.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_innate.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_loop.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_mc.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_mech.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_mon.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_o.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_offtarget.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_orch.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_peg.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_plan.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_policy.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_profile.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_proto.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_r.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_route.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_screen.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_uq.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_v.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_writer.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/SHA256_LOCK_ws_wv.json +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/paper1.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/paper2.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/paper3.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/paper4.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/phase0.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_a.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_acq.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_aldesign.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_alvalidate.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_atlas.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_b.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_ba.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_ba_v33.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_ba_v45.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_bench.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_c.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_cal.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_calib.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_challenge.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_chat.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_cite.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_continual.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_cosci2.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_crit.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_ct.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_d.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_drift.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_e.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_env.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_ep.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_epitope.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_expr2.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_f.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_frontend.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_g.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_gen.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_genotox.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_graph.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_h.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_hybrid.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_immune.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_immune2.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_ingest.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_innate.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_loop.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_manifest.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_mc.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_mcp.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_mech.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_mon.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_o.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_offtarget.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_openapi.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_orch.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_outcome.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_pareto.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_peg.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_plan.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_policy.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_profile.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_proto.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_r.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_redteam.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_route.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_screen.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_seroprev.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_simlab.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_twincal.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_uq.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_v.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_vcell.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_writer.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/prereg/ws_wv.yaml +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/calibrate_immune_axes.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/fetch_licensed_sources.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/p1_build_atlas.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/p1_build_durability.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/p1_build_position_effect.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/p1_build_writer_eff.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/p1_export_tracks.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/p1_safety_concordance.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/p1_train_safety.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/p1_validation_report.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/p2_build_atlas.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/p3_benchmark_report.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/p4_genome_scan.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/p52_build_genotox_oracle.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/p53_build_epitope_oracle.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/ws_b_report.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/scripts/ws_c_report.py +0 -0
- {pen_stack-6.10.1 → pen_stack-6.10.2}/setup.cfg +0 -0
|
@@ -3,6 +3,31 @@
|
|
|
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
|
+
|
|
6
31
|
## [6.10.1] - 2026-06-20 - WS-OFFTARGET rigor pass + retroactive honesty audit (v6.7–v6.9)
|
|
7
32
|
|
|
8
33
|
**PATCH — complete the Stage E plan and disclose every remaining deviation.** Closes the v6.10.0 gaps and adds a
|
|
@@ -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)
|
|
@@ -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)
|
|
@@ -16,7 +16,7 @@ applicable (e.g. single contributor).
|
|
|
16
16
|
|---|---|---|
|
|
17
17
|
| Nuclease predictor named in plan (CCLMoff / CRISMER) vs shipped (CRISOT) | **DISCLOSED** | We use **CRISOT-Score** (Chen 2023, CC-BY-NC, CPU), not the plan's CCLMoff/CRISMER. Justified: **CRISMER ships no license** (cannot be redistributed/wrapped); **CCLMoff** is a GPU RNA-language-model stack AND was trained on these very assays (evaluating it on them would be **leakage**), whereas **CRISOT-Score is MD-physics, assay-agnostic → a leakage-clean held-out evaluation**. CRISOT is the more rigorous and license-appropriate choice. A genuine substitution, disclosed. |
|
|
18
18
|
| Assay coverage (plan listed GUIDE/CIRCLE/CHANGE/SITE/SURRO/TTISS/Digenome-seq) | **FIXED (v6.10.1)** | v6.10.0 used GUIDE-seq + CIRCLE-seq only. v6.10.1 adds **CHANGE-seq + SITE-seq** (independent broad guide panels) — CRISOT beats homology on **all four** (per-guide bootstrap CI excludes 0). SURRO-seq is targeted/biased (kept as an orthogonal reference, not genome-wide truth); TTISS/Digenome-seq remain **DISCLOSED** as not-yet-folded-in. |
|
|
19
|
-
| "Chromatin-aware via the Stage B feature store" | **
|
|
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
20
|
| Held-out **guide** AND **locus** splits | **DISCLOSED** | Held-out-**guide** is implemented; a genomic-coordinate **locus** split is **not possible** — the harmonized assay data ships sequences, not coordinates. Instead we add **cross-assay generalization** (the assay-agnostic CRISOT-Score evaluated on GUIDE/CIRCLE canonical guides + CHANGE/SITE independent panels). This is the leakage-clean substitute and is stated in `benchmarks/offtarget/split.json`. |
|
|
21
21
|
| Learned **integrase** off-target scorer (plan: "learned on HIDE/Cryptic-seq") | **DISCLOSED** | Shipped as a documented **pseudo-attB cryptic scan** on the real Bxb1 attB core, not a learned model — Cryptic-seq/HIDE-seq are recent preprints and IntQuery has **no public weights**, so a real learned integrase predictor is not groundable. Flagged extrapolative; IntQuery cited as paper-only. |
|
|
22
22
|
| Bench "joins the Challenge" | **FIXED (v6.10.1)** | An `offtarget` nomination task is added to the Genome-Writing Challenge (`benchmarks/genome_writing_challenge/harness.py`) — non-circular (label = wet-lab Active call), data-gated on the fixture. |
|
|
@@ -41,13 +41,29 @@ evaluation on every assay.
|
|
|
41
41
|
The learned predictor beats the homology baseline on **all four** assays (per-guide bootstrap CI excludes 0),
|
|
42
42
|
including two independent broad guide panels (cross-assay generalization).
|
|
43
43
|
|
|
44
|
-
## Chromatin-accessibility modifier (honest scope)
|
|
44
|
+
## Chromatin-accessibility modifier (honest scope — tested, NOT validated)
|
|
45
45
|
The nominator applies a documented chromatin modifier (open chromatin raises realized off-target activity;
|
|
46
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
|
|
48
|
-
caller-supplied scalar; it **abstains** otherwise
|
|
49
|
-
|
|
50
|
-
|
|
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).
|
|
51
67
|
|
|
52
68
|
## Risk calibration (grounded)
|
|
53
69
|
The nomination risk band IS the empirical fraction of candidates at *k* mismatches that were validated-active
|
|
@@ -15,7 +15,11 @@ A nominated off-target is a candidate, and every result ships with the empirical
|
|
|
15
15
|
modifier** (open chromatin raises realized off-target activity; Lazzarotto 2020). The modifier reads the **real
|
|
16
16
|
Stage B accessibility track** (`phase_1/features/chromatin_{ct}.parquet`) when a candidate's genomic locus + cell
|
|
17
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).
|
|
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`.
|
|
19
23
|
- **Serine integrase (Bxb1):** a cryptic **pseudo-attB** scan that seeds on the *real documented* Bxb1 attB core
|
|
20
24
|
(`GCGGTCTC`, central GT; FlyBase FBto0000359, Ghosh 2003) and reports candidate cryptic sites by arm mismatches.
|
|
21
25
|
- **Bridge recombinase:** delegates to the existing Perry-DMS pseudosite engine (`pen_stack.bridge.offtarget`).
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""PEN-STACK v3.0 - open infrastructure for genome writing."""
|
|
2
|
-
__version__ = "6.10.
|
|
2
|
+
__version__ = "6.10.2"
|
|
@@ -57,6 +57,27 @@ MISMATCH_ACTIVE_FRACTION = {
|
|
|
57
57
|
"siteseq": {0: 1.0, 1: 1.0, 2: 1.0, 3: 0.67188, 4: 0.2491, 5: 0.03554, 6: 0.00478},
|
|
58
58
|
}
|
|
59
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.",
|
|
79
|
+
}
|
|
80
|
+
|
|
60
81
|
# ---- Off-Target-Bench headline (REAL full-data result; per-guide AUPRC, held-out-guide bootstrap CI) -----
|
|
61
82
|
# CRISOT-Score is the MD-physics, assay-AGNOSTIC scorer (not fit on these labels) -> a leakage-clean held-out
|
|
62
83
|
# evaluation on every assay. GUIDE/CIRCLE-seq use canonical guides; CHANGE/SITE-seq use INDEPENDENT broad guide
|
|
@@ -98,26 +98,28 @@ def locus_accessibility(chrom: str, bin_idx: int, ct: str = "k562") -> dict | No
|
|
|
98
98
|
|
|
99
99
|
|
|
100
100
|
def _chromatin_modifier(accessibility: float | None = None, locus_acc: dict | None = None) -> dict | None:
|
|
101
|
-
"""Documented chromatin-accessibility
|
|
102
|
-
(Lazzarotto et al. 2020, CHANGE-seq, 10.1038/s41587-020-0555-7). Uses the REAL
|
|
103
|
-
(`locus_acc`) when available, else a caller-supplied 0..1 scalar; abstains (None) when
|
|
104
|
-
|
|
101
|
+
"""Documented chromatin-accessibility ANNOTATION (NOT a validated quantitative axis): open chromatin raises
|
|
102
|
+
realized off-target activity (Lazzarotto et al. 2020, CHANGE-seq, 10.1038/s41587-020-0555-7). Uses the REAL
|
|
103
|
+
Stage B accessibility (`locus_acc`) when available, else a caller-supplied 0..1 scalar; abstains (None) when
|
|
104
|
+
neither is given. It is QUALITATIVE and does NOT change the numeric risk score — a controlled test on our data
|
|
105
|
+
found the signal weak/inconsistent (see `offtarget_data.CHROMATIN_VALIDATION`)."""
|
|
106
|
+
val = {"validated_on_our_data": False, "validation": "weak/inconsistent (GUIDE-seq AUROC 0.58, TTISS 0.346, "
|
|
107
|
+
"in-vitro controls ~null; cross-cell-type proxy) — annotation only, does not change the risk score",
|
|
108
|
+
"doi": "10.1038/s41587-020-0555-7"}
|
|
105
109
|
if locus_acc is not None:
|
|
106
110
|
raises = bool(locus_acc.get("accessible"))
|
|
107
|
-
return {"raises_realized_risk": raises, "source": "stage_b_track",
|
|
111
|
+
return {**val, "raises_realized_risk": raises, "source": "stage_b_track",
|
|
108
112
|
"accessibility_signal": locus_acc.get("accessibility_signal"), "cell_type": locus_acc.get("cell_type"),
|
|
109
|
-
"effect": ("accessible (open) chromatin in this cell type -> realized off-target activity
|
|
110
|
-
"for the same sequence match (qualitative; Lazzarotto 2020)" if raises
|
|
111
|
-
else "inaccessible (closed) chromatin -> realized off-target activity
|
|
112
|
-
"doi": "10.1038/s41587-020-0555-7"}
|
|
113
|
+
"effect": ("accessible (open) chromatin in this cell type -> realized off-target activity tends "
|
|
114
|
+
"HIGHER for the same sequence match (qualitative; Lazzarotto 2020)" if raises
|
|
115
|
+
else "inaccessible (closed) chromatin -> realized off-target activity tends lower")}
|
|
113
116
|
if accessibility is None:
|
|
114
117
|
return None
|
|
115
118
|
acc = max(0.0, min(1.0, float(accessibility)))
|
|
116
119
|
raises = acc >= 0.5
|
|
117
|
-
return {"accessibility": round(acc, 3), "raises_realized_risk": raises, "source": "caller_supplied",
|
|
118
|
-
"effect": ("open/accessible chromatin -> realized off-target activity
|
|
119
|
-
"Lazzarotto 2020)" if raises else "closed/inaccessible chromatin -> realized risk lower")
|
|
120
|
-
"doi": "10.1038/s41587-020-0555-7"}
|
|
120
|
+
return {**val, "accessibility": round(acc, 3), "raises_realized_risk": raises, "source": "caller_supplied",
|
|
121
|
+
"effect": ("open/accessible chromatin -> realized off-target activity tends HIGHER (qualitative; "
|
|
122
|
+
"Lazzarotto 2020)" if raises else "closed/inaccessible chromatin -> realized risk tends lower")}
|
|
121
123
|
|
|
122
124
|
|
|
123
125
|
def nominate_nuclease(guide: str, candidate_sites: list[str] | None, accessibility: list[float] | None = None,
|
|
@@ -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)
|
|
@@ -480,6 +480,7 @@ prereg/ws_writer.yaml
|
|
|
480
480
|
prereg/ws_wv.yaml
|
|
481
481
|
scripts/calibrate_immune_axes.py
|
|
482
482
|
scripts/fetch_licensed_sources.py
|
|
483
|
+
scripts/offtarget_chromatin_validation.py
|
|
483
484
|
scripts/p1_build_atlas.py
|
|
484
485
|
scripts/p1_build_durability.py
|
|
485
486
|
scripts/p1_build_position_effect.py
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pen-stack"
|
|
7
|
-
version = "6.10.
|
|
7
|
+
version = "6.10.2"
|
|
8
8
|
description = "Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"""Reproducible analysis (v6.10.2): does chromatin accessibility predict off-target activity? (Lazzarotto 2020).
|
|
2
|
+
|
|
3
|
+
Run on the VM (needs hg38 GRCh38.fa, the Stage B chromatin_{ct}.parquet, and the harmonized assay CSVs). Maps each
|
|
4
|
+
off-target protospacer to hg38 coordinates by exact match on both strands (grep -F, one genome pass), intersects with
|
|
5
|
+
the Stage B K562 ATAC/DNase accessibility at 1 kb bins, and computes the AUROC of accessibility for active-vs-inactive
|
|
6
|
+
off-targets PER ASSAY. Cell-based assays (GUIDE-seq, TTISS) are the test; in-vitro assays (CHANGE/CIRCLE/SITE-seq) are
|
|
7
|
+
the NEGATIVE control (cell-free -> no chromatin -> accessibility should not discriminate). Writes the result JSON.
|
|
8
|
+
|
|
9
|
+
RESULT (committed in benchmarks/offtarget/chromatin_validation.json): WEAK / INCONSISTENT — the in-vitro controls are
|
|
10
|
+
~0.5 (method sound), GUIDE-seq is a textbook modest positive (0.58) but TTISS reverses (0.346); the cross-cell-type
|
|
11
|
+
K562 accessibility proxy is the likely cause. Chromatin is therefore a documented annotation, NOT a validated axis.
|
|
12
|
+
|
|
13
|
+
Usage (on the VM, inside a container with pandas+numpy):
|
|
14
|
+
FA=.../GRCh38.fa CHROM=.../chromatin_k562.parquet DS=.../datasets python offtarget_chromatin_validation.py
|
|
15
|
+
"""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import collections
|
|
19
|
+
import json
|
|
20
|
+
import os
|
|
21
|
+
import subprocess
|
|
22
|
+
|
|
23
|
+
import numpy as np
|
|
24
|
+
import pandas as pd
|
|
25
|
+
|
|
26
|
+
FA = os.environ.get("FA", "/data/genomes/GRCh38.fa")
|
|
27
|
+
CHROM = os.environ.get("CHROM", "/data/chromatin_k562.parquet")
|
|
28
|
+
DS = os.environ.get("DS", "/data/datasets")
|
|
29
|
+
COMP = str.maketrans("ACGT", "TGCA")
|
|
30
|
+
ASSAYS = {"guideseq": "cell-based", "ttiss": "cell-based", "changeseq": "in_vitro_control",
|
|
31
|
+
"circleseq_all": "in_vitro_control", "siteseq": "in_vitro_control"}
|
|
32
|
+
VALID = {f"chr{i}" for i in list(range(1, 23)) + ["X", "Y"]}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def rc(s: str) -> str:
|
|
36
|
+
return s.translate(COMP)[::-1]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def auroc(y, s):
|
|
40
|
+
y = np.asarray(y)
|
|
41
|
+
s = np.asarray(s, float)
|
|
42
|
+
n1, n0 = int(y.sum()), int((1 - y).sum())
|
|
43
|
+
if n1 == 0 or n0 == 0:
|
|
44
|
+
return None, n1, n0
|
|
45
|
+
order = np.argsort(s)
|
|
46
|
+
ranks = np.empty(len(s))
|
|
47
|
+
ranks[order] = np.arange(1, len(s) + 1)
|
|
48
|
+
d = collections.defaultdict(list)
|
|
49
|
+
for i, v in enumerate(s):
|
|
50
|
+
d[v].append(i)
|
|
51
|
+
for _v, idxs in d.items():
|
|
52
|
+
rr = np.mean([ranks[i] for i in idxs])
|
|
53
|
+
for i in idxs:
|
|
54
|
+
ranks[i] = rr
|
|
55
|
+
return float((ranks[y == 1].sum() - n1 * (n1 + 1) / 2) / (n1 * n0)), n1, n0
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def main() -> dict:
|
|
59
|
+
rng = np.random.RandomState(7)
|
|
60
|
+
frames = []
|
|
61
|
+
for tag in ASSAYS:
|
|
62
|
+
df = pd.read_csv(f"{DS}/{tag}.csv")
|
|
63
|
+
df["assay"] = tag.replace("_all", "")
|
|
64
|
+
inact = df[df["Active"] == 0]
|
|
65
|
+
frames.append(pd.concat([df[df["Active"] == 1], inact.sample(n=min(1500, len(inact)), random_state=rng)]))
|
|
66
|
+
sub = pd.concat(frames).reset_index(drop=True)
|
|
67
|
+
sub["off23"] = sub["Off"].str[:23]
|
|
68
|
+
pat_map = {}
|
|
69
|
+
for off in sub["off23"].unique():
|
|
70
|
+
if len(off) == 23 and set(off) <= set("ACGT"):
|
|
71
|
+
pat_map[off] = off
|
|
72
|
+
pat_map[rc(off)] = off
|
|
73
|
+
open("/tmp/pats.txt", "w").write("\n".join(pat_map) + "\n")
|
|
74
|
+
hits: dict = {}
|
|
75
|
+
cur, buf = None, []
|
|
76
|
+
|
|
77
|
+
def flush(chrom, seq):
|
|
78
|
+
c = chrom if chrom and chrom.startswith("chr") else f"chr{chrom}"
|
|
79
|
+
if not seq or c not in VALID:
|
|
80
|
+
return
|
|
81
|
+
open("/tmp/chr.txt", "w").write(seq)
|
|
82
|
+
p = subprocess.run(["grep", "-boFf", "/tmp/pats.txt", "/tmp/chr.txt"], capture_output=True, text=True)
|
|
83
|
+
for ln in p.stdout.splitlines():
|
|
84
|
+
off_b, _, matched = ln.partition(":")
|
|
85
|
+
fwd = pat_map.get(matched)
|
|
86
|
+
if fwd:
|
|
87
|
+
hits.setdefault(fwd, []).append((c, int(off_b)))
|
|
88
|
+
with open(FA) as fh:
|
|
89
|
+
for line in fh:
|
|
90
|
+
if line.startswith(">"):
|
|
91
|
+
if cur:
|
|
92
|
+
flush(cur, "".join(buf))
|
|
93
|
+
cur, buf = line[1:].split()[0], []
|
|
94
|
+
else:
|
|
95
|
+
buf.append(line.strip().upper())
|
|
96
|
+
if cur:
|
|
97
|
+
flush(cur, "".join(buf))
|
|
98
|
+
cdf = pd.read_parquet(CHROM)
|
|
99
|
+
cdf["acc"] = cdf[["atac", "dnase"]].max(axis=1)
|
|
100
|
+
acc_idx = {(c, int(b)): float(a) for c, b, a in zip(cdf["chrom"], cdf["bin"], cdf["acc"])}
|
|
101
|
+
sub["acc"] = sub["off23"].map(lambda o: max(
|
|
102
|
+
[acc_idx.get((c, p // 1000)) for c, p in hits.get(o, []) if acc_idx.get((c, p // 1000)) is not None] or [np.nan]))
|
|
103
|
+
mp = sub.dropna(subset=["acc"])
|
|
104
|
+
out = {}
|
|
105
|
+
for tag in {t.replace("_all", "") for t in ASSAYS}:
|
|
106
|
+
a = mp[mp["assay"] == tag]
|
|
107
|
+
au, n1, n0 = auroc(a["Active"].values, a["acc"].values)
|
|
108
|
+
out[tag] = {"modality": ASSAYS.get(tag, ASSAYS.get(tag + "_all")), "auroc": au if au is None else round(au, 3),
|
|
109
|
+
"actives": n1, "inactives": n0}
|
|
110
|
+
print(json.dumps(out, indent=2))
|
|
111
|
+
return out
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
if __name__ == "__main__":
|
|
115
|
+
main()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pen_stack-6.10.1 → pen_stack-6.10.2}/data/curated/bridge_offtarget_profile_measured.parquet
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|