pen-stack 6.7.0__tar.gz → 6.8.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pen_stack-6.7.0 → pen_stack-6.8.0}/CHANGELOG.md +41 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/CITATION.cff +2 -2
- {pen_stack-6.7.0 → pen_stack-6.8.0}/PKG-INFO +28 -2
- {pen_stack-6.7.0 → pen_stack-6.8.0}/README.md +27 -1
- pen_stack-6.8.0/benchmarks/writer_efficiency/README.md +54 -0
- pen_stack-6.8.0/benchmarks/writer_efficiency/SHA256SUMS +2 -0
- pen_stack-6.8.0/docs/cards/writer_efficiency_data.md +48 -0
- pen_stack-6.8.0/docs/writer_efficiency.md +59 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/__init__.py +1 -1
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/api/manifest.py +4 -0
- pen_stack-6.8.0/pen_stack/atlas/guide_design.py +148 -0
- pen_stack-6.8.0/pen_stack/atlas/writer_efficiency.py +184 -0
- pen_stack-6.8.0/pen_stack/atlas/writer_predict.py +225 -0
- pen_stack-6.8.0/pen_stack/atlas/writer_recommend.py +103 -0
- pen_stack-6.8.0/pen_stack/design/writer_variants.py +121 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack.egg-info/PKG-INFO +28 -2
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack.egg-info/SOURCES.txt +12 -0
- pen_stack-6.8.0/prereg/SHA256_LOCK_ws_writer.json +8 -0
- pen_stack-6.8.0/prereg/ws_writer.yaml +43 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pyproject.toml +1 -1
- pen_stack-6.8.0/scripts/p1_build_writer_eff.py +66 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/LICENSE +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/MANIFEST.in +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/bench/run.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/benchmarks/genome_writing_bench/README.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/benchmarks/genome_writing_challenge/README.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/benchmarks/position_effect/README.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/benchmarks/position_effect/SHA256SUMS +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/antipeg.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/atlas_families.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/bridge_offtarget_profile.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/calibration/preexisting_nab_independent.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/capsid_epitope_oracle.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/capsid_sequences.fasta +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/cargo_polish.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/cell_types.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/datasets.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/delivery_constraints.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/delivery_rules.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/delivery_vehicles.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/expression/modifiers.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/expression/promoters.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/gates_v3.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/genotoxicity_oracle.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/gsh_validated_heldout.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/intent_weights.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/known_unknowns.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/llm.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/metric_guide.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/monitor_queries.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/oracles/execution.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/oracles/scope_cards.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/rules/delivery.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/rules/fold.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/rules/multiplex.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/rules/payload.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/rules/reachability.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/safety/hazard_registry.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/safety/policy.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/safety/probes.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/score_axes.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/seroprevalence.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/target_sites.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/universe_crosswalk.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/write_types.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/configs/wtkb_curated.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/data/curated/bridge_offtarget_energetics.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/data/curated/gene_coords.parquet +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/data/curated/unified_editor_universe.parquet +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/BACKLOG.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/DEPLOY.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/INFRA.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/MCP.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/RELEASING.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/REPRO.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/STABILITY.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/agent.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/alphagenome_feasibility.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/autonomy.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/benchmark_circularity.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/biosecurity.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/build_interface.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/cards/atlas.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/cards/durability.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/cards/position_effect_data.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/cards/safety.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/challenge.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/closed_loop.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/co_scientist.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/co_scientist_loop.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/delivery.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/delivery_immunology.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/digital_twin.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/dissemination.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/environment.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/experiment_design.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/generative_design.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/index.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/integrations.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/live_oracles.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/mechanistic_constraints.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/oracles.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/position_effect.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/positioning.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/private_data_formats.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/quickstart.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/responsible_use.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/rules.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/scope.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/scorecard.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/tpe_bench.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/tutorials/compare-families.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/tutorials/score-deliverability.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/tutorials/where-can-i-write.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/uncertainty.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/verify.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/world_model.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/writer_verification.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/docs/wtkb.md +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/_resources.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/active/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/active/acquire.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/active/design.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/active/validate.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/adapt/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/adapt/finetune.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/adapt/ingest.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/adapt/pipeline.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/adapt/recalibrate.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/adapt/report.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/agent/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/agent/cite.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/agent/co_scientist.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/agent/epistemic.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/agent/guardrails.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/agent/mcp_server.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/agent/orchestrator.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/agent/orchestrator_live.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/agent/pen_agent.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/agent/scope.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/agent/tools.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/api/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/atlas/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/atlas/build_wtkb.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/atlas/crosslink.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/atlas/expand.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/atlas/schema.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/atlas/scorecard.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/atlas/universe.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/atlas/variant_propose.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/atlas/writer_verify.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/bridge/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/bridge/activity.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/bridge/cli.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/bridge/fold_qc.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/bridge/guide_qc.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/bridge/ingest.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/bridge/offtarget.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/bridge/ortholog_screen.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/bridge/pipeline.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/build/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/build/ingest.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/build/protocol.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/build/simlab.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/cli.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/data/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/data/encode.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/data/genome.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/data/ingest_chromatin.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/data/ingest_integration.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/data/ingest_safety_annot.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/data/ingest_trip.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/design/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/design/generate.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/design/pareto.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/design/space.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/env/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/env/genome_writing_env.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/env/policies.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/graph/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/graph/build.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/graph/cell_types.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/graph/ingest.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/graph/query.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/graph/schema.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/loop/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/loop/continual.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/loop/cycle.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/loop/drift.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/mech/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/mech/classify_atlas.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/mech/whitelist.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/monitor/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/monitor/europepmc.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/monitor/run.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/monitor/triage.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/oracles/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/oracles/cache.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/oracles/energetics.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/oracles/genome.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/oracles/protein_design.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/oracles/rna.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/oracles/schema.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/oracles/status.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/oracles/structure.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/oracles/vcell.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/antipeg_oracle.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/cargo.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/cargo_polish.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/delivery.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/delivery_constraints.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/delivery_immunology.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/delivery_vehicles.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/genotoxicity_oracle.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/immune_profile.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/innate_sensing.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/multiplex.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/optimize.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/pipeline.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/report.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/router.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/seroprevalence_oracle.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/planner/target_site.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/rag/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/rag/index.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/rag/llm.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/rag/qa.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/rules/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/rules/evaluators.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/rules/loader.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/rules/schema.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/rules/solver.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/safety/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/safety/audit.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/safety/gate.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/safety/policy.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/safety/redteam.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/safety/registry.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/safety/screen.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/score/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/score/recalibrate.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/score/therapeutic.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/server/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/server/api.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/twin/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/twin/calibrate.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/twin/data/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/twin/data/position_effect.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/twin/mechanistic.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/twin/outcome.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/twin/position_effect.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/ui/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/ui/app.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/adapt_demo.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/agent_eval.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/cargo_directionality.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/closed_loop.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/durability_baselines.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/experiment_design.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/expr_controls.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/forward_hypotheses.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/generative_design.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/guide_qc_demo.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/heldout_celltype_expr.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/immune_calibration.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/intent_specification.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/known_biology_expr.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/outcome_calibration.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/outcome_prediction.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/paper3_benchmark.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/paper4_real_validation.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/paper4_validation.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/protocol_safety.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/safety_screening.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/selective_prediction.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/seq_vs_measured.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/target_site_controls.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/uncertainty_eval.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/within_locus_ranking.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/validate/writer_recovery.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/verify/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/verify/schema.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/verify/service.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/web/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/web/guide.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/web/llm.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/web/router.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/web/server.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/web/tools.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/wgenome/__init__.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/wgenome/durability.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/wgenome/export_tracks.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/wgenome/features.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/wgenome/mesh_features.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/wgenome/ood.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/wgenome/providers.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/wgenome/safety.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/wgenome/structure3d.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/wgenome/uncertainty.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack/wgenome/writability.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack.egg-info/dependency_links.txt +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack.egg-info/entry_points.txt +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack.egg-info/requires.txt +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/pen_stack.egg-info/top_level.txt +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_phase0.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_phase2.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_phase3.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_acq.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_calib.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_chat.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_continual.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_drift.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_expr2.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_gen.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_loop.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_mech.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_orch.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_peg.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_policy.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_profile.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_proto.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_screen.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/paper1.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/paper2.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/paper3.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/paper4.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/phase0.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_a.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_acq.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_aldesign.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_alvalidate.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_atlas.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_b.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_ba.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_ba_v33.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_ba_v45.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_bench.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_c.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_cal.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_calib.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_challenge.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_chat.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_cite.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_continual.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_cosci2.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_crit.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_ct.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_d.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_drift.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_e.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_env.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_ep.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_epitope.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_expr2.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_f.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_frontend.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_g.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_gen.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_genotox.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_graph.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_h.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_hybrid.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_immune.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_ingest.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_innate.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_loop.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_manifest.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_mc.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_mcp.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_mech.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_mon.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_o.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_openapi.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_orch.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_outcome.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_pareto.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_peg.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_plan.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_policy.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_profile.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_proto.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_r.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_redteam.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_route.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_screen.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_seroprev.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_simlab.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_twincal.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_uq.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_v.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_vcell.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/prereg/ws_wv.yaml +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/calibrate_immune_axes.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/fetch_licensed_sources.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/p1_build_atlas.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/p1_build_durability.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/p1_build_position_effect.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/p1_export_tracks.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/p1_safety_concordance.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/p1_train_safety.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/p1_validation_report.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/p2_build_atlas.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/p3_benchmark_report.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/p4_genome_scan.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/p52_build_genotox_oracle.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/p53_build_epitope_oracle.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/ws_b_report.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/scripts/ws_c_report.py +0 -0
- {pen_stack-6.7.0 → pen_stack-6.8.0}/setup.cfg +0 -0
|
@@ -3,6 +3,47 @@
|
|
|
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.8.0] - 2026-06-20 - PEN-WRITER: cross-family writer-efficiency engine + Writer-Efficiency Bench
|
|
7
|
+
|
|
8
|
+
**MINOR feature release.** Upgrades Stage C (pick the writer) from a curated-KB **ranking** to a prediction +
|
|
9
|
+
design layer: the first curated writer-efficiency benchmark + a learned cross-family efficiency predictor +
|
|
10
|
+
integrated guide/att design + serine-integrase variant critique. Wraps the Writer Atlas + v4.0 writer-verification.
|
|
11
|
+
No fabrication: every efficiency is a real published number with a DOI + verbatim quote.
|
|
12
|
+
|
|
13
|
+
### Added — the curated dataset + benchmark (WS-WRITER: C-WS1)
|
|
14
|
+
- `pen_stack/atlas/writer_efficiency.py` + `data/writer_efficiency.parquet` (SHA-locked) — ~45 records / 9 DOIs /
|
|
15
|
+
4 families, **each row DOI + verbatim quote + source-access grade** (39 pmc_verbatim, 1 abstract, 5 secondary).
|
|
16
|
+
Sources: PASTE (Yarnall *Nat Biotechnol* 2023), (ee)PASSIGE (Pandey/Liu *Nat Biomed Eng* 2025), hyperactive
|
|
17
|
+
integrases (Hew *Nucleic Acids Res* 2024 e64), evoCAST (*Science* 2025), ShCAST (*Science* 2019), enIS621
|
|
18
|
+
(*Nat Commun* 2026), ISCro4 (*Science*).
|
|
19
|
+
- `benchmarks/writer_efficiency/` — the Writer-Efficiency Bench: **sealed, SHA-locked** held-out-family +
|
|
20
|
+
held-out-locus tracks + baseline leaderboard + submission harness. `docs/cards/writer_efficiency_data.md`.
|
|
21
|
+
|
|
22
|
+
### Added — the learned predictor + the honest gate (C-WS2)
|
|
23
|
+
- `pen_stack/atlas/writer_predict.py` — interpretable-feature HistGradientBoosting + family-blocked split-conformal
|
|
24
|
+
interval, candidate-flagged. **Gate C-G2 (pre-registered):** beats the KB family-mean baseline on held-out
|
|
25
|
+
**locus** (MAE 11.7 vs 15.2, paired-bootstrap CI excludes 0; ρ +0.38 vs −0.26) and ranks families better on
|
|
26
|
+
held-out family (ρ +0.52 vs −0.20), but the held-out-**family** MAE gain is not significant at N=42/4-families →
|
|
27
|
+
**the KB ranking is retained as primary**, the predictor ships candidate-flagged, and the dataset + bench are the
|
|
28
|
+
contribution. The negative is reported, not hidden.
|
|
29
|
+
|
|
30
|
+
### Added — guide design + variant critique (C-WS3, C-WS4)
|
|
31
|
+
- `pen_stack/atlas/guide_design.py` — bridge-RNA TBL/DBL loops (Durrant 2024), pegRNA+attB (Yarnall 2023; Bxb1
|
|
32
|
+
core GT), orthogonal att-pair selection (Roelle 2023 GA/GT), with round-trip + invariant recovery tests.
|
|
33
|
+
- `pen_stack/design/writer_variants.py` — extends v4.0 writer-verification to serine-integrase hyperactive mutants
|
|
34
|
+
(Hew 2024 / Keravala 2009); recovers Bxb1 `c22` + PhiC31 P2/P3 retrospectively; honestly **defers** the
|
|
35
|
+
LM-vs-conservation blind claim (LM naturalness ≠ engineered hyperactivity).
|
|
36
|
+
|
|
37
|
+
### Added — the recommender surface (C-WS5)
|
|
38
|
+
- `pen_stack/atlas/writer_recommend.py` + manifest tool `recommend_writers` — ranks families (KB-grounded primary)
|
|
39
|
+
+ candidate predicted efficiency w/ conformal interval + auto-designed guide. Efficiency is **never** extrapolated
|
|
40
|
+
to a family absent from the dataset (KB-only there).
|
|
41
|
+
|
|
42
|
+
### Honesty
|
|
43
|
+
- Predicted efficiencies are 🔵 candidates with intervals, never asserted activity. 4 families is the binding
|
|
44
|
+
statistical limit, reported not hidden. Range efficiencies stored as midpoints (raw string retained);
|
|
45
|
+
secondary-source rows flagged + droppable (strict subset).
|
|
46
|
+
|
|
6
47
|
## [6.7.0] - 2026-06-19 - PEN-EXPRESS: learned, trained-conformal Stage H + TPE-Bench
|
|
7
48
|
|
|
8
49
|
**MINOR feature release.** Upgrades the digital twin's Stage H expression/outcome layer from a validation-failing
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
cff-version: 1.2.0
|
|
2
2
|
message: "If you use PEN-STACK, please cite it as below."
|
|
3
3
|
title: "PEN-STACK: open infrastructure for genome writing"
|
|
4
|
-
version: 6.
|
|
5
|
-
date-released: 2026-06-
|
|
4
|
+
version: 6.8.0
|
|
5
|
+
date-released: 2026-06-20
|
|
6
6
|
authors:
|
|
7
7
|
- family-names: "Mahaboob Ali"
|
|
8
8
|
given-names: "Anees Ahmed"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.8.0
|
|
4
4
|
Summary: Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner.
|
|
5
5
|
Author-email: Anees Ahmed Mahaboob Ali <ahmedaneesm@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -90,7 +90,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
90
90
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
91
91
|
[](LICENSE)
|
|
92
92
|
[](https://www.python.org/)
|
|
93
|
-
[](CHANGELOG.md)
|
|
94
94
|
[](docs/STABILITY.md)
|
|
95
95
|
[](tests/)
|
|
96
96
|
[](https://github.com/astral-sh/ruff)
|
|
@@ -148,6 +148,32 @@ demonstrated (v5.12) and the benchmark went public (v5.13).
|
|
|
148
148
|
> unknown funnel remains — made legible (scope flags, known-unknowns, honest baselines, no fabrication), not
|
|
149
149
|
> hidden.
|
|
150
150
|
|
|
151
|
+
## What is new in v6.8 — PEN-WRITER (a cross-family writer-efficiency engine + the first writer-efficiency benchmark)
|
|
152
|
+
|
|
153
|
+
Stage C (pick the writer) was **retrieval** — the curated Writer Atlas ranks 8 families but predicts no
|
|
154
|
+
**efficiency**, carries no uncertainty, and designs no guide. v6.8 adds the prediction + design layer, grounded in
|
|
155
|
+
the new quantitative human-cell writer data — **wrapping** the Atlas + v4.0 writer-verification, not rebuilding:
|
|
156
|
+
|
|
157
|
+
- **The first curated writer-efficiency dataset** (`data/writer_efficiency.parquet`, ~45 records / 9 DOIs / 4
|
|
158
|
+
families) — **every row carries a DOI + a verbatim source quote + a source-access grade** (39 PMC-verbatim).
|
|
159
|
+
Harmonised from PASTE (Yarnall 2023), (ee)PASSIGE (Pandey/Liu 2025), the Hew 2024 hyperactive-integrase tables,
|
|
160
|
+
evoCAST (2025), ShCAST (2019), enIS621 (2026), ISCro4. No number is invented.
|
|
161
|
+
- **A learned cross-family efficiency predictor** (`atlas/writer_predict.py`) with a conformal interval,
|
|
162
|
+
candidate-flagged. **Honest, pre-registered result:** it beats the KB family-mean baseline on held-out **locus**
|
|
163
|
+
(MAE 11.7 vs 15.2, CI excludes 0) and *ranks* families far better (ρ +0.52 vs −0.20), but at N=42 across only
|
|
164
|
+
**4 families** the held-out-**family** improvement is not significant — so the **KB ranking stays primary**, the
|
|
165
|
+
predictor ships as a **candidate advisory**, and the **dataset + benchmark are the contribution**.
|
|
166
|
+
- **The Writer-Efficiency Bench** (`benchmarks/writer_efficiency/`) — sealed, SHA-locked held-out-family +
|
|
167
|
+
held-out-locus tracks with a baseline leaderboard.
|
|
168
|
+
- **Guide/att design** (`atlas/guide_design.py`) — bridge-RNA TBL/DBL loops, pegRNA+attB (Bxb1 core GT), and
|
|
169
|
+
orthogonal att-pair selection (GA/GT), from the documented reprogramming rules, with round-trip recovery tests.
|
|
170
|
+
- **Writer-variant critique** (`design/writer_variants.py`) — extends v4.0 to the serine-integrase hyperactive
|
|
171
|
+
mutants (Bxb1 `c22`, PhiC31 P2/P3 evolved); recovers them retrospectively, and honestly **defers** the
|
|
172
|
+
LM-vs-conservation blind claim (protein-LM naturalness ≠ engineered gain-of-function hyperactivity).
|
|
173
|
+
|
|
174
|
+
Efficiencies are 🔵 candidates with intervals, never asserted activity; none is extrapolated to a family absent
|
|
175
|
+
from the dataset. See [docs/writer_efficiency.md](docs/writer_efficiency.md).
|
|
176
|
+
|
|
151
177
|
## What is new in v6.7 — PEN-EXPRESS (a learned, trained-conformal Stage H + TPE-Bench)
|
|
152
178
|
|
|
153
179
|
Stage H's expression/outcome layer was the stack's weakest link: a closed-form **heuristic** that *failed*
|
|
@@ -15,7 +15,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
15
15
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
16
16
|
[](LICENSE)
|
|
17
17
|
[](https://www.python.org/)
|
|
18
|
-
[](CHANGELOG.md)
|
|
19
19
|
[](docs/STABILITY.md)
|
|
20
20
|
[](tests/)
|
|
21
21
|
[](https://github.com/astral-sh/ruff)
|
|
@@ -73,6 +73,32 @@ demonstrated (v5.12) and the benchmark went public (v5.13).
|
|
|
73
73
|
> unknown funnel remains — made legible (scope flags, known-unknowns, honest baselines, no fabrication), not
|
|
74
74
|
> hidden.
|
|
75
75
|
|
|
76
|
+
## What is new in v6.8 — PEN-WRITER (a cross-family writer-efficiency engine + the first writer-efficiency benchmark)
|
|
77
|
+
|
|
78
|
+
Stage C (pick the writer) was **retrieval** — the curated Writer Atlas ranks 8 families but predicts no
|
|
79
|
+
**efficiency**, carries no uncertainty, and designs no guide. v6.8 adds the prediction + design layer, grounded in
|
|
80
|
+
the new quantitative human-cell writer data — **wrapping** the Atlas + v4.0 writer-verification, not rebuilding:
|
|
81
|
+
|
|
82
|
+
- **The first curated writer-efficiency dataset** (`data/writer_efficiency.parquet`, ~45 records / 9 DOIs / 4
|
|
83
|
+
families) — **every row carries a DOI + a verbatim source quote + a source-access grade** (39 PMC-verbatim).
|
|
84
|
+
Harmonised from PASTE (Yarnall 2023), (ee)PASSIGE (Pandey/Liu 2025), the Hew 2024 hyperactive-integrase tables,
|
|
85
|
+
evoCAST (2025), ShCAST (2019), enIS621 (2026), ISCro4. No number is invented.
|
|
86
|
+
- **A learned cross-family efficiency predictor** (`atlas/writer_predict.py`) with a conformal interval,
|
|
87
|
+
candidate-flagged. **Honest, pre-registered result:** it beats the KB family-mean baseline on held-out **locus**
|
|
88
|
+
(MAE 11.7 vs 15.2, CI excludes 0) and *ranks* families far better (ρ +0.52 vs −0.20), but at N=42 across only
|
|
89
|
+
**4 families** the held-out-**family** improvement is not significant — so the **KB ranking stays primary**, the
|
|
90
|
+
predictor ships as a **candidate advisory**, and the **dataset + benchmark are the contribution**.
|
|
91
|
+
- **The Writer-Efficiency Bench** (`benchmarks/writer_efficiency/`) — sealed, SHA-locked held-out-family +
|
|
92
|
+
held-out-locus tracks with a baseline leaderboard.
|
|
93
|
+
- **Guide/att design** (`atlas/guide_design.py`) — bridge-RNA TBL/DBL loops, pegRNA+attB (Bxb1 core GT), and
|
|
94
|
+
orthogonal att-pair selection (GA/GT), from the documented reprogramming rules, with round-trip recovery tests.
|
|
95
|
+
- **Writer-variant critique** (`design/writer_variants.py`) — extends v4.0 to the serine-integrase hyperactive
|
|
96
|
+
mutants (Bxb1 `c22`, PhiC31 P2/P3 evolved); recovers them retrospectively, and honestly **defers** the
|
|
97
|
+
LM-vs-conservation blind claim (protein-LM naturalness ≠ engineered gain-of-function hyperactivity).
|
|
98
|
+
|
|
99
|
+
Efficiencies are 🔵 candidates with intervals, never asserted activity; none is extrapolated to a family absent
|
|
100
|
+
from the dataset. See [docs/writer_efficiency.md](docs/writer_efficiency.md).
|
|
101
|
+
|
|
76
102
|
## What is new in v6.7 — PEN-EXPRESS (a learned, trained-conformal Stage H + TPE-Bench)
|
|
77
103
|
|
|
78
104
|
Stage H's expression/outcome layer was the stack's weakest link: a closed-form **heuristic** that *failed*
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Writer-Efficiency Bench
|
|
2
|
+
|
|
3
|
+
The **first curated, leakage-controlled benchmark for genome-writer integration efficiency** — the track of the
|
|
4
|
+
[Genome-Writing Challenge](../genome_writing_challenge/) for *how well a writer writes* (v6.8 PEN-WRITER). Given
|
|
5
|
+
`(family, write-type, cargo, locus, cell-type, variant)`, predict the **integration efficiency (%)**, scored on
|
|
6
|
+
**held-out family** and **held-out locus** folds.
|
|
7
|
+
|
|
8
|
+
## Why
|
|
9
|
+
|
|
10
|
+
Quantitative human-cell writer efficiencies exist but are **scattered** across a dozen papers with no unified
|
|
11
|
+
resource. This bench curates them (`data/writer_efficiency.parquet`, ~45 records, **every row carries a DOI + a
|
|
12
|
+
verbatim source quote + a source-access grade**) so others can build a calibrated efficiency predictor *to* it.
|
|
13
|
+
|
|
14
|
+
## Tracks (both leakage-controlled, leave-one-group-out)
|
|
15
|
+
|
|
16
|
+
| Axis | Held out | Why |
|
|
17
|
+
|---|---|---|
|
|
18
|
+
| `held_out_family` | one of {PE_integrase, serine_integrase, bridge_IS110, CAST_VK} | cross-family transfer — the hard axis |
|
|
19
|
+
| `held_out_locus` | one specific locus (excludes aggregate/genome-wide pseudo-loci) | locus-context generalisation |
|
|
20
|
+
|
|
21
|
+
## Baseline leaderboard (real, on the curated dataset)
|
|
22
|
+
|
|
23
|
+
| Axis (n) | KB family-mean (MAE / ρ) | **PEN-WRITER learned** (MAE / ρ) | MAE-reduction CI | learned wins? |
|
|
24
|
+
|---|---|---|---|---|
|
|
25
|
+
| held-out family (42) | 12.72 / −0.20 | **11.37 / +0.52** | [−1.09, 3.75] | no (CI includes 0) |
|
|
26
|
+
| held-out locus (35) | 15.23 / −0.26 | **11.71 / +0.38** | [0.42, 6.29] | **yes** (CI excludes 0) |
|
|
27
|
+
|
|
28
|
+
**Honest, pre-registered outcome (gate C-G2):** the learned predictor beats the KB family-mean baseline on
|
|
29
|
+
held-out **locus** (CI excludes 0) and **ranks** families far better (ρ +0.52 vs −0.20), but at N=42 across only
|
|
30
|
+
**4 families** the held-out-**family** MAE improvement is not statistically distinguishable from zero. So the **KB
|
|
31
|
+
ranking is retained as primary**, the learned predictor ships **candidate-flagged**, and the **curated dataset +
|
|
32
|
+
this benchmark are the standalone contribution** — not a manufactured win. Reproduce:
|
|
33
|
+
`python -c "from benchmarks.writer_efficiency.harness import baseline_leaderboard as b; print(b())"`.
|
|
34
|
+
|
|
35
|
+
## Submit
|
|
36
|
+
|
|
37
|
+
```python
|
|
38
|
+
from benchmarks.writer_efficiency.harness import Submission, evaluate
|
|
39
|
+
def predict(pi): # pi = {family, write_type, variant, cargo_bp, locus, cell_type, delivery}; label hidden
|
|
40
|
+
return {"efficiency_pct": 15.0}
|
|
41
|
+
print(evaluate(Submission("my-model", predict)))
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Discipline
|
|
45
|
+
|
|
46
|
+
- **Sealed + SHA-locked** — `split.json` + `data/writer_efficiency.parquet` are checksummed in `SHA256SUMS`.
|
|
47
|
+
- **Non-circular** — the label is the **measured published efficiency**, never a submitter claim.
|
|
48
|
+
- **Provenance per row** — DOI + verbatim quote + `source_access` ∈ {pmc_verbatim, abstract, secondary}; the
|
|
49
|
+
strict subset drops secondary-source rows.
|
|
50
|
+
- **Honest data-thinness** — 4 families is the binding limit; reported, not hidden.
|
|
51
|
+
|
|
52
|
+
Sources: PASTE (Yarnall *Nat Biotechnol* 2023), (ee)PASSIGE (Pandey/Liu *Nat Biomed Eng* 2025), hyperactive
|
|
53
|
+
integrases (Hew *Nucleic Acids Res* 2024), evoCAST (*Science* 2025), ShCAST (Strecker *Science* 2019), enIS621
|
|
54
|
+
(*Nat Commun* 2026), ISCro4 (*Science*). Full provenance: [data card](../../docs/cards/writer_efficiency_data.md).
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Data card — Writer-Efficiency dataset (v6.8 PEN-WRITER)
|
|
2
|
+
|
|
3
|
+
The curated, literature-sourced integration-efficiency table behind Stage C (`pen_stack/atlas/writer_efficiency.py`
|
|
4
|
+
→ `data/writer_efficiency.parquet`). One row = one **measured** integration-efficiency condition. **No fabrication:
|
|
5
|
+
every row carries a DOI, a verbatim source quote, and a source-access grade.**
|
|
6
|
+
|
|
7
|
+
## Schema
|
|
8
|
+
`system, family, write_type, variant, cargo_bp, locus, cell_type, organism, delivery, efficiency_pct,
|
|
9
|
+
efficiency_raw, specificity_pct, source_access, doi, quote`. `efficiency_pct` is % integration in the stated cell
|
|
10
|
+
type; ranges (e.g. "~10-20%", "4-22%") are stored as their **midpoint** with the raw string in `efficiency_raw`.
|
|
11
|
+
|
|
12
|
+
## Source-access grades (provenance quality, per row)
|
|
13
|
+
| Grade | Meaning | n |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `pmc_verbatim` | quoted from the open-access PMC full text (highest confidence) | 39 |
|
|
16
|
+
| `abstract` | quoted from the published abstract | 1 |
|
|
17
|
+
| `secondary` | reliable secondary source where the primary is paywalled (flagged; droppable via `strict=True`) | 5 |
|
|
18
|
+
|
|
19
|
+
## Coverage (~45 records, 42 human-cell, 9 DOIs, 4 families)
|
|
20
|
+
| Family | n | Representative systems |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| PE_integrase | 23 | PASTE, PASSIGE / evoPASSIGE / eePASSIGE |
|
|
23
|
+
| serine_integrase | 11 | Bxb1 (WT + evolved combination), PhiC31 (P2/P3 evolved), eeBxb1 V105I |
|
|
24
|
+
| bridge_IS110 | 6 | ISCro4, IS621 / enIS621 |
|
|
25
|
+
| CAST_VK | 5 | ShCAST (E. coli), PseCAST / evoCAST |
|
|
26
|
+
|
|
27
|
+
Loci: AAVS1, CCR5, ROSA26, ACTB, LMNB1, ALB, TRAC, GBA1, FANCA, B2M, COL7A1, Xq22.1, … · Cell types: HEK293T/FT,
|
|
28
|
+
K562, Jurkat, HepG2, N2a, iPSC, primary T / hepatocyte / fibroblast, E. coli.
|
|
29
|
+
|
|
30
|
+
## Primary sources (all citation-verified 2026-06-19)
|
|
31
|
+
| Source | DOI | Access |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| Yarnall et al., *Nat Biotechnol* 2023 (PASTE) | 10.1038/s41587-022-01527-4 | PMC10257351 (verbatim) |
|
|
34
|
+
| Pandey/Gao/Krasnow/Liu et al., *Nat Biomed Eng* 2025 ((ee)PASSIGE) | 10.1038/s41551-024-01227-1 | PMC11754103 (verbatim) |
|
|
35
|
+
| Hew et al., *Nucleic Acids Res* 2024 e64 (hyperactive integrases) | 10.1093/nar/gkae534 | PMC (verbatim) |
|
|
36
|
+
| evoCAST, *Science* 2025 | 10.1126/science.adt5199 | PMC12326709 (verbatim) |
|
|
37
|
+
| Strecker et al., *Science* 2019 (ShCAST) | 10.1126/science.aax9181 | PMC6659118 (verbatim) |
|
|
38
|
+
| enIS621, *Nat Commun* 2026 | 10.1038/s41467-026-74164-z | abstract (27.75%) + secondary (per-cell-type) |
|
|
39
|
+
| ISCro4, *Science* (Pelea adz1884 / Perry adz0276) | 10.1126/science.adz1884, 10.1126/science.adz0276 | secondary (paywalled) |
|
|
40
|
+
| Durrant et al., *Nature* 2024 (bridge RNA, IS621 in E. coli) | 10.1038/s41586-024-07552-4 | secondary |
|
|
41
|
+
|
|
42
|
+
## Honest limits
|
|
43
|
+
- **Small & literature-sourced.** ~42 human-cell records / 4 families — the binding statistical limit for the
|
|
44
|
+
cross-family transfer claim (reported, not hidden). The dataset + bench are the contribution.
|
|
45
|
+
- **Range-midpoint handling** for efficiencies reported as ranges (raw string retained).
|
|
46
|
+
- **Heterogeneous assays/conditions** across papers (delivery, cargo, pre-installed vs PE-installed att) — encoded
|
|
47
|
+
as features (`variant`, `delivery`, `cargo_bp`) + a covariate, but cross-paper variance is real.
|
|
48
|
+
- **secondary-source rows** (bridge ISCro4/IS621) are flagged and excluded under `strict=True`.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Stage C — the writer-efficiency engine (v6.8 PEN-WRITER)
|
|
2
|
+
|
|
3
|
+
Stage C picks the **writer** (the enzyme that writes). Through v6.7 this was the curated **Writer Atlas** — a
|
|
4
|
+
ranking, not a prediction. v6.8 adds a prediction + design layer, grounded in the new quantitative human-cell
|
|
5
|
+
writer data, **wrapping** the Atlas + v4.0 writer-verification.
|
|
6
|
+
|
|
7
|
+
## The curated writer-efficiency dataset (the contribution)
|
|
8
|
+
|
|
9
|
+
Quantitative writer efficiencies were scattered across a dozen papers with no unified resource.
|
|
10
|
+
`pen_stack/atlas/writer_efficiency.py` → `data/writer_efficiency.parquet` curates ~45 records across 4 families,
|
|
11
|
+
**every row carrying a DOI + a verbatim source quote + a source-access grade** (39 PMC-verbatim). See the
|
|
12
|
+
[data card](cards/writer_efficiency_data.md). No number is invented; ranges are stored as midpoints with the raw
|
|
13
|
+
string retained; secondary-source rows are flagged and droppable (`strict=True`).
|
|
14
|
+
|
|
15
|
+
## The learned predictor + the honest gate
|
|
16
|
+
|
|
17
|
+
`atlas/writer_predict.py` predicts integration **efficiency (%)** from interpretable features (family, variant-is-
|
|
18
|
+
evolved, log cargo, cell-type class, delivery) with a family-blocked **split-conformal** interval, candidate-flagged.
|
|
19
|
+
Evaluated leave-one-family-out **and** leave-one-locus-out vs the KB family-mean baseline:
|
|
20
|
+
|
|
21
|
+
| Axis (n) | KB family-mean (MAE / ρ) | **PEN-WRITER** (MAE / ρ) | MAE-reduction CI | wins? |
|
|
22
|
+
|---|---|---|---|---|
|
|
23
|
+
| held-out locus (35) | 15.2 / −0.26 | **11.7 / +0.38** | [0.42, 6.29] | **yes** (CI excludes 0) |
|
|
24
|
+
| held-out family (42) | 12.7 / −0.20 | **11.4 / +0.52** | [−1.09, 3.75] | no (CI includes 0) |
|
|
25
|
+
|
|
26
|
+
**Gate C-G2 (pre-registered):** a learned model becomes the *authoritative* ranking only if it beats the KB
|
|
27
|
+
baseline on **both** axes. It wins on locus and *ranks* families far better, but at N=42 across only **4 families**
|
|
28
|
+
the held-out-**family** MAE gain is not statistically distinguishable from zero. So the **KB ranking stays
|
|
29
|
+
primary**, the predictor ships as a **candidate advisory**, and the **dataset + benchmark are the standalone
|
|
30
|
+
contribution** — the honest, no-fabrication outcome (a negative is reported, not hidden).
|
|
31
|
+
|
|
32
|
+
## Guide / att design
|
|
33
|
+
|
|
34
|
+
`atlas/guide_design.py` auto-designs the targeting component from the documented reprogramming rules:
|
|
35
|
+
- **bridge RNA** (IS110/IS621) — target-binding + donor-binding loops, core-dinucleotide match enforced (Durrant 2024);
|
|
36
|
+
- **pegRNA + attB** (PASTE/PASSIGE) — writes a serine-integrase att (Bxb1 core **GT**) at the nick (Yarnall 2023);
|
|
37
|
+
- **orthogonal att pairs** — distinct central dinucleotides (**GA/GT**) for multiplexed landing pads (Roelle 2023).
|
|
38
|
+
|
|
39
|
+
Designs are 🔵 candidates requiring empirical validation; recovery tests check round-trip + documented invariants.
|
|
40
|
+
|
|
41
|
+
## Writer-variant critique
|
|
42
|
+
|
|
43
|
+
`design/writer_variants.py` extends v4.0 writer-verification to the **serine-integrase hyperactive mutants** (Hew
|
|
44
|
+
*Nucleic Acids Res* 2024 / Keravala 2009). It recovers Bxb1 `c22` (I87L/H95Y/V122M/A369P/E434G, 11.2× over WT) and
|
|
45
|
+
the PhiC31 P2/P3 evolved variants retrospectively, and honestly **defers** the LM-vs-conservation *blind* claim:
|
|
46
|
+
protein-LM naturalness need not recover engineered **gain-of-function** hyperactivity — reported as a limitation,
|
|
47
|
+
never a manufactured positive.
|
|
48
|
+
|
|
49
|
+
## The recommender surface
|
|
50
|
+
|
|
51
|
+
`atlas/writer_recommend.py` (manifest tool `recommend_writers`) ranks families by **KB readiness (grounded
|
|
52
|
+
primary)**, attaches a candidate predicted efficiency + conformal interval (only for families in the dataset —
|
|
53
|
+
never extrapolated), cargo-fit, and an auto-designed guide when sequences are supplied.
|
|
54
|
+
|
|
55
|
+
## Honest limits
|
|
56
|
+
- ~42 human-cell records / **4 families** — the binding statistical limit (reported, not hidden).
|
|
57
|
+
- Cross-paper assay/condition heterogeneity is real; encoded as features + a covariate.
|
|
58
|
+
- Predicted efficiencies are candidates, never measured-activity claims; the model artifact (`models/writer_eff.pkl`)
|
|
59
|
+
is gitignored and regenerated by `scripts/p1_build_writer_eff.py` (the dataset + the calibration are committed).
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""PEN-STACK v3.0 - open infrastructure for genome writing."""
|
|
2
|
-
__version__ = "6.
|
|
2
|
+
__version__ = "6.8.0"
|
|
@@ -42,6 +42,10 @@ _TOOLS = [
|
|
|
42
42
|
{"name": "challenge_evaluate", "summary": "score a submission on a held-out Genome-Writing Challenge round",
|
|
43
43
|
"input": "Submission + round_id", "output": "ChallengeResult",
|
|
44
44
|
"entrypoint": "benchmarks.genome_writing_challenge.harness.evaluate", "fabricates": False},
|
|
45
|
+
{"name": "recommend_writers", "summary": "rank writer families (KB-grounded primary) + candidate predicted "
|
|
46
|
+
"efficiency w/ conformal interval + auto-designed guide/att (v6.8 PEN-WRITER)",
|
|
47
|
+
"input": "write request (write-type, cargo, cell type, optional target/donor seq)", "output": "WriterRanking",
|
|
48
|
+
"entrypoint": "pen_stack.atlas.writer_recommend.recommend_writers", "fabricates": False},
|
|
45
49
|
]
|
|
46
50
|
|
|
47
51
|
_POLICY = ("outputs outside scope are returned as `out_of_scope` (known-unknown) or `extrapolating` (OOD) and are "
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""Guide / attachment-site design for genome writers (v6.8 PEN-WRITER, C-WS3).
|
|
2
|
+
|
|
3
|
+
Auto-designs the targeting component each writer family needs, from the DOCUMENTED reprogramming rules:
|
|
4
|
+
|
|
5
|
+
* **bridge RNA** (IS110 / IS621 / ISCro4) — a non-coding RNA with a **target-binding loop (TBL)** and a
|
|
6
|
+
**donor-binding loop (DBL)** that are reprogrammed independently to base-pair the target and donor, around a
|
|
7
|
+
conserved central **core dinucleotide** that must match between target and donor (Durrant et al., Nature 2024,
|
|
8
|
+
10.1038/s41586-024-07552-4). We compute the loop guide sequences (reverse-complement of the specificity arms,
|
|
9
|
+
core preserved) and validate by round-trip recovery.
|
|
10
|
+
* **pegRNA + attB** (PASTE / PASSIGE) — a prime-editing guide whose 3' extension WRITES a serine-integrase
|
|
11
|
+
attachment site (e.g. Bxb1 attB, central dinucleotide **GT**) at the nick, so the integrase can then place
|
|
12
|
+
large cargo (Yarnall et al., Nat Biotechnol 2023, 10.1038/s41587-022-01527-4; Pandey/Liu, Nat Biomed Eng 2025).
|
|
13
|
+
* **orthogonal att-pair selection** — serine-integrase att sites with distinct central dinucleotides
|
|
14
|
+
(e.g. **GA vs GT**) recombine only with their cognate partner, enabling multiplexed/orthogonal landing pads
|
|
15
|
+
(Roelle, Kamath & Matreyek, ACS Synth Biol 2023, 10.1021/acssynbio.3c00355).
|
|
16
|
+
|
|
17
|
+
These are GROUNDED design heuristics from the published rules — auto-designed guides are **candidates** (🔵) that
|
|
18
|
+
require empirical validation; nothing about activity is claimed. Recovery tests check the logic reproduces known
|
|
19
|
+
constructs (round-trip + documented invariants), never that a designed guide "works".
|
|
20
|
+
"""
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from dataclasses import dataclass
|
|
24
|
+
|
|
25
|
+
_COMP = {"A": "T", "T": "A", "G": "C", "C": "G", "N": "N",
|
|
26
|
+
"a": "t", "t": "a", "g": "c", "c": "g", "n": "n"}
|
|
27
|
+
|
|
28
|
+
# documented serine-integrase attachment-site CENTRAL DINUCLEOTIDES (the recombination crossover core)
|
|
29
|
+
_INTEGRASE_CORE = {
|
|
30
|
+
"Bxb1": "GT", # canonical Bxb1 att central dinucleotide (the recombined 2 bp)
|
|
31
|
+
"PhiC31": "TT", # PhiC31 att core
|
|
32
|
+
}
|
|
33
|
+
# orthogonal Bxb1 att variants by engineered central dinucleotide (Roelle 2023) — matched cores recombine,
|
|
34
|
+
# mismatched cores are ~orthogonal.
|
|
35
|
+
_ORTHOGONAL_BXB1_CORES = ["GT", "GA", "GC", "CT", "TA"]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def revcomp(seq: str) -> str:
|
|
39
|
+
return "".join(_COMP.get(b, "N") for b in reversed(seq))
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass
|
|
43
|
+
class BridgeRNADesign:
|
|
44
|
+
target: str
|
|
45
|
+
donor: str
|
|
46
|
+
core: str
|
|
47
|
+
target_binding_loop: str # TBL guide (base-pairs the target arms)
|
|
48
|
+
donor_binding_loop: str # DBL guide (base-pairs the donor arms)
|
|
49
|
+
core_matched: bool
|
|
50
|
+
output_kind: str = "candidate"
|
|
51
|
+
note: str = ""
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def design_bridge_rna(target_seq: str, donor_seq: str, core_len: int = 2) -> BridgeRNADesign:
|
|
55
|
+
"""Design an IS110/IS621 bridge-RNA's two reprogrammable loops for a `(target, donor)` pair.
|
|
56
|
+
|
|
57
|
+
The bipartite target/donor each carry a central core (default 2 nt); the loops are reprogrammed to base-pair
|
|
58
|
+
the flanking specificity arms (reverse-complement). The bridge mechanism REQUIRES the target and donor cores
|
|
59
|
+
to match — flagged honestly when they do not (the design is then infeasible).
|
|
60
|
+
"""
|
|
61
|
+
t, d = target_seq.upper(), donor_seq.upper()
|
|
62
|
+
mid_t, mid_d = len(t) // 2, len(d) // 2
|
|
63
|
+
core_t = t[mid_t - core_len // 2: mid_t - core_len // 2 + core_len]
|
|
64
|
+
core_d = d[mid_d - core_len // 2: mid_d - core_len // 2 + core_len]
|
|
65
|
+
return BridgeRNADesign(
|
|
66
|
+
target=t, donor=d, core=core_t,
|
|
67
|
+
target_binding_loop=revcomp(t), # the guide loop base-pairs the target (specificity arms reprogrammed)
|
|
68
|
+
donor_binding_loop=revcomp(d),
|
|
69
|
+
core_matched=bool(core_t == core_d),
|
|
70
|
+
note=("bridge RNA loops reprogrammed to the target/donor; core dinucleotide "
|
|
71
|
+
+ ("matched (feasible)" if core_t == core_d else f"MISMATCH ({core_t} vs {core_d}) -> infeasible, "
|
|
72
|
+
"the IS110/IS621 mechanism requires matching target/donor cores (Durrant 2024)")))
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def recover_bridge_rna(target_seq: str, donor_seq: str) -> bool:
|
|
76
|
+
"""Round-trip recovery: the TBL must reverse-complement back to the target (and DBL to the donor) — the
|
|
77
|
+
documented reprogramming invariant. Deterministic logic check, not an activity claim."""
|
|
78
|
+
des = design_bridge_rna(target_seq, donor_seq)
|
|
79
|
+
return revcomp(des.target_binding_loop) == target_seq.upper() and \
|
|
80
|
+
revcomp(des.donor_binding_loop) == donor_seq.upper()
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
@dataclass
|
|
84
|
+
class PegRNAAttDesign:
|
|
85
|
+
integrase: str
|
|
86
|
+
att_core: str
|
|
87
|
+
target_site: str
|
|
88
|
+
pegrna_spacer: str # the spacer (protospacer) for the prime-edit nick
|
|
89
|
+
pe_3prime_extension: str # the 3' extension encoding the attB to be written at the nick
|
|
90
|
+
written_att: str
|
|
91
|
+
output_kind: str = "candidate"
|
|
92
|
+
note: str = ""
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def design_pegrna_attb(target_site: str, integrase: str = "Bxb1", attb_arm: int = 18) -> PegRNAAttDesign:
|
|
96
|
+
"""Design a PASTE/PASSIGE pegRNA that writes a serine-integrase **attB** at `target_site`.
|
|
97
|
+
|
|
98
|
+
The prime-edit installs a minimal attB (cognate central dinucleotide for the integrase); the integrase then
|
|
99
|
+
recombines cargo flanked by attP. We return the spacer + the 3' extension (revcomp of the att template, the
|
|
100
|
+
PE convention) and the att site written. Sequences are DESIGN CANDIDATES — empirical validation required.
|
|
101
|
+
"""
|
|
102
|
+
integrase = integrase if integrase in _INTEGRASE_CORE else "Bxb1"
|
|
103
|
+
core = _INTEGRASE_CORE[integrase]
|
|
104
|
+
ts = target_site.upper()
|
|
105
|
+
spacer = ts[:20] if len(ts) >= 20 else ts
|
|
106
|
+
# minimal attB = left arm + core + right arm (schematic minimal site; real arms are integrase-specific)
|
|
107
|
+
attb = ("G" * attb_arm) + core + ("C" * attb_arm)
|
|
108
|
+
return PegRNAAttDesign(
|
|
109
|
+
integrase=integrase, att_core=core, target_site=ts, pegrna_spacer=spacer,
|
|
110
|
+
pe_3prime_extension=revcomp(attb), written_att=attb,
|
|
111
|
+
note=(f"pegRNA writes a minimal {integrase} attB (central core {core}) at the nick; cargo is delivered "
|
|
112
|
+
"flanked by attP. Arm sequences are integrase-specific; this is a candidate scaffold (Yarnall 2023)."))
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def select_orthogonal_att_pairs(n: int, integrase: str = "Bxb1") -> dict:
|
|
116
|
+
"""Select up to `n` mutually-orthogonal serine-integrase att pairs by distinct central dinucleotide
|
|
117
|
+
(Roelle 2023): matched cores recombine, mismatched cores are ~orthogonal -> usable for multiplexed landing
|
|
118
|
+
pads. Returns the selected cores + a cross-reactivity matrix (1 on the diagonal = cognate, ~0 off-diagonal)."""
|
|
119
|
+
cores = _ORTHOGONAL_BXB1_CORES[:max(1, min(n, len(_ORTHOGONAL_BXB1_CORES)))]
|
|
120
|
+
matrix = {a: {b: (1 if a == b else 0) for b in cores} for a in cores}
|
|
121
|
+
return {"integrase": integrase, "selected_cores": cores, "n": len(cores),
|
|
122
|
+
"cross_reactivity": matrix, "output_kind": "candidate",
|
|
123
|
+
"orthogonal": all(matrix[a][b] == 0 for a in cores for b in cores if a != b),
|
|
124
|
+
"note": "orthogonality by central-dinucleotide identity (Roelle, Kamath & Matreyek, ACS Synth Biol "
|
|
125
|
+
"2023); cores must be empirically confirmed orthogonal in the target context.",
|
|
126
|
+
"capped": n > len(_ORTHOGONAL_BXB1_CORES)}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def design_guide_for_writer(writer_family: str, target_seq: str | None = None,
|
|
130
|
+
donor_seq: str | None = None, integrase: str = "Bxb1") -> dict:
|
|
131
|
+
"""Dispatch to the right guide design for a writer family. Returns a candidate design + the design type, or an
|
|
132
|
+
honest abstention when required inputs are missing or the family has no programmable-guide design here."""
|
|
133
|
+
fam = (writer_family or "").lower()
|
|
134
|
+
if "bridge" in fam or "is110" in fam or "is621" in fam or "seek" in fam:
|
|
135
|
+
if not (target_seq and donor_seq):
|
|
136
|
+
return {"design_type": "bridge_rna", "available": False,
|
|
137
|
+
"reason": "bridge-RNA design needs both target and donor sequences"}
|
|
138
|
+
d = design_bridge_rna(target_seq, donor_seq)
|
|
139
|
+
return {"design_type": "bridge_rna", "available": True, "design": d.__dict__,
|
|
140
|
+
"feasible": d.core_matched}
|
|
141
|
+
if "pe_integrase" in fam or "paste" in fam or "passige" in fam or "serine" in fam:
|
|
142
|
+
if not target_seq:
|
|
143
|
+
return {"design_type": "pegrna_attb", "available": False,
|
|
144
|
+
"reason": "pegRNA+attB design needs a target site sequence"}
|
|
145
|
+
d = design_pegrna_attb(target_seq, integrase=integrase)
|
|
146
|
+
return {"design_type": "pegrna_attb", "available": True, "design": d.__dict__}
|
|
147
|
+
return {"design_type": None, "available": False,
|
|
148
|
+
"reason": f"no programmable-guide design for family '{writer_family}' (e.g. fixed-att or DSB nuclease)"}
|