pen-stack 6.9.0__tar.gz → 6.9.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pen_stack-6.9.0 → pen_stack-6.9.1}/CHANGELOG.md +26 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/CITATION.cff +1 -1
- {pen_stack-6.9.0 → pen_stack-6.9.1}/PKG-INFO +8 -5
- {pen_stack-6.9.0 → pen_stack-6.9.1}/README.md +7 -4
- pen_stack-6.9.1/configs/mhc_epitope_oracle.yaml +239 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/immune_profiler.md +9 -1
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/__init__.py +1 -1
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/ada_risk.py +8 -5
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/immune_mhc2.py +36 -4
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/immune_profile.py +3 -2
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack.egg-info/PKG-INFO +8 -5
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack.egg-info/SOURCES.txt +1 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pyproject.toml +1 -1
- {pen_stack-6.9.0 → pen_stack-6.9.1}/LICENSE +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/MANIFEST.in +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/bench/run.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/benchmarks/genome_writing_bench/README.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/benchmarks/genome_writing_challenge/README.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/benchmarks/position_effect/README.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/benchmarks/position_effect/SHA256SUMS +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/benchmarks/writer_efficiency/README.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/benchmarks/writer_efficiency/SHA256SUMS +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/antipeg.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/atlas_families.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/bridge_offtarget_profile.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/calibration/preexisting_nab_independent.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/capsid_epitope_oracle.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/capsid_sequences.fasta +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/cargo_polish.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/cell_types.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/datasets.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/delivery_constraints.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/delivery_rules.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/delivery_vehicles.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/expression/modifiers.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/expression/promoters.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/gates_v3.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/genotoxicity_oracle.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/gsh_validated_heldout.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/intent_weights.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/known_unknowns.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/llm.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/metric_guide.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/monitor_queries.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/oracles/execution.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/oracles/scope_cards.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/rules/delivery.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/rules/fold.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/rules/multiplex.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/rules/payload.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/rules/reachability.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/safety/hazard_registry.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/safety/policy.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/safety/probes.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/score_axes.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/seroprevalence.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/target_sites.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/universe_crosswalk.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/write_types.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/writer_sequences.fasta +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/configs/wtkb_curated.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/data/curated/bridge_offtarget_energetics.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/data/curated/gene_coords.parquet +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/data/curated/unified_editor_universe.parquet +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/BACKLOG.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/DEPLOY.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/INFRA.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/MCP.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/RELEASING.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/REPRO.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/STABILITY.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/agent.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/alphagenome_feasibility.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/autonomy.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/benchmark_circularity.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/biosecurity.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/build_interface.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/cards/atlas.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/cards/durability.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/cards/position_effect_data.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/cards/safety.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/cards/writer_efficiency_data.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/challenge.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/closed_loop.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/co_scientist.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/co_scientist_loop.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/delivery.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/delivery_immunology.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/digital_twin.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/dissemination.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/environment.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/experiment_design.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/generative_design.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/index.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/integrations.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/live_oracles.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/mechanistic_constraints.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/oracles.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/position_effect.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/positioning.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/private_data_formats.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/quickstart.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/responsible_use.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/rules.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/scope.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/scorecard.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/tpe_bench.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/tutorials/compare-families.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/tutorials/score-deliverability.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/tutorials/where-can-i-write.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/tutorials/which-writer-reaches-locus.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/uncertainty.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/verify.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/world_model.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/writer_efficiency.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/writer_verification.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/docs/wtkb.md +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/_resources.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/active/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/active/acquire.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/active/design.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/active/validate.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/adapt/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/adapt/finetune.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/adapt/ingest.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/adapt/pipeline.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/adapt/recalibrate.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/adapt/report.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/agent/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/agent/cite.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/agent/co_scientist.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/agent/epistemic.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/agent/guardrails.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/agent/mcp_server.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/agent/orchestrator.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/agent/orchestrator_live.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/agent/pen_agent.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/agent/scope.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/agent/tools.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/api/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/api/manifest.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/atlas/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/atlas/build_wtkb.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/atlas/crosslink.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/atlas/expand.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/atlas/guide_design.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/atlas/schema.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/atlas/scorecard.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/atlas/universe.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/atlas/variant_propose.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/atlas/writer_efficiency.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/atlas/writer_predict.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/atlas/writer_recommend.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/atlas/writer_verify.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/bridge/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/bridge/activity.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/bridge/cli.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/bridge/fold_qc.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/bridge/guide_qc.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/bridge/ingest.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/bridge/offtarget.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/bridge/offtarget_energetics.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/bridge/ortholog_screen.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/bridge/pipeline.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/build/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/build/ingest.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/build/protocol.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/build/simlab.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/cli.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/data/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/data/encode.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/data/genome.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/data/ingest_chromatin.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/data/ingest_integration.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/data/ingest_safety_annot.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/data/ingest_trip.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/design/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/design/generate.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/design/pareto.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/design/space.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/design/writer_variants.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/env/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/env/genome_writing_env.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/env/policies.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/graph/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/graph/build.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/graph/cell_types.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/graph/ingest.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/graph/query.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/graph/schema.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/loop/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/loop/continual.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/loop/cycle.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/loop/drift.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/mech/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/mech/classify_atlas.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/mech/whitelist.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/monitor/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/monitor/europepmc.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/monitor/run.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/monitor/triage.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/oracles/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/oracles/cache.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/oracles/energetics.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/oracles/genome.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/oracles/protein_design.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/oracles/rna.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/oracles/schema.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/oracles/status.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/oracles/structure.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/oracles/vcell.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/antipeg_oracle.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/cargo.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/cargo_polish.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/delivery.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/delivery_constraints.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/delivery_immunology.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/delivery_vehicles.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/genotoxicity_oracle.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/innate_sensing.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/multiplex.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/optimize.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/pipeline.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/report.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/router.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/seroprevalence_oracle.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/planner/target_site.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/rag/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/rag/index.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/rag/llm.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/rag/qa.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/rules/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/rules/evaluators.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/rules/loader.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/rules/schema.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/rules/solver.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/safety/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/safety/audit.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/safety/gate.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/safety/policy.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/safety/redteam.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/safety/registry.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/safety/screen.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/score/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/score/recalibrate.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/score/therapeutic.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/server/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/server/api.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/twin/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/twin/calibrate.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/twin/data/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/twin/data/position_effect.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/twin/mechanistic.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/twin/outcome.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/twin/position_effect.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/ui/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/ui/app.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/adapt_demo.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/agent_eval.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/bench_graph_tasks.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/bench_rule_tasks.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/bench_trust_tasks.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/bench_writetype_tasks.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/blind_gsh_discovery.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/cargo_directionality.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/closed_loop.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/durability_baselines.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/experiment_design.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/expr_controls.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/forward_hypotheses.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/generative_design.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/guide_qc_demo.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/heldout_celltype_expr.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/immune_calibration.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/intent_specification.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/known_biology_expr.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/out_of_scope_refusal.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/outcome_calibration.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/outcome_prediction.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/paper3_benchmark.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/paper4_real_validation.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/paper4_validation.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/protocol_safety.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/safety_screening.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/selective_prediction.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/seq_vs_measured.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/target_site_controls.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/uncertainty_eval.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/ungrounded_baseline.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/within_locus_ranking.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/validate/writer_recovery.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/verify/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/verify/schema.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/verify/service.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/web/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/web/guide.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/web/llm.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/web/router.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/web/server.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/web/tools.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/wgenome/__init__.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/wgenome/chromatin_seq.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/wgenome/durability.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/wgenome/export_tracks.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/wgenome/features.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/wgenome/gsh_baseline.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/wgenome/mesh_features.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/wgenome/ood.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/wgenome/providers.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/wgenome/safety.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/wgenome/structure3d.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/wgenome/uncertainty.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack/wgenome/writability.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack.egg-info/dependency_links.txt +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack.egg-info/entry_points.txt +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack.egg-info/requires.txt +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/pen_stack.egg-info/top_level.txt +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_phase0.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_phase1_5.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_phase2.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_phase3.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_a.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_acq.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_b.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_ba.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_bench.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_c.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_cal.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_calib.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_chat.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_cite.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_continual.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_crit.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_ct.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_d.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_drift.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_e.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_env.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_ep.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_expr2.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_f.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_g.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_gen.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_graph.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_h.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_immune.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_immune2.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_innate.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_loop.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_mc.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_mech.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_mon.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_o.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_orch.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_peg.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_plan.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_policy.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_profile.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_proto.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_r.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_route.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_screen.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_uq.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_v.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_writer.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/SHA256_LOCK_ws_wv.json +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/paper1.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/paper2.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/paper3.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/paper4.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/phase0.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_a.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_acq.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_aldesign.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_alvalidate.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_atlas.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_b.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_ba.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_ba_v33.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_ba_v45.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_bench.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_c.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_cal.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_calib.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_challenge.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_chat.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_cite.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_continual.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_cosci2.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_crit.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_ct.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_d.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_drift.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_e.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_env.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_ep.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_epitope.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_expr2.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_f.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_frontend.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_g.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_gen.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_genotox.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_graph.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_h.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_hybrid.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_immune.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_immune2.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_ingest.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_innate.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_loop.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_manifest.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_mc.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_mcp.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_mech.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_mon.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_o.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_openapi.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_orch.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_outcome.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_pareto.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_peg.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_plan.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_policy.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_profile.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_proto.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_r.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_redteam.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_route.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_screen.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_seroprev.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_simlab.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_twincal.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_uq.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_v.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_vcell.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_writer.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/prereg/ws_wv.yaml +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/calibrate_immune_axes.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/fetch_licensed_sources.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/p1_build_atlas.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/p1_build_durability.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/p1_build_position_effect.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/p1_build_writer_eff.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/p1_export_tracks.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/p1_safety_concordance.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/p1_train_safety.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/p1_validation_report.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/p2_build_atlas.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/p3_benchmark_report.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/p4_genome_scan.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/p52_build_genotox_oracle.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/p53_build_epitope_oracle.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/ws_b_report.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/scripts/ws_c_report.py +0 -0
- {pen_stack-6.9.0 → pen_stack-6.9.1}/setup.cfg +0 -0
|
@@ -3,6 +3,32 @@
|
|
|
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.9.1] - 2026-06-20 - Real NetMHCIIpan-4.0 / NetMHCpan-4.1 MHC epitope load (replaces the v6.9.0 proxy)
|
|
7
|
+
|
|
8
|
+
**PATCH — rigour upgrade.** v6.9.0's MHC-II axis was a documented *heuristic proxy* (P1-anchor density). The
|
|
9
|
+
gold-standard licensed predictors were already on the VM — so v6.9.1 computes the MHC-II epitope load with **real
|
|
10
|
+
NetMHCIIpan-4.0** (and MHC-I with **NetMHCpan-4.1**) over a frequent HLA panel, and re-grounds the axis on the real
|
|
11
|
+
values. Honest: the licensed binaries are **never committed/distributed** — only the **derived fractions** are
|
|
12
|
+
cached (`configs/mhc_epitope_oracle.yaml`), exactly like the v5.3 MHCflurry cache.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- `pen_stack/planner/immune_mhc2.py` — `mhc2_epitope_load(seq, name)` now uses the **real NetMHCIIpan-4.0 EL
|
|
16
|
+
%Rank≤2** cache (over 7 frequent HLA-II alleles) when the antigen is cached; the documented promiscuous-binder
|
|
17
|
+
proxy remains only as the **offline/CI fallback** for uncached sequences. `real_mhc2_load(name)` exposes the cache.
|
|
18
|
+
- `ada_risk` + `immune_profile` (writer-as-antigen) + `benchmarks/immuno` thread the antigen name → real values.
|
|
19
|
+
- `configs/mhc_epitope_oracle.yaml` (committed) — derived epitope fractions for the writer + capsid antigens.
|
|
20
|
+
|
|
21
|
+
### Result (real tool is more discriminating than the proxy)
|
|
22
|
+
- Real NetMHCIIpan-4.0 strong-binder fraction: SpCas9 **0.153**, Bxb1 **0.152**, ISCro4 **0.112**, AAV2 0.114 vs
|
|
23
|
+
**human albumin (self) 0.066 — the lowest**. The gold-standard tool shows the self protein has a genuinely lower
|
|
24
|
+
MHC-II load and the foreign writers higher — a signal the heuristic proxy flattened (~0.08–0.10 for all). The
|
|
25
|
+
immunogenic-vs-tolerated recovery is unchanged (foreign ≫ self) but now on real predictions.
|
|
26
|
+
|
|
27
|
+
### How it ran (no host install; per the VM Docker rule)
|
|
28
|
+
- `penmhc:tools` (debian + tcsh + gawk + perl) with `~/netmhc` (the licensed tools) **mounted**, NMHOME fixed at
|
|
29
|
+
runtime; `scratch/v691_mhc_compute.py` runs both predictors and writes the derived cache. The axis stays a 🟡
|
|
30
|
+
population-level proxy (frequent-HLA panel, not a patient-HLA magnitude — a known-unknown).
|
|
31
|
+
|
|
6
32
|
## [6.9.0] - 2026-06-20 - PEN-IMMUNE: MHC-II/CD4 + ADA + writer-as-antigen
|
|
7
33
|
|
|
8
34
|
**MINOR feature release.** Extends the immune profile from CD8/MHC-I-only to a full T-cell profile — MHC-I +
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 6.9.
|
|
3
|
+
Version: 6.9.1
|
|
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)
|
|
@@ -155,9 +155,12 @@ driver is **MHC-II / CD4 help → anti-drug antibodies (ADA)**, and the **writer
|
|
|
155
155
|
(Cas9 elicits MHC-II-presented CD4 responses, Simhadri *Nat Commun* 2021; bridge recombinases / serine integrases
|
|
156
156
|
are bacterial/phage) — yet Stage G scored only the capsid. v6.9 closes that gap, **never collapsing** the axes:
|
|
157
157
|
|
|
158
|
-
- **A CD4/MHC-II epitope-load axis** (`planner/immune_mhc2.py`) —
|
|
159
|
-
|
|
160
|
-
|
|
158
|
+
- **A CD4/MHC-II epitope-load axis** (`planner/immune_mhc2.py`) — **v6.9.1 computes it with the real, licensed
|
|
159
|
+
NetMHCIIpan-4.0** (EL %Rank≤2 over a frequent HLA-II panel; MHC-I via NetMHCpan-4.1), scored over **capsid AND
|
|
160
|
+
writer** sequences; only the derived fractions are cached (`configs/mhc_epitope_oracle.yaml`, the binaries are
|
|
161
|
+
never distributed), with a documented promiscuous-binder proxy as the offline/CI fallback. Population-level proxy
|
|
162
|
+
(🟡), never a patient-HLA magnitude. *(v6.9.0 used the heuristic proxy; the real tool is more discriminating —
|
|
163
|
+
human-self albumin 0.066 vs foreign writers 0.11–0.15.)*
|
|
161
164
|
- **An ADA-risk axis** (`planner/ada_risk.py`) — **ADA-risk = MHC-II epitope density × foreignness**, with a
|
|
162
165
|
**self-tolerance filter** (JanusMatrix-style: self epitopes are tolerated; foreign drive ADA). It **recovers
|
|
163
166
|
immunogenic-vs-tolerated**: the foreign writers (real UniProt SpCas9 / ISCro4 / Bxb1) score **above** the human
|
|
@@ -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)
|
|
@@ -80,9 +80,12 @@ driver is **MHC-II / CD4 help → anti-drug antibodies (ADA)**, and the **writer
|
|
|
80
80
|
(Cas9 elicits MHC-II-presented CD4 responses, Simhadri *Nat Commun* 2021; bridge recombinases / serine integrases
|
|
81
81
|
are bacterial/phage) — yet Stage G scored only the capsid. v6.9 closes that gap, **never collapsing** the axes:
|
|
82
82
|
|
|
83
|
-
- **A CD4/MHC-II epitope-load axis** (`planner/immune_mhc2.py`) —
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
- **A CD4/MHC-II epitope-load axis** (`planner/immune_mhc2.py`) — **v6.9.1 computes it with the real, licensed
|
|
84
|
+
NetMHCIIpan-4.0** (EL %Rank≤2 over a frequent HLA-II panel; MHC-I via NetMHCpan-4.1), scored over **capsid AND
|
|
85
|
+
writer** sequences; only the derived fractions are cached (`configs/mhc_epitope_oracle.yaml`, the binaries are
|
|
86
|
+
never distributed), with a documented promiscuous-binder proxy as the offline/CI fallback. Population-level proxy
|
|
87
|
+
(🟡), never a patient-HLA magnitude. *(v6.9.0 used the heuristic proxy; the real tool is more discriminating —
|
|
88
|
+
human-self albumin 0.066 vs foreign writers 0.11–0.15.)*
|
|
86
89
|
- **An ADA-risk axis** (`planner/ada_risk.py`) — **ADA-risk = MHC-II epitope density × foreignness**, with a
|
|
87
90
|
**self-tolerance filter** (JanusMatrix-style: self epitopes are tolerated; foreign drive ADA). It **recovers
|
|
88
91
|
immunogenic-vs-tolerated**: the foreign writers (real UniProt SpCas9 / ISCro4 / Bxb1) score **above** the human
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
version: 6.9.1
|
|
2
|
+
method:
|
|
3
|
+
mhc2: NetMHCIIpan-4.0 EL %Rank<=2
|
|
4
|
+
mhc1: NetMHCpan-4.1 %Rank<=0.5
|
|
5
|
+
hla2_panel:
|
|
6
|
+
- DRB1_0101
|
|
7
|
+
- DRB1_0301
|
|
8
|
+
- DRB1_0401
|
|
9
|
+
- DRB1_0701
|
|
10
|
+
- DRB1_1101
|
|
11
|
+
- DRB1_1301
|
|
12
|
+
- DRB1_1501
|
|
13
|
+
hla1_panel:
|
|
14
|
+
- HLA-A01:01
|
|
15
|
+
- HLA-A02:01
|
|
16
|
+
- HLA-A03:01
|
|
17
|
+
- HLA-A11:01
|
|
18
|
+
- HLA-A24:02
|
|
19
|
+
- HLA-A26:01
|
|
20
|
+
- HLA-B07:02
|
|
21
|
+
- HLA-B08:01
|
|
22
|
+
- HLA-B15:01
|
|
23
|
+
- HLA-B27:05
|
|
24
|
+
- HLA-B40:01
|
|
25
|
+
- HLA-B58:01
|
|
26
|
+
provenance_dois:
|
|
27
|
+
- 10.1093/nar/gkac1029
|
|
28
|
+
- 10.1093/nar/gkaa379
|
|
29
|
+
note: population-level epitope load over a frequent HLA panel (NOT patient-HLA-specific);
|
|
30
|
+
licensed NetMHC binaries run locally, only derived fractions cached.
|
|
31
|
+
mhc2:
|
|
32
|
+
SpCas9:
|
|
33
|
+
epitope_fraction_strong: 0.1529
|
|
34
|
+
immune_score: 0.8471
|
|
35
|
+
n_windows: 1354
|
|
36
|
+
n_strong: 207
|
|
37
|
+
alleles_used:
|
|
38
|
+
- DRB1_0101
|
|
39
|
+
- DRB1_0301
|
|
40
|
+
- DRB1_0401
|
|
41
|
+
- DRB1_0701
|
|
42
|
+
- DRB1_1101
|
|
43
|
+
- DRB1_1301
|
|
44
|
+
- DRB1_1501
|
|
45
|
+
ISCro4:
|
|
46
|
+
epitope_fraction_strong: 0.1122
|
|
47
|
+
immune_score: 0.8878
|
|
48
|
+
n_windows: 312
|
|
49
|
+
n_strong: 35
|
|
50
|
+
alleles_used:
|
|
51
|
+
- DRB1_0101
|
|
52
|
+
- DRB1_0301
|
|
53
|
+
- DRB1_0401
|
|
54
|
+
- DRB1_0701
|
|
55
|
+
- DRB1_1101
|
|
56
|
+
- DRB1_1301
|
|
57
|
+
- DRB1_1501
|
|
58
|
+
Bxb1:
|
|
59
|
+
epitope_fraction_strong: 0.152
|
|
60
|
+
immune_score: 0.848
|
|
61
|
+
n_windows: 487
|
|
62
|
+
n_strong: 74
|
|
63
|
+
alleles_used:
|
|
64
|
+
- DRB1_0101
|
|
65
|
+
- DRB1_0301
|
|
66
|
+
- DRB1_0401
|
|
67
|
+
- DRB1_0701
|
|
68
|
+
- DRB1_1101
|
|
69
|
+
- DRB1_1301
|
|
70
|
+
- DRB1_1501
|
|
71
|
+
HumanAlbumin:
|
|
72
|
+
epitope_fraction_strong: 0.0655
|
|
73
|
+
immune_score: 0.9345
|
|
74
|
+
n_windows: 595
|
|
75
|
+
n_strong: 39
|
|
76
|
+
alleles_used:
|
|
77
|
+
- DRB1_0101
|
|
78
|
+
- DRB1_0301
|
|
79
|
+
- DRB1_0401
|
|
80
|
+
- DRB1_0701
|
|
81
|
+
- DRB1_1101
|
|
82
|
+
- DRB1_1301
|
|
83
|
+
- DRB1_1501
|
|
84
|
+
AAV2_VP1:
|
|
85
|
+
epitope_fraction_strong: 0.1137
|
|
86
|
+
immune_score: 0.8863
|
|
87
|
+
n_windows: 721
|
|
88
|
+
n_strong: 82
|
|
89
|
+
alleles_used:
|
|
90
|
+
- DRB1_0101
|
|
91
|
+
- DRB1_0301
|
|
92
|
+
- DRB1_0401
|
|
93
|
+
- DRB1_0701
|
|
94
|
+
- DRB1_1101
|
|
95
|
+
- DRB1_1301
|
|
96
|
+
- DRB1_1501
|
|
97
|
+
Ad5_hexon:
|
|
98
|
+
epitope_fraction_strong: 0.1471
|
|
99
|
+
immune_score: 0.8529
|
|
100
|
+
n_windows: 938
|
|
101
|
+
n_strong: 138
|
|
102
|
+
alleles_used:
|
|
103
|
+
- DRB1_0101
|
|
104
|
+
- DRB1_0301
|
|
105
|
+
- DRB1_0401
|
|
106
|
+
- DRB1_0701
|
|
107
|
+
- DRB1_1101
|
|
108
|
+
- DRB1_1301
|
|
109
|
+
- DRB1_1501
|
|
110
|
+
VSVg_Indiana:
|
|
111
|
+
epitope_fraction_strong: 0.0684
|
|
112
|
+
immune_score: 0.9316
|
|
113
|
+
n_windows: 497
|
|
114
|
+
n_strong: 34
|
|
115
|
+
alleles_used:
|
|
116
|
+
- DRB1_0101
|
|
117
|
+
- DRB1_0301
|
|
118
|
+
- DRB1_0401
|
|
119
|
+
- DRB1_0701
|
|
120
|
+
- DRB1_1101
|
|
121
|
+
- DRB1_1301
|
|
122
|
+
- DRB1_1501
|
|
123
|
+
HSV1_gD:
|
|
124
|
+
epitope_fraction_strong: 0.1184
|
|
125
|
+
immune_score: 0.8816
|
|
126
|
+
n_windows: 380
|
|
127
|
+
n_strong: 45
|
|
128
|
+
alleles_used:
|
|
129
|
+
- DRB1_0101
|
|
130
|
+
- DRB1_0301
|
|
131
|
+
- DRB1_0401
|
|
132
|
+
- DRB1_0701
|
|
133
|
+
- DRB1_1101
|
|
134
|
+
- DRB1_1301
|
|
135
|
+
- DRB1_1501
|
|
136
|
+
HSV1_gB:
|
|
137
|
+
epitope_fraction_strong: 0.1067
|
|
138
|
+
immune_score: 0.8933
|
|
139
|
+
n_windows: 890
|
|
140
|
+
n_strong: 95
|
|
141
|
+
alleles_used:
|
|
142
|
+
- DRB1_0101
|
|
143
|
+
- DRB1_0301
|
|
144
|
+
- DRB1_0401
|
|
145
|
+
- DRB1_0701
|
|
146
|
+
- DRB1_1101
|
|
147
|
+
- DRB1_1301
|
|
148
|
+
- DRB1_1501
|
|
149
|
+
mhc1:
|
|
150
|
+
AAV2_VP1:
|
|
151
|
+
epitope_fraction_strong: 0.0935
|
|
152
|
+
immune_score: 0.9065
|
|
153
|
+
n_windows: 727
|
|
154
|
+
n_strong: 68
|
|
155
|
+
alleles_used:
|
|
156
|
+
- HLA-A01:01
|
|
157
|
+
- HLA-A02:01
|
|
158
|
+
- HLA-A03:01
|
|
159
|
+
- HLA-A11:01
|
|
160
|
+
- HLA-A24:02
|
|
161
|
+
- HLA-A26:01
|
|
162
|
+
- HLA-B07:02
|
|
163
|
+
- HLA-B08:01
|
|
164
|
+
- HLA-B15:01
|
|
165
|
+
- HLA-B27:05
|
|
166
|
+
- HLA-B40:01
|
|
167
|
+
- HLA-B58:01
|
|
168
|
+
Ad5_hexon:
|
|
169
|
+
epitope_fraction_strong: 0.1367
|
|
170
|
+
immune_score: 0.8633
|
|
171
|
+
n_windows: 944
|
|
172
|
+
n_strong: 129
|
|
173
|
+
alleles_used:
|
|
174
|
+
- HLA-A01:01
|
|
175
|
+
- HLA-A02:01
|
|
176
|
+
- HLA-A03:01
|
|
177
|
+
- HLA-A11:01
|
|
178
|
+
- HLA-A24:02
|
|
179
|
+
- HLA-A26:01
|
|
180
|
+
- HLA-B07:02
|
|
181
|
+
- HLA-B08:01
|
|
182
|
+
- HLA-B15:01
|
|
183
|
+
- HLA-B27:05
|
|
184
|
+
- HLA-B40:01
|
|
185
|
+
- HLA-B58:01
|
|
186
|
+
VSVg_Indiana:
|
|
187
|
+
epitope_fraction_strong: 0.1074
|
|
188
|
+
immune_score: 0.8926
|
|
189
|
+
n_windows: 503
|
|
190
|
+
n_strong: 54
|
|
191
|
+
alleles_used:
|
|
192
|
+
- HLA-A01:01
|
|
193
|
+
- HLA-A02:01
|
|
194
|
+
- HLA-A03:01
|
|
195
|
+
- HLA-A11:01
|
|
196
|
+
- HLA-A24:02
|
|
197
|
+
- HLA-A26:01
|
|
198
|
+
- HLA-B07:02
|
|
199
|
+
- HLA-B08:01
|
|
200
|
+
- HLA-B15:01
|
|
201
|
+
- HLA-B27:05
|
|
202
|
+
- HLA-B40:01
|
|
203
|
+
- HLA-B58:01
|
|
204
|
+
HSV1_gD:
|
|
205
|
+
epitope_fraction_strong: 0.1218
|
|
206
|
+
immune_score: 0.8782
|
|
207
|
+
n_windows: 386
|
|
208
|
+
n_strong: 47
|
|
209
|
+
alleles_used:
|
|
210
|
+
- HLA-A01:01
|
|
211
|
+
- HLA-A02:01
|
|
212
|
+
- HLA-A03:01
|
|
213
|
+
- HLA-A11:01
|
|
214
|
+
- HLA-A24:02
|
|
215
|
+
- HLA-A26:01
|
|
216
|
+
- HLA-B07:02
|
|
217
|
+
- HLA-B08:01
|
|
218
|
+
- HLA-B15:01
|
|
219
|
+
- HLA-B27:05
|
|
220
|
+
- HLA-B40:01
|
|
221
|
+
- HLA-B58:01
|
|
222
|
+
HSV1_gB:
|
|
223
|
+
epitope_fraction_strong: 0.115
|
|
224
|
+
immune_score: 0.885
|
|
225
|
+
n_windows: 896
|
|
226
|
+
n_strong: 103
|
|
227
|
+
alleles_used:
|
|
228
|
+
- HLA-A01:01
|
|
229
|
+
- HLA-A02:01
|
|
230
|
+
- HLA-A03:01
|
|
231
|
+
- HLA-A11:01
|
|
232
|
+
- HLA-A24:02
|
|
233
|
+
- HLA-A26:01
|
|
234
|
+
- HLA-B07:02
|
|
235
|
+
- HLA-B08:01
|
|
236
|
+
- HLA-B15:01
|
|
237
|
+
- HLA-B27:05
|
|
238
|
+
- HLA-B40:01
|
|
239
|
+
- HLA-B58:01
|
|
@@ -6,7 +6,15 @@ adaptive axis was **CD8/MHC-I only** (capsid epitope load via MHCflurry). v6.9 a
|
|
|
6
6
|
|
|
7
7
|
## The MHC-II/CD4 axis (`planner/immune_mhc2.py`)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
> **v6.9.1 — real predictor.** The MHC-II epitope load is computed with the **licensed NetMHCIIpan-4.0** (EL
|
|
10
|
+
> %Rank≤2 over a frequent HLA-II panel; MHC-I via **NetMHCpan-4.1**), run inside `penmhc:tools` Docker on the VM
|
|
11
|
+
> with the licensed tools **mounted** (never committed). Only the **derived fractions** are cached
|
|
12
|
+
> (`configs/mhc_epitope_oracle.yaml`), exactly like the v5.3 MHCflurry cache. The documented proxy below remains as
|
|
13
|
+
> the offline/CI fallback for sequences not in the cache. Real result: human-self albumin **0.066** vs foreign
|
|
14
|
+
> writers **0.11–0.15** (the gold-standard tool discriminates self from foreign — the v6.9.0 proxy gave ~0.08–0.10
|
|
15
|
+
> for all). Still a 🟡 population-level proxy (frequent-HLA panel, not a patient-HLA magnitude).
|
|
16
|
+
|
|
17
|
+
A grounded, dependency-free **promiscuous MHC-II binder density** (the offline/CI fallback): MHC-II presents a 9-mer core in an open groove
|
|
10
18
|
whose **P1 pocket is deep and hydrophobic** — the single dominant anchor (M/F/Y/W/L/I/V; Stern & Wiley, *Nature*
|
|
11
19
|
1994), with secondary pockets at P4/P6/P9. A *promiscuous* epitope (binds many HLA-DR) has a strong P1 anchor +
|
|
12
20
|
favorable secondaries (Southwood 1998). We count promiscuous-binder cores → an epitope-density proxy, computed over
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""PEN-STACK v3.0 - open infrastructure for genome writing."""
|
|
2
|
-
__version__ = "6.9.
|
|
2
|
+
__version__ = "6.9.1"
|
|
@@ -52,10 +52,12 @@ def self_tolerance(seq: str, human_kmers: frozenset | None = None) -> dict:
|
|
|
52
52
|
"reference": "bundled human self proteins (full human proteome substitutable on VM)"}
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
def ada_risk(seq: str, origin: str | None = None, human_kmers: frozenset | None = None
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
55
|
+
def ada_risk(seq: str, origin: str | None = None, human_kmers: frozenset | None = None,
|
|
56
|
+
name: str | None = None) -> dict:
|
|
57
|
+
"""ADA-risk = MHC-II epitope density x foreignness, with the self-tolerance filter. Uses the REAL NetMHCIIpan-4.0
|
|
58
|
+
epitope density when the antigen `name` is cached (else the documented proxy). Higher ada_risk_score = MORE
|
|
59
|
+
anti-drug-antibody risk; `ada_immune_score = 1 - ada_risk_score` (higher = safer) for profile parity."""
|
|
60
|
+
el = mhc2_epitope_load(seq, name)
|
|
59
61
|
st = self_tolerance(seq, human_kmers)
|
|
60
62
|
sm = st["self_match_fraction"] or 0.0
|
|
61
63
|
if origin == "self":
|
|
@@ -81,4 +83,5 @@ def ada_risk_named(name: str) -> dict:
|
|
|
81
83
|
rec = writer_sequences().get(name)
|
|
82
84
|
if not rec:
|
|
83
85
|
return {"available": False, "note": f"no bundled sequence {name!r}"}
|
|
84
|
-
return {"available": True, "name": name, "family": rec.get("family"),
|
|
86
|
+
return {"available": True, "name": name, "family": rec.get("family"),
|
|
87
|
+
**ada_risk(rec["seq"], rec.get("origin"), name=name)}
|
|
@@ -53,8 +53,39 @@ def mhc2_binder_cores(seq: str) -> list[tuple[int, str, float]]:
|
|
|
53
53
|
return out
|
|
54
54
|
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
@lru_cache(maxsize=1)
|
|
57
|
+
def _real_cache() -> dict:
|
|
58
|
+
"""The REAL NetMHCIIpan-4.0 EL %Rank epitope-load cache (configs/mhc_epitope_oracle.yaml), computed over a
|
|
59
|
+
frequent HLA-II panel on the VM. Only the derived fractions are shipped (the licensed binary is never
|
|
60
|
+
distributed). Empty dict if the cache is absent (then the documented proxy is used)."""
|
|
61
|
+
try:
|
|
62
|
+
import yaml
|
|
63
|
+
return yaml.safe_load(resource("configs/mhc_epitope_oracle.yaml").read_text(encoding="utf-8")) or {}
|
|
64
|
+
except Exception: # noqa: BLE001
|
|
65
|
+
return {}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def real_mhc2_load(name: str) -> dict | None:
|
|
69
|
+
"""The real NetMHCIIpan-4.0 epitope load for a bundled antigen by name, or None when not cached."""
|
|
70
|
+
rec = (_real_cache().get("mhc2") or {}).get(name)
|
|
71
|
+
if not rec:
|
|
72
|
+
return None
|
|
73
|
+
panel = (_real_cache().get("method") or {}).get("hla2_panel", [])
|
|
74
|
+
return {"epitope_density": rec["epitope_fraction_strong"], "mhc2_immune_score": rec["immune_score"],
|
|
75
|
+
"n_cores": rec.get("n_windows"), "n_promiscuous_binders": rec.get("n_strong"),
|
|
76
|
+
"method": "NetMHCIIpan-4.0 EL %Rank<=2 over a frequent HLA-II panel "
|
|
77
|
+
f"({len(panel)} alleles): {', '.join(panel)}",
|
|
78
|
+
"status": "population-level (frequent-HLA panel; NetMHCIIpan-4.0 eluted-ligand), OOD-gated; NOT a "
|
|
79
|
+
"patient-HLA-specific magnitude (known-unknown)", "backend": "netmhciipan_cache"}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def mhc2_epitope_load(seq: str, name: str | None = None) -> dict:
|
|
83
|
+
"""MHC-II epitope load. Uses the REAL NetMHCIIpan-4.0 cache when the antigen `name` is cached; otherwise the
|
|
84
|
+
documented promiscuous-binder PROXY (offline/CI fallback). Score: 1 = least presentable (MHC-I convention)."""
|
|
85
|
+
if name:
|
|
86
|
+
real = real_mhc2_load(name)
|
|
87
|
+
if real:
|
|
88
|
+
return real
|
|
58
89
|
s = _clean(seq)
|
|
59
90
|
n_cores = max(0, len(s) - 8)
|
|
60
91
|
binders = mhc2_binder_cores(s)
|
|
@@ -64,9 +95,10 @@ def mhc2_epitope_load(seq: str) -> dict:
|
|
|
64
95
|
"epitope_density": round(density, 4),
|
|
65
96
|
"mhc2_immune_score": round(1.0 - min(density, 1.0), 4), # 1 = least presentable (MHC-I convention)
|
|
66
97
|
"method": "promiscuous MHC-II binder density (P1 hydrophobic anchor + P4/P6/P9 secondary pockets; "
|
|
67
|
-
"Stern & Wiley 1994; Southwood 1998)"
|
|
98
|
+
"Stern & Wiley 1994; Southwood 1998) — DOCUMENTED PROXY (offline/CI fallback when the "
|
|
99
|
+
"NetMHCIIpan-4.0 cache is absent)",
|
|
68
100
|
"status": "population-level sequence-intrinsic proxy (🟡); NOT a trained allele-specific predictor, NOT a "
|
|
69
|
-
"patient-HLA-specific magnitude (known-unknown)",
|
|
101
|
+
"patient-HLA-specific magnitude (known-unknown)", "backend": "proxy",
|
|
70
102
|
"binder_cores": [c for _, c, _ in binders[:50]],
|
|
71
103
|
}
|
|
72
104
|
|
|
@@ -83,8 +83,9 @@ def _writer_antigen_card(design: dict) -> dict | None:
|
|
|
83
83
|
rec = writer_family_to_sequence(wf) if wf else None
|
|
84
84
|
if not rec or not rec.get("seq"):
|
|
85
85
|
return None
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
nm = rec.get("name")
|
|
87
|
+
el = mhc2_epitope_load(rec["seq"], nm) # real NetMHCIIpan-4.0 when cached, else proxy
|
|
88
|
+
ad = ada_risk(rec["seq"], rec.get("origin"), name=nm)
|
|
88
89
|
return {"writer_family": wf, "representative": rec.get("name"), "accession": rec.get("accession"),
|
|
89
90
|
"origin": rec.get("origin"), "is_foreign": rec.get("origin") == "foreign",
|
|
90
91
|
"mhc2_immune_score": el["mhc2_immune_score"], "epitope_density": el["epitope_density"],
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 6.9.
|
|
3
|
+
Version: 6.9.1
|
|
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)
|
|
@@ -155,9 +155,12 @@ driver is **MHC-II / CD4 help → anti-drug antibodies (ADA)**, and the **writer
|
|
|
155
155
|
(Cas9 elicits MHC-II-presented CD4 responses, Simhadri *Nat Commun* 2021; bridge recombinases / serine integrases
|
|
156
156
|
are bacterial/phage) — yet Stage G scored only the capsid. v6.9 closes that gap, **never collapsing** the axes:
|
|
157
157
|
|
|
158
|
-
- **A CD4/MHC-II epitope-load axis** (`planner/immune_mhc2.py`) —
|
|
159
|
-
|
|
160
|
-
|
|
158
|
+
- **A CD4/MHC-II epitope-load axis** (`planner/immune_mhc2.py`) — **v6.9.1 computes it with the real, licensed
|
|
159
|
+
NetMHCIIpan-4.0** (EL %Rank≤2 over a frequent HLA-II panel; MHC-I via NetMHCpan-4.1), scored over **capsid AND
|
|
160
|
+
writer** sequences; only the derived fractions are cached (`configs/mhc_epitope_oracle.yaml`, the binaries are
|
|
161
|
+
never distributed), with a documented promiscuous-binder proxy as the offline/CI fallback. Population-level proxy
|
|
162
|
+
(🟡), never a patient-HLA magnitude. *(v6.9.0 used the heuristic proxy; the real tool is more discriminating —
|
|
163
|
+
human-self albumin 0.066 vs foreign writers 0.11–0.15.)*
|
|
161
164
|
- **An ADA-risk axis** (`planner/ada_risk.py`) — **ADA-risk = MHC-II epitope density × foreignness**, with a
|
|
162
165
|
**self-tolerance filter** (JanusMatrix-style: self epitopes are tolerated; foreign drive ADA). It **recovers
|
|
163
166
|
immunogenic-vs-tolerated**: the foreign writers (real UniProt SpCas9 / ISCro4 / Bxb1) score **above** the human
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pen-stack"
|
|
7
|
-
version = "6.9.
|
|
7
|
+
version = "6.9.1"
|
|
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"
|
|
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
|