pen-stack 5.4.0__tar.gz → 5.5.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-5.4.0 → pen_stack-5.5.0}/CHANGELOG.md +31 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/CITATION.cff +1 -1
- {pen_stack-5.4.0 → pen_stack-5.5.0}/PKG-INFO +26 -2
- {pen_stack-5.4.0 → pen_stack-5.5.0}/README.md +25 -1
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/oracles/scope_cards.yaml +14 -0
- pen_stack-5.5.0/configs/seroprevalence.yaml +64 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/__init__.py +1 -1
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/agent/cite.py +7 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/delivery_immunology.py +14 -0
- pen_stack-5.5.0/pen_stack/planner/seroprevalence_oracle.py +92 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack.egg-info/PKG-INFO +26 -2
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack.egg-info/SOURCES.txt +4 -0
- pen_stack-5.5.0/prereg/SHA256_LOCK_ws_seroprev.json +8 -0
- pen_stack-5.5.0/prereg/ws_seroprev.yaml +40 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pyproject.toml +1 -1
- {pen_stack-5.4.0 → pen_stack-5.5.0}/LICENSE +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/MANIFEST.in +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/bench/run.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/benchmarks/genome_writing_bench/README.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/atlas_families.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/bridge_offtarget_profile.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/capsid_epitope_oracle.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/capsid_sequences.fasta +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/cargo_polish.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/cell_types.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/datasets.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/delivery_constraints.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/delivery_rules.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/delivery_vehicles.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/gates_v3.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/genotoxicity_oracle.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/gsh_validated_heldout.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/intent_weights.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/known_unknowns.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/llm.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/monitor_queries.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/rules/delivery.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/rules/fold.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/rules/multiplex.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/rules/payload.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/rules/reachability.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/score_axes.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/target_sites.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/universe_crosswalk.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/write_types.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/configs/wtkb_curated.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/data/curated/bridge_offtarget_energetics.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/data/curated/gene_coords.parquet +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/data/curated/unified_editor_universe.parquet +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/BACKLOG.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/DEPLOY.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/INFRA.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/MCP.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/RELEASING.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/REPRO.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/agent.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/alphagenome_feasibility.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/benchmark_circularity.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/cards/atlas.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/cards/durability.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/cards/safety.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/co_scientist.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/delivery.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/dissemination.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/environment.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/index.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/mechanistic_constraints.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/oracles.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/positioning.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/private_data_formats.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/quickstart.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/rules.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/scope.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/scorecard.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/tutorials/compare-families.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/tutorials/score-deliverability.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/tutorials/where-can-i-write.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/uncertainty.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/verify.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/world_model.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/writer_verification.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/docs/wtkb.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/_resources.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/adapt/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/adapt/finetune.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/adapt/ingest.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/adapt/pipeline.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/adapt/recalibrate.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/adapt/report.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/agent/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/agent/co_scientist.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/agent/epistemic.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/agent/guardrails.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/agent/mcp_server.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/agent/orchestrator.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/agent/pen_agent.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/agent/scope.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/agent/tools.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/atlas/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/atlas/build_wtkb.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/atlas/crosslink.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/atlas/expand.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/atlas/schema.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/atlas/scorecard.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/atlas/universe.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/atlas/variant_propose.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/atlas/writer_verify.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/bridge/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/bridge/activity.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/bridge/cli.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/bridge/fold_qc.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/bridge/guide_qc.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/bridge/ingest.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/bridge/offtarget.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/bridge/ortholog_screen.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/bridge/pipeline.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/cli.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/data/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/data/encode.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/data/genome.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/data/ingest_chromatin.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/data/ingest_integration.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/data/ingest_safety_annot.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/data/ingest_trip.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/env/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/env/genome_writing_env.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/env/policies.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/graph/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/graph/build.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/graph/cell_types.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/graph/ingest.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/graph/query.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/graph/schema.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/mech/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/mech/classify_atlas.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/mech/whitelist.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/monitor/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/monitor/europepmc.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/monitor/run.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/monitor/triage.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/oracles/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/oracles/cache.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/oracles/energetics.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/oracles/genome.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/oracles/protein_design.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/oracles/rna.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/oracles/schema.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/oracles/structure.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/cargo.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/cargo_polish.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/delivery.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/delivery_constraints.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/delivery_vehicles.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/genotoxicity_oracle.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/innate_sensing.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/multiplex.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/optimize.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/pipeline.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/report.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/router.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/planner/target_site.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/rag/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/rag/index.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/rag/llm.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/rag/qa.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/rules/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/rules/evaluators.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/rules/loader.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/rules/schema.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/rules/solver.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/score/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/score/recalibrate.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/score/therapeutic.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/server/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/server/api.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/ui/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/ui/app.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/adapt_demo.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/agent_eval.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/cargo_directionality.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/durability_baselines.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/forward_hypotheses.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/guide_qc_demo.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/intent_specification.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/outcome_calibration.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/paper3_benchmark.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/paper4_real_validation.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/paper4_validation.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/selective_prediction.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/seq_vs_measured.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/target_site_controls.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/uncertainty_eval.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/within_locus_ranking.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/validate/writer_recovery.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/verify/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/verify/schema.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/verify/service.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/wgenome/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/wgenome/durability.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/wgenome/export_tracks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/wgenome/features.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/wgenome/mesh_features.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/wgenome/ood.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/wgenome/providers.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/wgenome/safety.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/wgenome/structure3d.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/wgenome/uncertainty.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack/wgenome/writability.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack.egg-info/dependency_links.txt +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack.egg-info/entry_points.txt +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack.egg-info/requires.txt +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/pen_stack.egg-info/top_level.txt +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_phase0.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_phase2.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_phase3.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/paper1.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/paper2.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/paper3.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/paper4.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/phase0.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_a.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_atlas.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_b.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_ba.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_ba_v33.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_ba_v45.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_bench.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_c.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_cal.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_cite.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_crit.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_ct.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_d.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_e.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_env.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_ep.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_epitope.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_f.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_g.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_genotox.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_graph.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_h.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_immune.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_innate.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_mc.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_mon.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_o.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_plan.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_r.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_route.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_uq.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_v.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/prereg/ws_wv.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/scripts/p1_build_atlas.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/scripts/p1_build_durability.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/scripts/p1_export_tracks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/scripts/p1_safety_concordance.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/scripts/p1_train_safety.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/scripts/p1_validation_report.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/scripts/p2_build_atlas.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/scripts/p3_benchmark_report.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/scripts/p4_genome_scan.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/scripts/p52_build_genotox_oracle.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/scripts/p53_build_epitope_oracle.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/scripts/ws_b_report.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/scripts/ws_c_report.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.5.0}/setup.cfg +0 -0
|
@@ -3,6 +3,37 @@
|
|
|
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
|
+
## [5.5.0] - 2026-06-10 - v5.5 release: Anti-vector seroprevalence oracle (the last immune axis, from data)
|
|
7
|
+
|
|
8
|
+
Completes the computable delivery-immunology axes. **Pre-existing humoral immunity** (B-cell / neutralizing
|
|
9
|
+
antibody) to a viral capsid is the one immune axis that *cannot* be computed from sequence — it is a population
|
|
10
|
+
prevalence from natural exposure. v5.5 grounds it in published **serosurvey data**. Workstream WS-SEROPREV,
|
|
11
|
+
SHA-locked.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- **WS-SEROPREV table** — `configs/seroprevalence.yaml`: curated population NAb/IgG seroprevalence per serotype
|
|
15
|
+
as **ranges** (region/age/assay variation) with DOIs — AAV (Calcedo 2009, Boutin 2010), adenovirus type 5
|
|
16
|
+
(Mast 2010), HSV-1 (Looker 2015), VSV (negligible).
|
|
17
|
+
- **WS-SEROPREV oracle** — `pen_stack/planner/seroprevalence_oracle.py`: `seroprevalence_oracle(vehicle,
|
|
18
|
+
serotype=None)` → `OracleResult`. `preexisting_score = 1 − midpoint(seroprevalence)/100`; the range width is
|
|
19
|
+
surfaced as `native_uncertainty`. Non-viral → 1.0 by mechanism; unknown → **abstains**.
|
|
20
|
+
- **Wired into the pre-existing axis** — `safety_efficacy_profile()` folds the computed seroprevalence score
|
|
21
|
+
into the `preexisting_immunity` sub-axis **only for in-vivo vehicles** (serum NAb neutralises the vector in
|
|
22
|
+
vivo; ex-vivo transduction in a dish is not reached by host antibody → reported but muted). `seroprevalence_score`
|
|
23
|
+
surfaces the raw value.
|
|
24
|
+
- **Result (from data):** adenovirus has the highest pre-existing seroprevalence (40–90%, score 0.35), AAV
|
|
25
|
+
intermediate (30–60%, 0.55), VSV/lentivirus negligible (0–5%, 0.975) — the documented ordering quantified
|
|
26
|
+
from serosurveys. `prereg/ws_seroprev.yaml`.
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
- Version 5.4.0 -> 5.5.0 (minor — additive data-grounded oracle); `cite.curated_dois()` ingests the
|
|
30
|
+
seroprevalence DOIs.
|
|
31
|
+
|
|
32
|
+
### Honesty invariant (unchanged)
|
|
33
|
+
- A **population** prevalence (a range; region/age/assay-dependent), **not** a given **patient's** NAb titer /
|
|
34
|
+
sero-status (a clinical test, patient-specific → a known-unknown); the **humoral (B-cell)** axis only,
|
|
35
|
+
distinct from the v5.3 T-cell epitope load. No patient-specific magnitude predicted.
|
|
36
|
+
|
|
6
37
|
## [5.4.0] - 2026-06-10 - v5.4 release: Computed innate-sensing scorer (completes the computable immune axes)
|
|
7
38
|
|
|
8
39
|
The third computed delivery-immunology signal, after v5.2 genotoxicity and v5.3 capsid epitope load. Innate
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 5.
|
|
3
|
+
Version: 5.5.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
|
|
@@ -91,7 +91,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
91
91
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
92
92
|
[](LICENSE)
|
|
93
93
|
[](https://www.python.org/)
|
|
94
|
-
[](CHANGELOG.md)
|
|
95
95
|
[](tests/)
|
|
96
96
|
[](https://github.com/astral-sh/ruff)
|
|
97
97
|
[](docker/)
|
|
@@ -135,6 +135,30 @@ Two questions gate every genome-writing project, and before PEN-STACK no resourc
|
|
|
135
135
|
Everything is built on bulk-downloadable public data, runs on a single GPU, and is validated **blind** against
|
|
136
136
|
a pre-registered, honest baseline before release.
|
|
137
137
|
|
|
138
|
+
## What is new in v5.5 — Anti-vector seroprevalence oracle (the last immune axis, from data)
|
|
139
|
+
|
|
140
|
+
This completes the computable delivery-immunology axes. **Pre-existing humoral immunity** (B-cell / NAb) to a
|
|
141
|
+
viral capsid is the one axis that *cannot* be computed from sequence — it is a population prevalence from
|
|
142
|
+
natural exposure — so v5.5 grounds it in published **serosurvey data** (AAV: Calcedo 2009 / Boutin 2010;
|
|
143
|
+
adenovirus: Mast 2010; HSV-1: Looker 2015). `preexisting_score = 1 − midpoint(seroprevalence)/100`, with the
|
|
144
|
+
literature range surfaced as native uncertainty.
|
|
145
|
+
|
|
146
|
+
| serotype (vehicle) | NAb seroprevalence | pre-existing score |
|
|
147
|
+
|---|---|---|
|
|
148
|
+
| Ad5 → HDAd | 40–90% | 0.35 |
|
|
149
|
+
| AAV (aggregate) → AAV | 30–60% | 0.55 |
|
|
150
|
+
| HSV-1 → HSV | 50–70% | 0.40 |
|
|
151
|
+
| VSV → lentivirus | 0–5% | 0.975 |
|
|
152
|
+
|
|
153
|
+
Folded into the pre-existing axis for **in-vivo** vehicles (muted for ex-vivo, where serum NAb can't reach
|
|
154
|
+
ex-vivo cells); non-viral → 1.0 by mechanism. It is a **population** prevalence — **not** a given patient's NAb
|
|
155
|
+
titer (a known-unknown). See `pen_stack/planner/seroprevalence_oracle.py`, `configs/seroprevalence.yaml`,
|
|
156
|
+
`prereg/ws_seroprev.yaml`, and the `seroprevalence` scope card.
|
|
157
|
+
|
|
158
|
+
**With v5.5, four of the five delivery-immunology axes are grounded in data or sequence** — genotoxicity
|
|
159
|
+
(VISDB×COSMIC), adaptive/CD8 (MHCflurry), innate (CpG/dsRNA), pre-existing/NAb (serosurveys) — each abstaining
|
|
160
|
+
rather than fabricating, with the in-vivo *magnitude* always a declared known-unknown.
|
|
161
|
+
|
|
138
162
|
## What is new in v5.4 — Computed innate-sensing scorer (completes the computable immune axes)
|
|
139
163
|
|
|
140
164
|
The third computed delivery-immunology signal (after v5.2 genotoxicity and v5.3 capsid epitope load). Innate
|
|
@@ -16,7 +16,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
16
16
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
17
17
|
[](LICENSE)
|
|
18
18
|
[](https://www.python.org/)
|
|
19
|
-
[](CHANGELOG.md)
|
|
20
20
|
[](tests/)
|
|
21
21
|
[](https://github.com/astral-sh/ruff)
|
|
22
22
|
[](docker/)
|
|
@@ -60,6 +60,30 @@ Two questions gate every genome-writing project, and before PEN-STACK no resourc
|
|
|
60
60
|
Everything is built on bulk-downloadable public data, runs on a single GPU, and is validated **blind** against
|
|
61
61
|
a pre-registered, honest baseline before release.
|
|
62
62
|
|
|
63
|
+
## What is new in v5.5 — Anti-vector seroprevalence oracle (the last immune axis, from data)
|
|
64
|
+
|
|
65
|
+
This completes the computable delivery-immunology axes. **Pre-existing humoral immunity** (B-cell / NAb) to a
|
|
66
|
+
viral capsid is the one axis that *cannot* be computed from sequence — it is a population prevalence from
|
|
67
|
+
natural exposure — so v5.5 grounds it in published **serosurvey data** (AAV: Calcedo 2009 / Boutin 2010;
|
|
68
|
+
adenovirus: Mast 2010; HSV-1: Looker 2015). `preexisting_score = 1 − midpoint(seroprevalence)/100`, with the
|
|
69
|
+
literature range surfaced as native uncertainty.
|
|
70
|
+
|
|
71
|
+
| serotype (vehicle) | NAb seroprevalence | pre-existing score |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| Ad5 → HDAd | 40–90% | 0.35 |
|
|
74
|
+
| AAV (aggregate) → AAV | 30–60% | 0.55 |
|
|
75
|
+
| HSV-1 → HSV | 50–70% | 0.40 |
|
|
76
|
+
| VSV → lentivirus | 0–5% | 0.975 |
|
|
77
|
+
|
|
78
|
+
Folded into the pre-existing axis for **in-vivo** vehicles (muted for ex-vivo, where serum NAb can't reach
|
|
79
|
+
ex-vivo cells); non-viral → 1.0 by mechanism. It is a **population** prevalence — **not** a given patient's NAb
|
|
80
|
+
titer (a known-unknown). See `pen_stack/planner/seroprevalence_oracle.py`, `configs/seroprevalence.yaml`,
|
|
81
|
+
`prereg/ws_seroprev.yaml`, and the `seroprevalence` scope card.
|
|
82
|
+
|
|
83
|
+
**With v5.5, four of the five delivery-immunology axes are grounded in data or sequence** — genotoxicity
|
|
84
|
+
(VISDB×COSMIC), adaptive/CD8 (MHCflurry), innate (CpG/dsRNA), pre-existing/NAb (serosurveys) — each abstaining
|
|
85
|
+
rather than fabricating, with the in-vivo *magnitude* always a declared known-unknown.
|
|
86
|
+
|
|
63
87
|
## What is new in v5.4 — Computed innate-sensing scorer (completes the computable immune axes)
|
|
64
88
|
|
|
65
89
|
The third computed delivery-immunology signal (after v5.2 genotoxicity and v5.3 capsid epitope load). Innate
|
|
@@ -152,3 +152,17 @@ oracles:
|
|
|
152
152
|
generalizes_to_unseen_loci: false
|
|
153
153
|
license: "open (this work; CpG-TLR9 10.1073/pnas.161293498, CpG-depleted AAV 10.1172/JCI68205,
|
|
154
154
|
RNA modification 10.1016/j.immuni.2005.06.008)"
|
|
155
|
+
|
|
156
|
+
seroprevalence: # v5.5 WS-SEROPREV: anti-vector NAb seroprevalence from serosurvey data
|
|
157
|
+
family: genome
|
|
158
|
+
version: "serosurvey-2026"
|
|
159
|
+
output_kind: baseline # curated empirical population data, not a model
|
|
160
|
+
valid_for: "POPULATION pre-existing neutralizing-antibody seroprevalence per capsid serotype, from published
|
|
161
|
+
serosurveys (AAV Calcedo/Boutin, Ad5 Mast, HSV-1 Looker); preexisting_score = 1 - midpoint/100. The one
|
|
162
|
+
immune axis that is empirical, not sequence-computable"
|
|
163
|
+
not_valid_for: "a given PATIENT's NAb titer / sero-status (a clinical test, patient-specific -> a
|
|
164
|
+
known-unknown); precise region/age/assay-specific values (a range, not a point); functional-NAb vs
|
|
165
|
+
IgG-binding distinctions; T-cell immunity (that is the capsid_epitope oracle); anti-PEG immunity"
|
|
166
|
+
generalizes_to_unseen_loci: false
|
|
167
|
+
license: "open (this work; Calcedo 10.1086/595830, Boutin 10.1089/hum.2009.182, Mast
|
|
168
|
+
10.1016/j.vaccine.2009.10.145, Looker 10.1371/journal.pone.0140765)"
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# PEN-STACK v5.5 - anti-vector neutralizing-antibody SEROPREVALENCE (WS-SEROPREV).
|
|
2
|
+
#
|
|
3
|
+
# Pre-existing humoral immunity to a viral capsid is the one immune axis that CANNOT be computed from sequence:
|
|
4
|
+
# it is the prevalence, in a population, of people who already carry neutralizing antibodies against the vector
|
|
5
|
+
# from natural exposure. The only honest grounding is published serosurvey DATA. This table curates the
|
|
6
|
+
# population NAb/IgG seroprevalence per serotype from canonical serosurveys, as RANGES (the literature varies by
|
|
7
|
+
# region, age, and assay - IgG-binding vs functional-NAb), each with >=1 DOI.
|
|
8
|
+
#
|
|
9
|
+
# preexisting_score = 1 - midpoint(seroprevalence_pct)/100 (1 = fewest patients excluded by pre-existing NAb).
|
|
10
|
+
#
|
|
11
|
+
# HONESTY (scope card `seroprevalence`): this is a POPULATION prevalence, NOT a given patient's NAb titer (that
|
|
12
|
+
# is a clinical test, patient-specific -> a known-unknown); it is region/age/assay-dependent (ranges, not point
|
|
13
|
+
# values); and it is the pre-existing HUMORAL axis only (B-cell / antibody), distinct from the T-cell epitope
|
|
14
|
+
# load computed in v5.3.
|
|
15
|
+
|
|
16
|
+
version: "1.0"
|
|
17
|
+
|
|
18
|
+
serotypes:
|
|
19
|
+
AAV_aggregate: # serotype-agnostic AAV (AAV_single / AAV_dual): across common serotypes
|
|
20
|
+
nab_seroprevalence_pct: [30, 60]
|
|
21
|
+
note: "serotype- and region-dependent; AAV2 highest, AAV8/9 lower"
|
|
22
|
+
dois: ["10.1086/595830", "10.1089/hum.2009.182"]
|
|
23
|
+
AAV2:
|
|
24
|
+
nab_seroprevalence_pct: [50, 72]
|
|
25
|
+
note: "highest of the common serotypes (Calcedo ~72%, Boutin IgG ~67%)"
|
|
26
|
+
dois: ["10.1086/595830", "10.1089/hum.2009.182"]
|
|
27
|
+
AAV1:
|
|
28
|
+
nab_seroprevalence_pct: [50, 67]
|
|
29
|
+
dois: ["10.1089/hum.2009.182"]
|
|
30
|
+
AAV5:
|
|
31
|
+
nab_seroprevalence_pct: [30, 40]
|
|
32
|
+
dois: ["10.1089/hum.2009.182", "10.1086/595830"]
|
|
33
|
+
AAV6:
|
|
34
|
+
nab_seroprevalence_pct: [30, 46]
|
|
35
|
+
dois: ["10.1089/hum.2009.182"]
|
|
36
|
+
AAV8:
|
|
37
|
+
nab_seroprevalence_pct: [20, 40]
|
|
38
|
+
note: "lower pre-existing immunity (Calcedo ~38%)"
|
|
39
|
+
dois: ["10.1086/595830", "10.1089/hum.2009.182"]
|
|
40
|
+
AAV9:
|
|
41
|
+
nab_seroprevalence_pct: [30, 50]
|
|
42
|
+
dois: ["10.1086/595830"]
|
|
43
|
+
Ad5:
|
|
44
|
+
nab_seroprevalence_pct: [40, 90]
|
|
45
|
+
note: "very high and strongly region-dependent (highest in sub-Saharan Africa); Mast 2010"
|
|
46
|
+
dois: ["10.1016/j.vaccine.2009.10.145"]
|
|
47
|
+
HSV1:
|
|
48
|
+
nab_seroprevalence_pct: [50, 70]
|
|
49
|
+
note: "global adult HSV-1 seroprevalence (Looker 2015, ages 0-49 ~67%)"
|
|
50
|
+
dois: ["10.1371/journal.pone.0140765"]
|
|
51
|
+
VSV:
|
|
52
|
+
nab_seroprevalence_pct: [0, 5]
|
|
53
|
+
note: "VSV is not endemic in humans -> negligible pre-existing immunity to VSV-G-pseudotyped lentivirus"
|
|
54
|
+
dois: ["10.1038/mt.2011.287"]
|
|
55
|
+
|
|
56
|
+
# which serotype grounds each vehicle's pre-existing-immunity axis. Non-viral vehicles carry no foreign capsid
|
|
57
|
+
# -> no pre-existing ANTI-VECTOR humoral immunity (anti-PEG for LNP is an emerging, separate exception).
|
|
58
|
+
vehicle_serotype:
|
|
59
|
+
AAV_single: AAV_aggregate
|
|
60
|
+
AAV_dual: AAV_aggregate
|
|
61
|
+
helper_dependent_adenovirus: Ad5
|
|
62
|
+
hsv_amplicon: HSV1
|
|
63
|
+
lentivirus: VSV
|
|
64
|
+
non_viral: [lnp_mrna, evlp, electroporation]
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""PEN-STACK v3.0 - open infrastructure for genome writing."""
|
|
2
|
-
__version__ = "5.
|
|
2
|
+
__version__ = "5.5.0"
|
|
@@ -39,6 +39,13 @@ def curated_dois() -> frozenset[str]:
|
|
|
39
39
|
# v5.4 computed innate-sensing provenance (CpG-TLR9 / AAV CpG-depletion / RNA modification)
|
|
40
40
|
from pen_stack.planner.innate_sensing import PROVENANCE_DOIS as _innate_dois
|
|
41
41
|
dois.update(_innate_dois)
|
|
42
|
+
# v5.5 anti-vector seroprevalence provenance (serosurveys)
|
|
43
|
+
try:
|
|
44
|
+
sp = yaml.safe_load(resource("configs/seroprevalence.yaml").read_text(encoding="utf-8"))
|
|
45
|
+
for _rec in (sp.get("serotypes") or {}).values():
|
|
46
|
+
dois.update(_rec.get("dois", []) or [])
|
|
47
|
+
except FileNotFoundError:
|
|
48
|
+
pass
|
|
42
49
|
gsh = yaml.safe_load(resource("configs/gsh_validated_heldout.yaml").read_text(encoding="utf-8"))["gsh"]
|
|
43
50
|
for g in gsh:
|
|
44
51
|
if g.get("doi"):
|
|
@@ -78,6 +78,17 @@ def safety_efficacy_profile(name: str) -> dict | None:
|
|
|
78
78
|
adaptive_source = "computed"
|
|
79
79
|
elif cap_score is not None and not in_vivo:
|
|
80
80
|
adaptive_source = "computed_ex_vivo_muted" # reported, but ex-vivo mutes the realized response
|
|
81
|
+
# PRE-EXISTING immunity (B-cell / NAb): grounded in published serosurvey data (v5.5 WS-SEROPREV). Folded
|
|
82
|
+
# only for IN-VIVO vehicles (serum NAb neutralises the vector in vivo; ex-vivo transduction in a dish is
|
|
83
|
+
# not reached by host antibody, so for ex-vivo vehicles it is reported but muted).
|
|
84
|
+
from pen_stack.planner.seroprevalence_oracle import computed_preexisting_score
|
|
85
|
+
pre_score, pre_oracle = computed_preexisting_score(name)
|
|
86
|
+
preexisting_source = "documented"
|
|
87
|
+
if pre_score is not None and in_vivo:
|
|
88
|
+
axis_scores["preexisting_immunity"] = pre_score
|
|
89
|
+
preexisting_source = "computed"
|
|
90
|
+
elif pre_score is not None and not in_vivo:
|
|
91
|
+
preexisting_source = "computed_ex_vivo_muted"
|
|
81
92
|
immune_present = [s for s in axis_scores.values() if s is not None]
|
|
82
93
|
immune_score = (sum(immune_present) / len(immune_present)) if immune_present else None
|
|
83
94
|
# genotoxicity: prefer the COMPUTED oracle (v5.2 WS-GENOTOX: integration-site x COSMIC-oncogene
|
|
@@ -102,6 +113,9 @@ def safety_efficacy_profile(name: str) -> dict | None:
|
|
|
102
113
|
"adaptive_source": adaptive_source, # computed | computed_ex_vivo_muted | documented
|
|
103
114
|
"capsid_presentability_score": _r(cap_score), # computed intrinsic capsid CD8 presentability (or None)
|
|
104
115
|
"adaptive_provenance": (cap_oracle.note if cap_score is not None else None),
|
|
116
|
+
"preexisting_source": preexisting_source, # computed | computed_ex_vivo_muted | documented
|
|
117
|
+
"seroprevalence_score": _r(pre_score), # computed pre-existing-NAb score (or None)
|
|
118
|
+
"preexisting_provenance": (pre_oracle.note if pre_score is not None else None),
|
|
105
119
|
"genotox_score": _r(genotox_score),
|
|
106
120
|
"genotox_source": genotox_source, # "computed" (VISDBxCOSMIC oracle) | "documented" (ordinal tier)
|
|
107
121
|
"genotox_provenance": (gtox_oracle.note if genotox_source == "computed" else None),
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""Anti-vector neutralizing-antibody seroprevalence oracle (v5.5, WS-SEROPREV).
|
|
2
|
+
|
|
3
|
+
The last computable delivery-immunology axis: PRE-EXISTING humoral immunity (B-cell / neutralizing antibody)
|
|
4
|
+
to a viral capsid. Unlike genotoxicity (v5.2), capsid T-cell epitope load (v5.3) and innate sensing (v5.4),
|
|
5
|
+
this CANNOT be computed from sequence - it is the prevalence, in a population, of people who already carry
|
|
6
|
+
NAbs against the vector from natural exposure. The honest grounding is published serosurvey DATA
|
|
7
|
+
(configs/seroprevalence.yaml), curated as ranges with provenance.
|
|
8
|
+
|
|
9
|
+
preexisting_score = 1 - midpoint(seroprevalence_pct) / 100 # 1 = fewest patients excluded by NAb
|
|
10
|
+
|
|
11
|
+
Answers through the v4.0 OracleResult contract (output_kind="baseline"). Non-viral vehicles carry no foreign
|
|
12
|
+
capsid -> no pre-existing ANTI-VECTOR humoral immunity (score 1.0 by mechanism). HONESTY: a POPULATION
|
|
13
|
+
prevalence, NOT a given patient's NAb titer (a known-unknown); region/age/assay-dependent (a range, surfaced);
|
|
14
|
+
the humoral (B-cell) axis only - distinct from the T-cell epitope load of v5.3.
|
|
15
|
+
"""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
from functools import lru_cache
|
|
19
|
+
|
|
20
|
+
import yaml
|
|
21
|
+
|
|
22
|
+
from pen_stack._resources import resource
|
|
23
|
+
from pen_stack.oracles.schema import OracleResult, Provenance
|
|
24
|
+
|
|
25
|
+
_SCOPE_CARD = "seroprevalence"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@lru_cache(maxsize=1)
|
|
29
|
+
def _table() -> dict:
|
|
30
|
+
return yaml.safe_load(resource("configs/seroprevalence.yaml").read_text(encoding="utf-8"))
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _all_dois() -> list[str]:
|
|
34
|
+
dois: set[str] = set()
|
|
35
|
+
for rec in (_table().get("serotypes") or {}).values():
|
|
36
|
+
dois.update(rec.get("dois", []) or [])
|
|
37
|
+
return sorted(dois)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _prov(**extra) -> Provenance:
|
|
41
|
+
return Provenance(model="anti_vector_seroprevalence", version=str(_table().get("version", "1.0")),
|
|
42
|
+
source="cache", extra=extra)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def seroprevalence_oracle(vehicle_name: str, serotype: str | None = None) -> OracleResult:
|
|
46
|
+
"""Pre-existing anti-vector NAb seroprevalence for a vehicle (or an explicit serotype), as an OracleResult.
|
|
47
|
+
|
|
48
|
+
- viral vehicle (or serotype) with curated data -> preexisting_score = 1 - midpoint(seroprevalence)/100.
|
|
49
|
+
- non-viral vehicle -> 1.0 by mechanism (no foreign capsid).
|
|
50
|
+
- unknown vehicle / no curated serotype -> available=False (caller falls back to the documented tier).
|
|
51
|
+
Never fabricates a number."""
|
|
52
|
+
t = _table()
|
|
53
|
+
sero = t.get("serotypes") or {}
|
|
54
|
+
key = serotype or (t.get("vehicle_serotype") or {}).get(vehicle_name)
|
|
55
|
+
|
|
56
|
+
if key and key in sero:
|
|
57
|
+
rec = sero[key]
|
|
58
|
+
lo, hi = rec["nab_seroprevalence_pct"]
|
|
59
|
+
mid = (lo + hi) / 2.0
|
|
60
|
+
score = max(0.0, min(1.0, 1.0 - mid / 100.0))
|
|
61
|
+
return OracleResult(
|
|
62
|
+
oracle="genome",
|
|
63
|
+
value={"preexisting_score": round(score, 3), "serotype": key,
|
|
64
|
+
"nab_seroprevalence_pct": [lo, hi], "midpoint_pct": mid, "dois": rec.get("dois", [])},
|
|
65
|
+
provenance=_prov(serotype=key, dois=rec.get("dois", [])), native_uncertainty=round((hi - lo) / 200.0, 4),
|
|
66
|
+
scope_card=_SCOPE_CARD, in_scope=True, extrapolating=False, output_kind="baseline", available=True,
|
|
67
|
+
note=(f"{key}: documented NAb seroprevalence {lo}-{hi}% (population); preexisting_score="
|
|
68
|
+
f"1-midpoint/100={score:.3f}. " + (rec.get("note", "") + " " if rec.get("note") else "")
|
|
69
|
+
+ "A POPULATION prevalence, region/age/assay-dependent - NOT a given patient's NAb titer "
|
|
70
|
+
"(a known-unknown)."))
|
|
71
|
+
|
|
72
|
+
if vehicle_name in (t.get("non_viral") or []):
|
|
73
|
+
return OracleResult(
|
|
74
|
+
oracle="genome",
|
|
75
|
+
value={"preexisting_score": 1.0, "serotype": None, "mechanism": "non-viral"},
|
|
76
|
+
provenance=_prov(), native_uncertainty=0.0, scope_card=_SCOPE_CARD, in_scope=True,
|
|
77
|
+
extrapolating=False, output_kind="baseline", available=True,
|
|
78
|
+
note="non-viral vehicle: no foreign capsid -> no pre-existing ANTI-VECTOR humoral immunity (1.0). "
|
|
79
|
+
"Anti-PEG immunity for LNP is an emerging, separate exception (not a vector seroprevalence).")
|
|
80
|
+
|
|
81
|
+
return OracleResult(oracle="genome", value=None, provenance=_prov(), scope_card=_SCOPE_CARD,
|
|
82
|
+
in_scope=False, available=False, output_kind="baseline",
|
|
83
|
+
note=f"no curated seroprevalence for {vehicle_name!r}; fall back to the documented "
|
|
84
|
+
"preexisting_immunity tier.")
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def computed_preexisting_score(vehicle_name: str, serotype: str | None = None) -> tuple[float | None, OracleResult]:
|
|
88
|
+
"""Convenience: (preexisting_score or None, full OracleResult). None when the oracle abstains. Never
|
|
89
|
+
fabricates."""
|
|
90
|
+
r = seroprevalence_oracle(vehicle_name, serotype)
|
|
91
|
+
val = (r.value or {}).get("preexisting_score") if (r.available and r.value) else None
|
|
92
|
+
return val, r
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 5.
|
|
3
|
+
Version: 5.5.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
|
|
@@ -91,7 +91,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
91
91
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
92
92
|
[](LICENSE)
|
|
93
93
|
[](https://www.python.org/)
|
|
94
|
-
[](CHANGELOG.md)
|
|
95
95
|
[](tests/)
|
|
96
96
|
[](https://github.com/astral-sh/ruff)
|
|
97
97
|
[](docker/)
|
|
@@ -135,6 +135,30 @@ Two questions gate every genome-writing project, and before PEN-STACK no resourc
|
|
|
135
135
|
Everything is built on bulk-downloadable public data, runs on a single GPU, and is validated **blind** against
|
|
136
136
|
a pre-registered, honest baseline before release.
|
|
137
137
|
|
|
138
|
+
## What is new in v5.5 — Anti-vector seroprevalence oracle (the last immune axis, from data)
|
|
139
|
+
|
|
140
|
+
This completes the computable delivery-immunology axes. **Pre-existing humoral immunity** (B-cell / NAb) to a
|
|
141
|
+
viral capsid is the one axis that *cannot* be computed from sequence — it is a population prevalence from
|
|
142
|
+
natural exposure — so v5.5 grounds it in published **serosurvey data** (AAV: Calcedo 2009 / Boutin 2010;
|
|
143
|
+
adenovirus: Mast 2010; HSV-1: Looker 2015). `preexisting_score = 1 − midpoint(seroprevalence)/100`, with the
|
|
144
|
+
literature range surfaced as native uncertainty.
|
|
145
|
+
|
|
146
|
+
| serotype (vehicle) | NAb seroprevalence | pre-existing score |
|
|
147
|
+
|---|---|---|
|
|
148
|
+
| Ad5 → HDAd | 40–90% | 0.35 |
|
|
149
|
+
| AAV (aggregate) → AAV | 30–60% | 0.55 |
|
|
150
|
+
| HSV-1 → HSV | 50–70% | 0.40 |
|
|
151
|
+
| VSV → lentivirus | 0–5% | 0.975 |
|
|
152
|
+
|
|
153
|
+
Folded into the pre-existing axis for **in-vivo** vehicles (muted for ex-vivo, where serum NAb can't reach
|
|
154
|
+
ex-vivo cells); non-viral → 1.0 by mechanism. It is a **population** prevalence — **not** a given patient's NAb
|
|
155
|
+
titer (a known-unknown). See `pen_stack/planner/seroprevalence_oracle.py`, `configs/seroprevalence.yaml`,
|
|
156
|
+
`prereg/ws_seroprev.yaml`, and the `seroprevalence` scope card.
|
|
157
|
+
|
|
158
|
+
**With v5.5, four of the five delivery-immunology axes are grounded in data or sequence** — genotoxicity
|
|
159
|
+
(VISDB×COSMIC), adaptive/CD8 (MHCflurry), innate (CpG/dsRNA), pre-existing/NAb (serosurveys) — each abstaining
|
|
160
|
+
rather than fabricating, with the in-vivo *magnitude* always a declared known-unknown.
|
|
161
|
+
|
|
138
162
|
## What is new in v5.4 — Computed innate-sensing scorer (completes the computable immune axes)
|
|
139
163
|
|
|
140
164
|
The third computed delivery-immunology signal (after v5.2 genotoxicity and v5.3 capsid epitope load). Innate
|
|
@@ -28,6 +28,7 @@ configs/known_unknowns.yaml
|
|
|
28
28
|
configs/llm.yaml
|
|
29
29
|
configs/monitor_queries.yaml
|
|
30
30
|
configs/score_axes.yaml
|
|
31
|
+
configs/seroprevalence.yaml
|
|
31
32
|
configs/target_sites.yaml
|
|
32
33
|
configs/universe_crosswalk.yaml
|
|
33
34
|
configs/write_types.yaml
|
|
@@ -166,6 +167,7 @@ pen_stack/planner/optimize.py
|
|
|
166
167
|
pen_stack/planner/pipeline.py
|
|
167
168
|
pen_stack/planner/report.py
|
|
168
169
|
pen_stack/planner/router.py
|
|
170
|
+
pen_stack/planner/seroprevalence_oracle.py
|
|
169
171
|
pen_stack/planner/target_site.py
|
|
170
172
|
pen_stack/rag/__init__.py
|
|
171
173
|
pen_stack/rag/index.py
|
|
@@ -261,6 +263,7 @@ prereg/SHA256_LOCK_ws_o.json
|
|
|
261
263
|
prereg/SHA256_LOCK_ws_plan.json
|
|
262
264
|
prereg/SHA256_LOCK_ws_r.json
|
|
263
265
|
prereg/SHA256_LOCK_ws_route.json
|
|
266
|
+
prereg/SHA256_LOCK_ws_seroprev.json
|
|
264
267
|
prereg/SHA256_LOCK_ws_uq.json
|
|
265
268
|
prereg/SHA256_LOCK_ws_v.json
|
|
266
269
|
prereg/SHA256_LOCK_ws_wv.json
|
|
@@ -299,6 +302,7 @@ prereg/ws_o.yaml
|
|
|
299
302
|
prereg/ws_plan.yaml
|
|
300
303
|
prereg/ws_r.yaml
|
|
301
304
|
prereg/ws_route.yaml
|
|
305
|
+
prereg/ws_seroprev.yaml
|
|
302
306
|
prereg/ws_uq.yaml
|
|
303
307
|
prereg/ws_v.yaml
|
|
304
308
|
prereg/ws_wv.yaml
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# PEN-STACK v5.5 - WS-SEROPREV (anti-vector neutralizing-antibody seroprevalence). Directional.
|
|
2
|
+
cycle: "v5.5"
|
|
3
|
+
workstream: "WS-SEROPREV"
|
|
4
|
+
prepared: "2026-06-10"
|
|
5
|
+
|
|
6
|
+
motivation: >
|
|
7
|
+
Completes the computable delivery-immunology axes (after v5.2 genotoxicity, v5.3 capsid epitope load, v5.4
|
|
8
|
+
innate sensing). PRE-EXISTING humoral immunity (B-cell / NAb) to a viral capsid is the one immune axis that
|
|
9
|
+
CANNOT be computed from sequence - it is a POPULATION prevalence from natural exposure. The honest grounding
|
|
10
|
+
is published serosurvey DATA.
|
|
11
|
+
|
|
12
|
+
deliverable: >
|
|
13
|
+
configs/seroprevalence.yaml (curated per-serotype NAb seroprevalence ranges + DOIs); pen_stack/planner/
|
|
14
|
+
seroprevalence_oracle.py (OracleResult); wired into delivery_immunology.safety_efficacy_profile
|
|
15
|
+
preexisting_immunity axis; scope card `seroprevalence`.
|
|
16
|
+
|
|
17
|
+
method: >
|
|
18
|
+
Curate published population NAb/IgG seroprevalence per serotype as RANGES (region/age/assay variation), each
|
|
19
|
+
with >=1 DOI: AAV (Calcedo 2009 [10.1086/595830], Boutin 2010 [10.1089/hum.2009.182]); adenovirus type 5
|
|
20
|
+
(Mast 2010 [10.1016/j.vaccine.2009.10.145]); HSV-1 (Looker 2015 [10.1371/journal.pone.0140765]); VSV
|
|
21
|
+
(negligible). preexisting_score = 1 - midpoint(seroprevalence_pct)/100; native_uncertainty = range half-width.
|
|
22
|
+
v4.0 OracleResult (output_kind="baseline"). Folded into the preexisting axis ONLY for IN-VIVO vehicles (serum
|
|
23
|
+
NAb neutralises the vector in vivo; ex-vivo transduction in a dish is not reached by host antibody -> reported
|
|
24
|
+
but muted). Non-viral vehicles: 1.0 by mechanism (no foreign capsid).
|
|
25
|
+
|
|
26
|
+
acceptance: >
|
|
27
|
+
(1) per-serotype seroprevalence maps to a pre-existing score (1 - midpoint/100), with the range surfaced as
|
|
28
|
+
native uncertainty. (2) the ordering matches the literature: adenovirus (highest pre-existing immunity) <
|
|
29
|
+
AAV < VSV (lowest) by score. (3) an explicit serotype overrides the vehicle default (AAV8 > AAV2 score).
|
|
30
|
+
(4) non-viral -> 1.0 by mechanism; unknown vehicle -> ABSTAINS (never fabricates). (5) folds for in-vivo /
|
|
31
|
+
muted for ex-vivo. (6) provenance DOIs Crossref-verified + curated.
|
|
32
|
+
|
|
33
|
+
honesty_invariant: >
|
|
34
|
+
A POPULATION prevalence (a range, region/age/assay-dependent), NOT a given PATIENT's NAb titer / sero-status
|
|
35
|
+
(a clinical test, patient-specific -> a known-unknown); the HUMORAL (B-cell) axis only, distinct from the
|
|
36
|
+
v5.3 T-cell epitope load; anti-PEG immunity is a separate emerging exception. No patient-specific magnitude
|
|
37
|
+
predicted.
|
|
38
|
+
|
|
39
|
+
gate: "per-serotype seroprevalence -> pre-existing score with range; Ad>AAV>VSV ordering; serotype override; non-viral 1.0; abstains not fabricates; in-vivo folds/ex-vivo muted; provenance curated; no-fabrication intact."
|
|
40
|
+
locked_files: [prereg/ws_seroprev.yaml]
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pen-stack"
|
|
7
|
-
version = "5.
|
|
7
|
+
version = "5.5.0"
|
|
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
|