pen-stack 5.4.0__tar.gz → 5.6.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.6.0}/CHANGELOG.md +65 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/CITATION.cff +2 -2
- {pen_stack-5.4.0 → pen_stack-5.6.0}/PKG-INFO +66 -9
- {pen_stack-5.4.0 → pen_stack-5.6.0}/README.md +65 -8
- pen_stack-5.6.0/configs/antipeg.yaml +28 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/known_unknowns.yaml +27 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/oracles/scope_cards.yaml +27 -0
- pen_stack-5.6.0/configs/seroprevalence.yaml +64 -0
- pen_stack-5.6.0/docs/delivery_immunology.md +150 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/index.md +1 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/__init__.py +1 -1
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/agent/cite.py +16 -0
- pen_stack-5.6.0/pen_stack/planner/antipeg_oracle.py +75 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/delivery_immunology.py +14 -0
- pen_stack-5.6.0/pen_stack/planner/immune_profile.py +98 -0
- pen_stack-5.6.0/pen_stack/planner/seroprevalence_oracle.py +92 -0
- pen_stack-5.6.0/pen_stack/validate/immune_calibration.py +122 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/verify/schema.py +3 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/verify/service.py +14 -1
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack.egg-info/PKG-INFO +66 -9
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack.egg-info/SOURCES.txt +15 -0
- pen_stack-5.6.0/prereg/SHA256_LOCK_ws_calib.json +8 -0
- pen_stack-5.6.0/prereg/SHA256_LOCK_ws_peg.json +8 -0
- pen_stack-5.6.0/prereg/SHA256_LOCK_ws_profile.json +8 -0
- pen_stack-5.6.0/prereg/SHA256_LOCK_ws_seroprev.json +8 -0
- pen_stack-5.6.0/prereg/ws_calib.yaml +28 -0
- pen_stack-5.6.0/prereg/ws_peg.yaml +31 -0
- pen_stack-5.6.0/prereg/ws_profile.yaml +32 -0
- pen_stack-5.6.0/prereg/ws_seroprev.yaml +40 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pyproject.toml +1 -1
- {pen_stack-5.4.0 → pen_stack-5.6.0}/LICENSE +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/MANIFEST.in +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/bench/run.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/benchmarks/genome_writing_bench/README.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/atlas_families.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/bridge_offtarget_profile.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/capsid_epitope_oracle.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/capsid_sequences.fasta +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/cargo_polish.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/cell_types.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/datasets.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/delivery_constraints.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/delivery_rules.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/delivery_vehicles.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/gates_v3.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/genotoxicity_oracle.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/gsh_validated_heldout.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/intent_weights.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/llm.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/monitor_queries.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/rules/delivery.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/rules/fold.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/rules/multiplex.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/rules/payload.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/rules/reachability.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/score_axes.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/target_sites.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/universe_crosswalk.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/write_types.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/configs/wtkb_curated.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/data/curated/bridge_offtarget_energetics.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/data/curated/gene_coords.parquet +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/data/curated/unified_editor_universe.parquet +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/BACKLOG.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/DEPLOY.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/INFRA.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/MCP.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/RELEASING.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/REPRO.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/agent.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/alphagenome_feasibility.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/benchmark_circularity.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/cards/atlas.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/cards/durability.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/cards/safety.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/co_scientist.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/delivery.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/dissemination.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/environment.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/mechanistic_constraints.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/oracles.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/positioning.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/private_data_formats.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/quickstart.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/rules.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/scope.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/scorecard.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/tutorials/compare-families.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/tutorials/score-deliverability.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/tutorials/where-can-i-write.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/uncertainty.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/verify.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/world_model.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/writer_verification.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/docs/wtkb.md +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/_resources.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/adapt/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/adapt/finetune.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/adapt/ingest.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/adapt/pipeline.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/adapt/recalibrate.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/adapt/report.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/agent/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/agent/co_scientist.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/agent/epistemic.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/agent/guardrails.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/agent/mcp_server.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/agent/orchestrator.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/agent/pen_agent.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/agent/scope.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/agent/tools.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/atlas/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/atlas/build_wtkb.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/atlas/crosslink.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/atlas/expand.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/atlas/schema.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/atlas/scorecard.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/atlas/universe.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/atlas/variant_propose.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/atlas/writer_verify.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/bridge/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/bridge/activity.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/bridge/cli.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/bridge/fold_qc.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/bridge/guide_qc.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/bridge/ingest.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/bridge/offtarget.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/bridge/ortholog_screen.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/bridge/pipeline.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/cli.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/data/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/data/encode.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/data/genome.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/data/ingest_chromatin.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/data/ingest_integration.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/data/ingest_safety_annot.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/data/ingest_trip.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/env/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/env/genome_writing_env.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/env/policies.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/graph/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/graph/build.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/graph/cell_types.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/graph/ingest.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/graph/query.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/graph/schema.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/mech/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/mech/classify_atlas.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/mech/whitelist.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/monitor/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/monitor/europepmc.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/monitor/run.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/monitor/triage.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/oracles/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/oracles/cache.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/oracles/energetics.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/oracles/genome.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/oracles/protein_design.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/oracles/rna.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/oracles/schema.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/oracles/structure.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/cargo.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/cargo_polish.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/delivery.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/delivery_constraints.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/delivery_vehicles.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/genotoxicity_oracle.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/innate_sensing.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/multiplex.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/optimize.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/pipeline.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/report.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/router.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/planner/target_site.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/rag/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/rag/index.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/rag/llm.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/rag/qa.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/rules/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/rules/evaluators.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/rules/loader.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/rules/schema.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/rules/solver.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/score/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/score/recalibrate.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/score/therapeutic.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/server/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/server/api.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/ui/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/ui/app.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/adapt_demo.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/agent_eval.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/cargo_directionality.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/durability_baselines.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/forward_hypotheses.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/guide_qc_demo.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/intent_specification.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/outcome_calibration.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/paper3_benchmark.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/paper4_real_validation.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/paper4_validation.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/selective_prediction.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/seq_vs_measured.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/target_site_controls.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/uncertainty_eval.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/within_locus_ranking.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/validate/writer_recovery.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/verify/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/wgenome/__init__.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/wgenome/durability.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/wgenome/export_tracks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/wgenome/features.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/wgenome/mesh_features.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/wgenome/ood.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/wgenome/providers.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/wgenome/safety.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/wgenome/structure3d.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/wgenome/uncertainty.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack/wgenome/writability.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack.egg-info/dependency_links.txt +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack.egg-info/entry_points.txt +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack.egg-info/requires.txt +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/pen_stack.egg-info/top_level.txt +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_phase0.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_phase2.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_phase3.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/paper1.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/paper2.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/paper3.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/paper4.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/phase0.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_a.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_atlas.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_b.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_ba.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_ba_v33.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_ba_v45.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_bench.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_c.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_cal.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_cite.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_crit.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_ct.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_d.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_e.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_env.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_ep.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_epitope.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_f.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_g.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_genotox.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_graph.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_h.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_immune.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_innate.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_mc.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_mon.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_o.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_plan.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_r.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_route.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_uq.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_v.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/prereg/ws_wv.yaml +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/scripts/p1_build_atlas.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/scripts/p1_build_durability.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/scripts/p1_export_tracks.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/scripts/p1_safety_concordance.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/scripts/p1_train_safety.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/scripts/p1_validation_report.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/scripts/p2_build_atlas.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/scripts/p3_benchmark_report.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/scripts/p4_genome_scan.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/scripts/p52_build_genotox_oracle.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/scripts/p53_build_epitope_oracle.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/scripts/ws_b_report.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/scripts/ws_c_report.py +0 -0
- {pen_stack-5.4.0 → pen_stack-5.6.0}/setup.cfg +0 -0
|
@@ -3,6 +3,71 @@
|
|
|
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.6.0] - 2026-06-11 - v5.6 release: Immunology completion & calibration (anti-PEG · proxy honesty · unified profile)
|
|
7
|
+
|
|
8
|
+
Finishes the delivery-immunology arc (v5.1–v5.5): adds the missing **anti-PEG** axis, **calibrates** the
|
|
9
|
+
proxies honestly, and exposes a **unified per-design immune-risk profile** that never collapses into one number.
|
|
10
|
+
Workstreams WS-{PEG,CALIB,PROFILE} (+ optional WS-EXT), SHA-locked.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **WS-PEG** — `pen_stack/planner/antipeg_oracle.py` + `configs/antipeg.yaml`: pre-existing/induced anti-PEG
|
|
14
|
+
antibodies gate **re-dosing** of PEGylated LNP. Population prevalence range (25–72 %) →
|
|
15
|
+
`preexisting_antipeg_score = 1 − midpoint/100`, range surfaced as `native_uncertainty`; **abstains** for
|
|
16
|
+
non-PEGylated vehicles. Serosurvey DOIs Crossref-verified (Chen 2016 `10.1021/acs.analchem.6b03109`, Yang &
|
|
17
|
+
Lai `10.1002/wnan.1339`, Armstrong `10.1002/cncr.22739`, Kozma `10.1016/j.addr.2020.07.024`). Scope card `antipeg`.
|
|
18
|
+
- **WS-CALIB** — `pen_stack/validate/immune_calibration.py`: `calibrate_axis()` (Spearman ρ + percentile
|
|
19
|
+
bootstrap CI) labels an axis **outcome-validated only when the CI excludes zero**, else `weak_proxy`, and
|
|
20
|
+
`mechanistic_proxy` when N < 6. With no sufficient public paired (proxy, observed) dataset, **every axis is
|
|
21
|
+
honestly labelled a mechanistic/population proxy** — the label travels with the profile. (No fabricated
|
|
22
|
+
outcome data; machinery proven on synthetic input.)
|
|
23
|
+
- **WS-PROFILE** — `pen_stack/planner/immune_profile.py` + **`Verdict.immune_profile`**: a per-design **vector**
|
|
24
|
+
of all axes (genotoxicity, CD8 epitope, innate, pre-existing NAb, anti-PEG), each with its own value +
|
|
25
|
+
uncertainty + scope + validation label. **`collapsed_score is None`** (never fused — asserted); known-unknowns
|
|
26
|
+
listed; abstaining axes report `None`.
|
|
27
|
+
- **WS-EXT** — a documented qualitative **route/immune-privilege modifier** (eye/CNS lower realized
|
|
28
|
+
immunogenicity vs systemic; Streilein 2003 `10.1038/nri1224`; no fabricated magnitude); **CD4/MHC-II helper
|
|
29
|
+
epitopes**, **pre-existing capsid-specific T-cell immunity**, and **complement/CARPA** registered as
|
|
30
|
+
known-unknowns. `prereg/ws_{peg,calib,profile}.yaml` + SHA locks.
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
- Version 5.5.0 -> 5.6.0 (minor — additive); `cite.curated_dois()` ingests the anti-PEG + immune-privilege DOIs.
|
|
34
|
+
|
|
35
|
+
### Honesty invariant (unchanged)
|
|
36
|
+
- Every axis is a **relative-risk screen** (sequence/mechanistic or population proxy), labelled as such until
|
|
37
|
+
outcome-validated; the profile is **never** collapsed into one number; patient-specific titer, post-dose-1
|
|
38
|
+
induced immunity, and exact in-vivo magnitude stay **known-unknowns**.
|
|
39
|
+
|
|
40
|
+
## [5.5.0] - 2026-06-10 - v5.5 release: Anti-vector seroprevalence oracle (the last immune axis, from data)
|
|
41
|
+
|
|
42
|
+
Completes the computable delivery-immunology axes. **Pre-existing humoral immunity** (B-cell / neutralizing
|
|
43
|
+
antibody) to a viral capsid is the one immune axis that *cannot* be computed from sequence — it is a population
|
|
44
|
+
prevalence from natural exposure. v5.5 grounds it in published **serosurvey data**. Workstream WS-SEROPREV,
|
|
45
|
+
SHA-locked.
|
|
46
|
+
|
|
47
|
+
### Added
|
|
48
|
+
- **WS-SEROPREV table** — `configs/seroprevalence.yaml`: curated population NAb/IgG seroprevalence per serotype
|
|
49
|
+
as **ranges** (region/age/assay variation) with DOIs — AAV (Calcedo 2009, Boutin 2010), adenovirus type 5
|
|
50
|
+
(Mast 2010), HSV-1 (Looker 2015), VSV (negligible).
|
|
51
|
+
- **WS-SEROPREV oracle** — `pen_stack/planner/seroprevalence_oracle.py`: `seroprevalence_oracle(vehicle,
|
|
52
|
+
serotype=None)` → `OracleResult`. `preexisting_score = 1 − midpoint(seroprevalence)/100`; the range width is
|
|
53
|
+
surfaced as `native_uncertainty`. Non-viral → 1.0 by mechanism; unknown → **abstains**.
|
|
54
|
+
- **Wired into the pre-existing axis** — `safety_efficacy_profile()` folds the computed seroprevalence score
|
|
55
|
+
into the `preexisting_immunity` sub-axis **only for in-vivo vehicles** (serum NAb neutralises the vector in
|
|
56
|
+
vivo; ex-vivo transduction in a dish is not reached by host antibody → reported but muted). `seroprevalence_score`
|
|
57
|
+
surfaces the raw value.
|
|
58
|
+
- **Result (from data):** adenovirus has the highest pre-existing seroprevalence (40–90%, score 0.35), AAV
|
|
59
|
+
intermediate (30–60%, 0.55), VSV/lentivirus negligible (0–5%, 0.975) — the documented ordering quantified
|
|
60
|
+
from serosurveys. `prereg/ws_seroprev.yaml`.
|
|
61
|
+
|
|
62
|
+
### Changed
|
|
63
|
+
- Version 5.4.0 -> 5.5.0 (minor — additive data-grounded oracle); `cite.curated_dois()` ingests the
|
|
64
|
+
seroprevalence DOIs.
|
|
65
|
+
|
|
66
|
+
### Honesty invariant (unchanged)
|
|
67
|
+
- A **population** prevalence (a range; region/age/assay-dependent), **not** a given **patient's** NAb titer /
|
|
68
|
+
sero-status (a clinical test, patient-specific → a known-unknown); the **humoral (B-cell)** axis only,
|
|
69
|
+
distinct from the v5.3 T-cell epitope load. No patient-specific magnitude predicted.
|
|
70
|
+
|
|
6
71
|
## [5.4.0] - 2026-06-10 - v5.4 release: Computed innate-sensing scorer (completes the computable immune axes)
|
|
7
72
|
|
|
8
73
|
The third computed delivery-immunology signal, after v5.2 genotoxicity and v5.3 capsid epitope load. Innate
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
cff-version: 1.2.0
|
|
2
2
|
message: "If you use PEN-STACK, please cite it as below."
|
|
3
3
|
title: "PEN-STACK: open infrastructure for genome writing"
|
|
4
|
-
version: 5.
|
|
5
|
-
date-released: 2026-06-
|
|
4
|
+
version: 5.6.0
|
|
5
|
+
date-released: 2026-06-11
|
|
6
6
|
authors:
|
|
7
7
|
- family-names: "Mahaboob Ali"
|
|
8
8
|
given-names: "Anees Ahmed"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 5.
|
|
3
|
+
Version: 5.6.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
|
|
@@ -87,11 +87,10 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
87
87
|
[](https://pypi.org/project/pen-stack/)
|
|
88
88
|
[](https://github.com/ahmedanees-m/pen-stack/actions/workflows/ci.yml)
|
|
89
89
|
[](https://github.com/ahmedanees-m/pen-stack/actions/workflows/publish.yml)
|
|
90
|
-
[](https://github.com/ahmedanees-m/pen-stack/actions/workflows/ci.yml)
|
|
91
90
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
92
91
|
[](LICENSE)
|
|
93
92
|
[](https://www.python.org/)
|
|
94
|
-
[](CHANGELOG.md)
|
|
95
94
|
[](tests/)
|
|
96
95
|
[](https://github.com/astral-sh/ruff)
|
|
97
96
|
[](docker/)
|
|
@@ -135,6 +134,46 @@ Two questions gate every genome-writing project, and before PEN-STACK no resourc
|
|
|
135
134
|
Everything is built on bulk-downloadable public data, runs on a single GPU, and is validated **blind** against
|
|
136
135
|
a pre-registered, honest baseline before release.
|
|
137
136
|
|
|
137
|
+
## What is new in v5.6 — Immunology completion & calibration (anti-PEG · proxy honesty · unified profile)
|
|
138
|
+
|
|
139
|
+
v5.6 finishes the delivery-immunology arc and tells the truth about it. It adds the missing **anti-PEG** axis
|
|
140
|
+
(gates LNP re-dosing), **calibrates** every proxy two-sided, and exposes a **unified per-design immune-risk
|
|
141
|
+
profile** in which each axis keeps its own uncertainty and none is ever fused into one overconfident number.
|
|
142
|
+
|
|
143
|
+
| Workstream | What it adds | Result |
|
|
144
|
+
|---|---|---|
|
|
145
|
+
| **PEG** | `planner/antipeg_oracle.py` + `configs/antipeg.yaml` | anti-PEG prevalence (25–72%) → `preexisting_antipeg_score`; gates **re-dosing**; abstains for non-PEG vehicles; range surfaced as uncertainty |
|
|
146
|
+
| **CALIB** | `validate/immune_calibration.py` | each axis labelled **outcome-validated** (ρ + CI excluding 0) or **mechanistic/population proxy**; with no public paired-outcome data, all axes are honestly labelled proxies (the label travels with the profile) |
|
|
147
|
+
| **PROFILE** | `planner/immune_profile.py` + `Verdict.immune_profile` | per-design **vector** of all axes, each with value + uncertainty + scope + validation label; **`collapsed_score is None`** (never fused); known-unknowns listed |
|
|
148
|
+
| **EXT** | route/immune-privilege modifier + new known-unknowns | eye/CNS immune-privilege as a *documented qualitative* modifier (no magnitude); CD4/MHC-II, pre-existing capsid T-cell, complement/CARPA registered as known-unknowns |
|
|
149
|
+
|
|
150
|
+
The in-vivo magnitude and patient-specific titer stay declared known-unknowns. See
|
|
151
|
+
[`docs/delivery_immunology.md`](docs/delivery_immunology.md) and `prereg/ws_{peg,calib,profile}.yaml`.
|
|
152
|
+
|
|
153
|
+
## What is new in v5.5 — Anti-vector seroprevalence oracle (the last immune axis, from data)
|
|
154
|
+
|
|
155
|
+
This completes the computable delivery-immunology axes. **Pre-existing humoral immunity** (B-cell / NAb) to a
|
|
156
|
+
viral capsid is the one axis that *cannot* be computed from sequence — it is a population prevalence from
|
|
157
|
+
natural exposure — so v5.5 grounds it in published **serosurvey data** (AAV: Calcedo 2009 / Boutin 2010;
|
|
158
|
+
adenovirus: Mast 2010; HSV-1: Looker 2015). `preexisting_score = 1 − midpoint(seroprevalence)/100`, with the
|
|
159
|
+
literature range surfaced as native uncertainty.
|
|
160
|
+
|
|
161
|
+
| serotype (vehicle) | NAb seroprevalence | pre-existing score |
|
|
162
|
+
|---|---|---|
|
|
163
|
+
| Ad5 → HDAd | 40–90% | 0.35 |
|
|
164
|
+
| AAV (aggregate) → AAV | 30–60% | 0.55 |
|
|
165
|
+
| HSV-1 → HSV | 50–70% | 0.40 |
|
|
166
|
+
| VSV → lentivirus | 0–5% | 0.975 |
|
|
167
|
+
|
|
168
|
+
Folded into the pre-existing axis for **in-vivo** vehicles (muted for ex-vivo, where serum NAb can't reach
|
|
169
|
+
ex-vivo cells); non-viral → 1.0 by mechanism. It is a **population** prevalence — **not** a given patient's NAb
|
|
170
|
+
titer (a known-unknown). See `pen_stack/planner/seroprevalence_oracle.py`, `configs/seroprevalence.yaml`,
|
|
171
|
+
`prereg/ws_seroprev.yaml`, and the `seroprevalence` scope card.
|
|
172
|
+
|
|
173
|
+
**With v5.5, four of the five delivery-immunology axes are grounded in data or sequence** — genotoxicity
|
|
174
|
+
(VISDB×COSMIC), adaptive/CD8 (MHCflurry), innate (CpG/dsRNA), pre-existing/NAb (serosurveys) — each abstaining
|
|
175
|
+
rather than fabricating, with the in-vivo *magnitude* always a declared known-unknown.
|
|
176
|
+
|
|
138
177
|
## What is new in v5.4 — Computed innate-sensing scorer (completes the computable immune axes)
|
|
139
178
|
|
|
140
179
|
The third computed delivery-immunology signal (after v5.2 genotoxicity and v5.3 capsid epitope load). Innate
|
|
@@ -193,6 +232,11 @@ efficacious integrator but its genotoxicity is the dominant concern). Crucially,
|
|
|
193
232
|
**magnitude** stays a declared known-unknown — v5.1 surfaces documented priors, it does **not** predict a
|
|
194
233
|
patient-specific immune response.
|
|
195
234
|
|
|
235
|
+
> **The full delivery-immunology story (v5.1 → v5.5), with every axis, method, and outcome, is in
|
|
236
|
+
> [`docs/delivery_immunology.md`](docs/delivery_immunology.md).** By v5.5, four of the five immune/safety axes
|
|
237
|
+
> are computed from data or sequence (genotoxicity, adaptive/CD8, innate, pre-existing/NAb) rather than
|
|
238
|
+
> hand-typed tiers.
|
|
239
|
+
|
|
196
240
|
| Workstream | What it adds | Result |
|
|
197
241
|
|---|---|---|
|
|
198
242
|
| **IMMUNE config** | `immune_safety` block on all 8 vehicles in `configs/delivery_vehicles.yaml` | documented ordinal (low/moderate/high) priors for pre-existing immunity, neutralizing antibody, innate/adaptive immune, **genotoxicity**, efficacy — every `immune_doi` Crossref-verified and in the curated-DOI set |
|
|
@@ -357,6 +401,10 @@ benchmark with deterministic scorers and no circular labels. See
|
|
|
357
401
|
| off-target + DMS (Perry 2025) |
|
|
358
402
|
+-------------------------------------------------------------------------+
|
|
359
403
|
|
|
404
|
+
Delivery layer (v5.1-5.5, feeds the planner): a safety<->efficacy balance over the 8-vehicle palette,
|
|
405
|
+
with four of five immune/safety axes computed from data/sequence (genotoxicity = VISDB x COSMIC;
|
|
406
|
+
adaptive/CD8 = MHCflurry over the capsid; innate = CpG/dsRNA of the cargo; pre-existing/NAb = serosurveys).
|
|
407
|
+
|
|
360
408
|
Platform services (on top of the validated core): PEN-MONITOR (Europe PMC living database),
|
|
361
409
|
grounded RAG/Q&A, a tool-using agent + MCP server, and a Streamlit web app.
|
|
362
410
|
```
|
|
@@ -371,6 +419,7 @@ PEN-STACK is organised as **two reference layers + one engine + a services layer
|
|
|
371
419
|
| **Writer Atlas** (companion) | `pen_stack.atlas`, `.mech`, `.score` | cross-family enzyme catalogue + Writer-Targeting KB | Paper 2 |
|
|
372
420
|
| **Cross-link** | `pen_stack.atlas.crosslink` | bidirectional writer to locus queries | Paper 2 |
|
|
373
421
|
| **Write Planner** (engine) | `pen_stack.planner` | inverse design, `edit_intent`-conditioned | Paper 3 |
|
|
422
|
+
| **Delivery immunology** (v5.1-5.5) | `pen_stack.planner.delivery_immunology` + `{genotoxicity,capsid_epitope,seroprevalence}_oracle`, `innate_sensing` | safety↔efficacy balance over the 8-vehicle palette; 4 of 5 immune axes **computed from data/sequence**, magnitude stays a known-unknown ([docs](docs/delivery_immunology.md)) | M2 |
|
|
374
423
|
| **Agentic platform** | `pen_stack.agent` | goal to cited, auditable plan; MCP server; one-command deploy | Paper 3 |
|
|
375
424
|
| **Bridge off-target engine** | `pen_stack.bridge` | "CRISPOR for bridge recombinases" + guide QC (v3.1) | Paper 4 |
|
|
376
425
|
| **Genome-Writing Bench** (v3.1) | `benchmarks/`, `bench/run.py` | first writing-side benchmark; deterministic scorers, leaderboard | M2 |
|
|
@@ -495,12 +544,16 @@ pen-stack/
|
|
|
495
544
|
│ ├── planner/ Write Planner (Paper 3): optimize / cargo / cargo_polish / multiplex / pipeline
|
|
496
545
|
│ │ + v3.2 target_site (hard PAM/att/core reject) / delivery_constraints
|
|
497
546
|
│ │ + v3.3 router (write-type dispatch) / delivery_vehicles (8-vehicle palette)
|
|
547
|
+
│ │ + v5.1-5.5 delivery_immunology (safety<->efficacy balance) and the four
|
|
548
|
+
│ │ computed immune-axis oracles: genotoxicity_oracle (VISDB x COSMIC) /
|
|
549
|
+
│ │ capsid_epitope_oracle (MHCflurry) / innate_sensing (CpG-O/E + dsRNA) /
|
|
550
|
+
│ │ seroprevalence_oracle (anti-vector NAb serosurveys)
|
|
498
551
|
│ ├── bridge/ bridge off-target engine (Paper 4): offtarget / fold_qc / guide_qc / pipeline / cli
|
|
499
552
|
│ │ + v3.2 offtarget_energetics (position x substitution; held-out 0.88, ships)
|
|
500
553
|
│ ├── agent/ agentic platform: tools / orchestrator / pen_agent / mcp_server / guardrails; v5.0 co_scientist + cite (multi-strategy, self-critique, cited rationale, scope ledger)
|
|
501
554
|
│ │ + v3.2 epistemic (3-tier status) / scope (known-unknowns matcher)
|
|
502
555
|
│ ├── graph/ v4.5 living world-model knowledge graph (schema/build/query/ingest/cell_types); typed provenanced edges; gated living loop (propose-only)
|
|
503
|
-
│ ├── oracles/ v4.0 L1 oracle mesh: OracleResult contract + adapters (genome/structure/protein_design/rna/energetics) over the foundation models; version-pinned cache
|
|
556
|
+
│ ├── oracles/ v4.0 L1 oracle mesh: OracleResult contract + adapters (genome/structure/protein_design/rna/energetics) over the foundation models; version-pinned cache; v5.2-5.5 delivery-immunology scope cards (delivery_genotoxicity/capsid_epitope/innate_sensing/seroprevalence)
|
|
504
557
|
│ ├── rules/ v3.3 machine-readable rules engine (schema/evaluators/loader/solver) over configs/rules/*.yaml
|
|
505
558
|
│ ├── verify/ v3.3 verification service: verify(design) -> Verdict (legal+reasons+confidence+scope; v4.0 writer_critique)
|
|
506
559
|
│ ├── adapt/ local recalibration / private-data adaptation behind a gate (v3.1, WS-F)
|
|
@@ -516,12 +569,16 @@ pen-stack/
|
|
|
516
569
|
│ ├── server/api.py FastAPI REST (atlas, crosslink, writable, plan, bridge, ask)
|
|
517
570
|
│ ├── ui/app.py Streamlit web app (16 pages; v3.2 PEN-Agent shows confidence + epistemic status)
|
|
518
571
|
│ └── cli.py unified CLI
|
|
519
|
-
├── benchmarks/genome_writing_bench/ Genome-Writing Bench v0.
|
|
572
|
+
├── benchmarks/genome_writing_bench/ Genome-Writing Bench v0.3 (T1-T16 + co_scientist; tasks / harness / solvers / LEADERBOARD / SHAs)
|
|
520
573
|
├── bench/run.py one-command bench entrypoint (--agent, --verify)
|
|
521
|
-
├── scripts/ reproducible pipeline drivers (p1_*, p2_*, p4_*, ws_*_report)
|
|
522
|
-
├── configs/ pinned datasets + thresholds + curation (YAML); v3.2
|
|
523
|
-
│ target_sites / delivery_constraints
|
|
524
|
-
|
|
574
|
+
├── scripts/ reproducible pipeline drivers (p1_*, p2_*, p4_*, p52/p53 delivery-immunology oracle builds, ws_*_report)
|
|
575
|
+
├── configs/ pinned datasets + thresholds + curation (YAML); v3.2 known_unknowns /
|
|
576
|
+
│ target_sites / delivery_constraints; v5.1-5.5 delivery_vehicles immune_safety /
|
|
577
|
+
│ genotoxicity_oracle / capsid_epitope_oracle + capsid_sequences.fasta /
|
|
578
|
+
│ seroprevalence + oracles/scope_cards
|
|
579
|
+
├── prereg/ SHA-locked success criteria (paper1..4 + ws_a..ws_h + v3.2-v5.5 ws_{uq,ep,mc,ba,
|
|
580
|
+
│ r,v,route,env,bench,cal,o,wv,atlas,graph,mon,ct,plan,crit,cite,immune,
|
|
581
|
+
│ genotox,epitope,innate,seroprev} + SHA256 locks)
|
|
525
582
|
├── data/curated/ small committed tables (universe, gene coords, measured bridge profile,
|
|
526
583
|
│ v3.2 bridge_offtarget_energetics.json)
|
|
527
584
|
├── data/llm_bench_cache/ 28 cached ungrounded-LLM transcripts (T7, offline/CI replay)
|
|
@@ -12,11 +12,10 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
12
12
|
[](https://pypi.org/project/pen-stack/)
|
|
13
13
|
[](https://github.com/ahmedanees-m/pen-stack/actions/workflows/ci.yml)
|
|
14
14
|
[](https://github.com/ahmedanees-m/pen-stack/actions/workflows/publish.yml)
|
|
15
|
-
[](https://github.com/ahmedanees-m/pen-stack/actions/workflows/ci.yml)
|
|
16
15
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
17
16
|
[](LICENSE)
|
|
18
17
|
[](https://www.python.org/)
|
|
19
|
-
[](CHANGELOG.md)
|
|
20
19
|
[](tests/)
|
|
21
20
|
[](https://github.com/astral-sh/ruff)
|
|
22
21
|
[](docker/)
|
|
@@ -60,6 +59,46 @@ Two questions gate every genome-writing project, and before PEN-STACK no resourc
|
|
|
60
59
|
Everything is built on bulk-downloadable public data, runs on a single GPU, and is validated **blind** against
|
|
61
60
|
a pre-registered, honest baseline before release.
|
|
62
61
|
|
|
62
|
+
## What is new in v5.6 — Immunology completion & calibration (anti-PEG · proxy honesty · unified profile)
|
|
63
|
+
|
|
64
|
+
v5.6 finishes the delivery-immunology arc and tells the truth about it. It adds the missing **anti-PEG** axis
|
|
65
|
+
(gates LNP re-dosing), **calibrates** every proxy two-sided, and exposes a **unified per-design immune-risk
|
|
66
|
+
profile** in which each axis keeps its own uncertainty and none is ever fused into one overconfident number.
|
|
67
|
+
|
|
68
|
+
| Workstream | What it adds | Result |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| **PEG** | `planner/antipeg_oracle.py` + `configs/antipeg.yaml` | anti-PEG prevalence (25–72%) → `preexisting_antipeg_score`; gates **re-dosing**; abstains for non-PEG vehicles; range surfaced as uncertainty |
|
|
71
|
+
| **CALIB** | `validate/immune_calibration.py` | each axis labelled **outcome-validated** (ρ + CI excluding 0) or **mechanistic/population proxy**; with no public paired-outcome data, all axes are honestly labelled proxies (the label travels with the profile) |
|
|
72
|
+
| **PROFILE** | `planner/immune_profile.py` + `Verdict.immune_profile` | per-design **vector** of all axes, each with value + uncertainty + scope + validation label; **`collapsed_score is None`** (never fused); known-unknowns listed |
|
|
73
|
+
| **EXT** | route/immune-privilege modifier + new known-unknowns | eye/CNS immune-privilege as a *documented qualitative* modifier (no magnitude); CD4/MHC-II, pre-existing capsid T-cell, complement/CARPA registered as known-unknowns |
|
|
74
|
+
|
|
75
|
+
The in-vivo magnitude and patient-specific titer stay declared known-unknowns. See
|
|
76
|
+
[`docs/delivery_immunology.md`](docs/delivery_immunology.md) and `prereg/ws_{peg,calib,profile}.yaml`.
|
|
77
|
+
|
|
78
|
+
## What is new in v5.5 — Anti-vector seroprevalence oracle (the last immune axis, from data)
|
|
79
|
+
|
|
80
|
+
This completes the computable delivery-immunology axes. **Pre-existing humoral immunity** (B-cell / NAb) to a
|
|
81
|
+
viral capsid is the one axis that *cannot* be computed from sequence — it is a population prevalence from
|
|
82
|
+
natural exposure — so v5.5 grounds it in published **serosurvey data** (AAV: Calcedo 2009 / Boutin 2010;
|
|
83
|
+
adenovirus: Mast 2010; HSV-1: Looker 2015). `preexisting_score = 1 − midpoint(seroprevalence)/100`, with the
|
|
84
|
+
literature range surfaced as native uncertainty.
|
|
85
|
+
|
|
86
|
+
| serotype (vehicle) | NAb seroprevalence | pre-existing score |
|
|
87
|
+
|---|---|---|
|
|
88
|
+
| Ad5 → HDAd | 40–90% | 0.35 |
|
|
89
|
+
| AAV (aggregate) → AAV | 30–60% | 0.55 |
|
|
90
|
+
| HSV-1 → HSV | 50–70% | 0.40 |
|
|
91
|
+
| VSV → lentivirus | 0–5% | 0.975 |
|
|
92
|
+
|
|
93
|
+
Folded into the pre-existing axis for **in-vivo** vehicles (muted for ex-vivo, where serum NAb can't reach
|
|
94
|
+
ex-vivo cells); non-viral → 1.0 by mechanism. It is a **population** prevalence — **not** a given patient's NAb
|
|
95
|
+
titer (a known-unknown). See `pen_stack/planner/seroprevalence_oracle.py`, `configs/seroprevalence.yaml`,
|
|
96
|
+
`prereg/ws_seroprev.yaml`, and the `seroprevalence` scope card.
|
|
97
|
+
|
|
98
|
+
**With v5.5, four of the five delivery-immunology axes are grounded in data or sequence** — genotoxicity
|
|
99
|
+
(VISDB×COSMIC), adaptive/CD8 (MHCflurry), innate (CpG/dsRNA), pre-existing/NAb (serosurveys) — each abstaining
|
|
100
|
+
rather than fabricating, with the in-vivo *magnitude* always a declared known-unknown.
|
|
101
|
+
|
|
63
102
|
## What is new in v5.4 — Computed innate-sensing scorer (completes the computable immune axes)
|
|
64
103
|
|
|
65
104
|
The third computed delivery-immunology signal (after v5.2 genotoxicity and v5.3 capsid epitope load). Innate
|
|
@@ -118,6 +157,11 @@ efficacious integrator but its genotoxicity is the dominant concern). Crucially,
|
|
|
118
157
|
**magnitude** stays a declared known-unknown — v5.1 surfaces documented priors, it does **not** predict a
|
|
119
158
|
patient-specific immune response.
|
|
120
159
|
|
|
160
|
+
> **The full delivery-immunology story (v5.1 → v5.5), with every axis, method, and outcome, is in
|
|
161
|
+
> [`docs/delivery_immunology.md`](docs/delivery_immunology.md).** By v5.5, four of the five immune/safety axes
|
|
162
|
+
> are computed from data or sequence (genotoxicity, adaptive/CD8, innate, pre-existing/NAb) rather than
|
|
163
|
+
> hand-typed tiers.
|
|
164
|
+
|
|
121
165
|
| Workstream | What it adds | Result |
|
|
122
166
|
|---|---|---|
|
|
123
167
|
| **IMMUNE config** | `immune_safety` block on all 8 vehicles in `configs/delivery_vehicles.yaml` | documented ordinal (low/moderate/high) priors for pre-existing immunity, neutralizing antibody, innate/adaptive immune, **genotoxicity**, efficacy — every `immune_doi` Crossref-verified and in the curated-DOI set |
|
|
@@ -282,6 +326,10 @@ benchmark with deterministic scorers and no circular labels. See
|
|
|
282
326
|
| off-target + DMS (Perry 2025) |
|
|
283
327
|
+-------------------------------------------------------------------------+
|
|
284
328
|
|
|
329
|
+
Delivery layer (v5.1-5.5, feeds the planner): a safety<->efficacy balance over the 8-vehicle palette,
|
|
330
|
+
with four of five immune/safety axes computed from data/sequence (genotoxicity = VISDB x COSMIC;
|
|
331
|
+
adaptive/CD8 = MHCflurry over the capsid; innate = CpG/dsRNA of the cargo; pre-existing/NAb = serosurveys).
|
|
332
|
+
|
|
285
333
|
Platform services (on top of the validated core): PEN-MONITOR (Europe PMC living database),
|
|
286
334
|
grounded RAG/Q&A, a tool-using agent + MCP server, and a Streamlit web app.
|
|
287
335
|
```
|
|
@@ -296,6 +344,7 @@ PEN-STACK is organised as **two reference layers + one engine + a services layer
|
|
|
296
344
|
| **Writer Atlas** (companion) | `pen_stack.atlas`, `.mech`, `.score` | cross-family enzyme catalogue + Writer-Targeting KB | Paper 2 |
|
|
297
345
|
| **Cross-link** | `pen_stack.atlas.crosslink` | bidirectional writer to locus queries | Paper 2 |
|
|
298
346
|
| **Write Planner** (engine) | `pen_stack.planner` | inverse design, `edit_intent`-conditioned | Paper 3 |
|
|
347
|
+
| **Delivery immunology** (v5.1-5.5) | `pen_stack.planner.delivery_immunology` + `{genotoxicity,capsid_epitope,seroprevalence}_oracle`, `innate_sensing` | safety↔efficacy balance over the 8-vehicle palette; 4 of 5 immune axes **computed from data/sequence**, magnitude stays a known-unknown ([docs](docs/delivery_immunology.md)) | M2 |
|
|
299
348
|
| **Agentic platform** | `pen_stack.agent` | goal to cited, auditable plan; MCP server; one-command deploy | Paper 3 |
|
|
300
349
|
| **Bridge off-target engine** | `pen_stack.bridge` | "CRISPOR for bridge recombinases" + guide QC (v3.1) | Paper 4 |
|
|
301
350
|
| **Genome-Writing Bench** (v3.1) | `benchmarks/`, `bench/run.py` | first writing-side benchmark; deterministic scorers, leaderboard | M2 |
|
|
@@ -420,12 +469,16 @@ pen-stack/
|
|
|
420
469
|
│ ├── planner/ Write Planner (Paper 3): optimize / cargo / cargo_polish / multiplex / pipeline
|
|
421
470
|
│ │ + v3.2 target_site (hard PAM/att/core reject) / delivery_constraints
|
|
422
471
|
│ │ + v3.3 router (write-type dispatch) / delivery_vehicles (8-vehicle palette)
|
|
472
|
+
│ │ + v5.1-5.5 delivery_immunology (safety<->efficacy balance) and the four
|
|
473
|
+
│ │ computed immune-axis oracles: genotoxicity_oracle (VISDB x COSMIC) /
|
|
474
|
+
│ │ capsid_epitope_oracle (MHCflurry) / innate_sensing (CpG-O/E + dsRNA) /
|
|
475
|
+
│ │ seroprevalence_oracle (anti-vector NAb serosurveys)
|
|
423
476
|
│ ├── bridge/ bridge off-target engine (Paper 4): offtarget / fold_qc / guide_qc / pipeline / cli
|
|
424
477
|
│ │ + v3.2 offtarget_energetics (position x substitution; held-out 0.88, ships)
|
|
425
478
|
│ ├── agent/ agentic platform: tools / orchestrator / pen_agent / mcp_server / guardrails; v5.0 co_scientist + cite (multi-strategy, self-critique, cited rationale, scope ledger)
|
|
426
479
|
│ │ + v3.2 epistemic (3-tier status) / scope (known-unknowns matcher)
|
|
427
480
|
│ ├── graph/ v4.5 living world-model knowledge graph (schema/build/query/ingest/cell_types); typed provenanced edges; gated living loop (propose-only)
|
|
428
|
-
│ ├── oracles/ v4.0 L1 oracle mesh: OracleResult contract + adapters (genome/structure/protein_design/rna/energetics) over the foundation models; version-pinned cache
|
|
481
|
+
│ ├── oracles/ v4.0 L1 oracle mesh: OracleResult contract + adapters (genome/structure/protein_design/rna/energetics) over the foundation models; version-pinned cache; v5.2-5.5 delivery-immunology scope cards (delivery_genotoxicity/capsid_epitope/innate_sensing/seroprevalence)
|
|
429
482
|
│ ├── rules/ v3.3 machine-readable rules engine (schema/evaluators/loader/solver) over configs/rules/*.yaml
|
|
430
483
|
│ ├── verify/ v3.3 verification service: verify(design) -> Verdict (legal+reasons+confidence+scope; v4.0 writer_critique)
|
|
431
484
|
│ ├── adapt/ local recalibration / private-data adaptation behind a gate (v3.1, WS-F)
|
|
@@ -441,12 +494,16 @@ pen-stack/
|
|
|
441
494
|
│ ├── server/api.py FastAPI REST (atlas, crosslink, writable, plan, bridge, ask)
|
|
442
495
|
│ ├── ui/app.py Streamlit web app (16 pages; v3.2 PEN-Agent shows confidence + epistemic status)
|
|
443
496
|
│ └── cli.py unified CLI
|
|
444
|
-
├── benchmarks/genome_writing_bench/ Genome-Writing Bench v0.
|
|
497
|
+
├── benchmarks/genome_writing_bench/ Genome-Writing Bench v0.3 (T1-T16 + co_scientist; tasks / harness / solvers / LEADERBOARD / SHAs)
|
|
445
498
|
├── bench/run.py one-command bench entrypoint (--agent, --verify)
|
|
446
|
-
├── scripts/ reproducible pipeline drivers (p1_*, p2_*, p4_*, ws_*_report)
|
|
447
|
-
├── configs/ pinned datasets + thresholds + curation (YAML); v3.2
|
|
448
|
-
│ target_sites / delivery_constraints
|
|
449
|
-
|
|
499
|
+
├── scripts/ reproducible pipeline drivers (p1_*, p2_*, p4_*, p52/p53 delivery-immunology oracle builds, ws_*_report)
|
|
500
|
+
├── configs/ pinned datasets + thresholds + curation (YAML); v3.2 known_unknowns /
|
|
501
|
+
│ target_sites / delivery_constraints; v5.1-5.5 delivery_vehicles immune_safety /
|
|
502
|
+
│ genotoxicity_oracle / capsid_epitope_oracle + capsid_sequences.fasta /
|
|
503
|
+
│ seroprevalence + oracles/scope_cards
|
|
504
|
+
├── prereg/ SHA-locked success criteria (paper1..4 + ws_a..ws_h + v3.2-v5.5 ws_{uq,ep,mc,ba,
|
|
505
|
+
│ r,v,route,env,bench,cal,o,wv,atlas,graph,mon,ct,plan,crit,cite,immune,
|
|
506
|
+
│ genotox,epitope,innate,seroprev} + SHA256 locks)
|
|
450
507
|
├── data/curated/ small committed tables (universe, gene coords, measured bridge profile,
|
|
451
508
|
│ v3.2 bridge_offtarget_energetics.json)
|
|
452
509
|
├── data/llm_bench_cache/ 28 cached ungrounded-LLM transcripts (T7, offline/CI replay)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# PEN-STACK v5.6 — anti-PEG antibody prevalence (WS-PEG).
|
|
2
|
+
#
|
|
3
|
+
# Pre-existing / induced anti-PEG antibodies gate RE-DOSING of PEGylated LNP. Anti-PEG is a property of the
|
|
4
|
+
# PEGylation chemistry, NOT of any encoded sequence — so, like the v5.5 anti-vector seroprevalence, the only
|
|
5
|
+
# honest grounding is published serosurvey DATA. Curated as a population prevalence RANGE (wide assay/region
|
|
6
|
+
# variation), with serosurvey DOIs.
|
|
7
|
+
#
|
|
8
|
+
# preexisting_antipeg_score = 1 - midpoint(anti_PEG_prevalence_pct) / 100 (1 = fewest patients excluded).
|
|
9
|
+
#
|
|
10
|
+
# HONESTY (scope card `antipeg`): a POPULATION prevalence, NOT a given patient's anti-PEG titer (a clinical
|
|
11
|
+
# test, patient-specific -> a known-unknown); region/age/assay-dependent (a range, surfaced as uncertainty);
|
|
12
|
+
# applies ONLY to PEGylated vehicles (abstains otherwise). INDUCED anti-PEG after dose 1 (boosted markedly by
|
|
13
|
+
# mRNA-LNP vaccination) is a separate, larger dynamic — NOTED here, not modelled (a known-unknown).
|
|
14
|
+
|
|
15
|
+
version: "1.0"
|
|
16
|
+
|
|
17
|
+
prevalence:
|
|
18
|
+
anti_peg_prevalence_pct: [25, 72]
|
|
19
|
+
note: "pre-existing anti-PEG IgG/IgM in healthy adults; wide assay/region variation (Chen 2016 ~72% had
|
|
20
|
+
detectable anti-PEG; high-TITER prevalence is lower). Induced anti-PEG post-dose-1 is separate + larger."
|
|
21
|
+
dois:
|
|
22
|
+
- "10.1021/acs.analchem.6b03109" # Chen 2016 — pre-existing IgG/IgM anti-PEG in healthy individuals
|
|
23
|
+
- "10.1002/wnan.1339" # Yang & Lai 2015 — anti-PEG immunity review
|
|
24
|
+
- "10.1002/cncr.22739" # Armstrong 2007 — anti-PEG antibodies adversely affect PEG-asparaginase
|
|
25
|
+
- "10.1016/j.addr.2020.07.024" # Kozma 2020 — anti-PEG antibodies (properties/formation/testing)
|
|
26
|
+
|
|
27
|
+
# which palette vehicles are PEGylated (LNP-mRNA uses a PEG-lipid). All others abstain.
|
|
28
|
+
pegylated_vehicles: [lnp_mrna]
|
|
@@ -65,3 +65,30 @@ known_unknowns:
|
|
|
65
65
|
match_terms: ["germline", "heritable", "pass to offspring", "embryo", "inherited by children",
|
|
66
66
|
"future generations"]
|
|
67
67
|
patterns: []
|
|
68
|
+
|
|
69
|
+
# v5.6 WS-EXT — immune axes that are mechanistically distinct from what the v5.2-v5.6 oracles compute, and
|
|
70
|
+
# for which PEN-STACK has no grounded model: declared known-unknowns rather than faked.
|
|
71
|
+
- id: cd4_mhcii_help
|
|
72
|
+
title: "CD4 / MHC-II helper-epitope load"
|
|
73
|
+
requires: "MHC-II binding prediction over the capsid/transgene + a model linking CD4 help to antibody/memory formation"
|
|
74
|
+
why: "the v5.3 capsid-epitope oracle computes CD8 / MHC-I presentation ONLY; CD4 / MHC-II helper epitopes
|
|
75
|
+
(which drive antibody formation and durable memory) are NOT modelled — a distinct, ungrounded axis here"
|
|
76
|
+
match_terms: ["cd4", "mhc-ii", "mhc class ii", "helper t", "helper epitope", "th cell", "t-helper"]
|
|
77
|
+
patterns: []
|
|
78
|
+
|
|
79
|
+
- id: preexisting_capsid_tcell
|
|
80
|
+
title: "pre-existing capsid-specific memory T-cell immunity"
|
|
81
|
+
requires: "population prevalence of capsid-specific memory T cells (distinct from neutralizing-antibody serosurveys)"
|
|
82
|
+
why: "v5.5 seroprevalence is anti-vector ANTIBODY (B-cell) prevalence; pre-existing capsid-specific
|
|
83
|
+
memory T-CELL immunity is a separate dimension PEN-STACK does NOT model (sparse, assay-dependent data)"
|
|
84
|
+
match_terms: ["pre-existing t-cell", "preexisting t cell", "capsid-specific t cell", "memory t cell",
|
|
85
|
+
"t-cell immunity to capsid", "cellular pre-existing immunity"]
|
|
86
|
+
patterns: []
|
|
87
|
+
|
|
88
|
+
- id: complement_carpa
|
|
89
|
+
title: "complement activation / CARPA (complement-activation-related pseudoallergy)"
|
|
90
|
+
requires: "a model of complement activation by the vector/LNP surface (C3/C5 turnover, anaphylatoxins) and infusion-reaction risk"
|
|
91
|
+
why: "complement/CARPA is mechanistically distinct from the cargo CpG/dsRNA innate axis (v5.4) and the
|
|
92
|
+
capsid epitope axis; PEN-STACK does NOT model complement activation or infusion-reaction risk"
|
|
93
|
+
match_terms: ["complement", "carpa", "c3a", "c5a", "anaphylatox", "infusion reaction", "pseudoallergy"]
|
|
94
|
+
patterns: []
|
|
@@ -152,3 +152,30 @@ 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)"
|
|
169
|
+
|
|
170
|
+
antipeg: # v5.6 WS-PEG: anti-PEG antibody prevalence (gates LNP re-dosing)
|
|
171
|
+
family: genome
|
|
172
|
+
version: "serosurvey-2026"
|
|
173
|
+
output_kind: baseline # curated empirical population data, not a model
|
|
174
|
+
valid_for: "POPULATION pre-existing anti-PEG antibody prevalence for PEGylated LNP (a property of the PEG
|
|
175
|
+
chemistry, not an encoded sequence); preexisting_antipeg_score = 1 - midpoint/100; gates RE-DOSING"
|
|
176
|
+
not_valid_for: "a given PATIENT's anti-PEG titer / sero-status (a clinical test, patient-specific -> a
|
|
177
|
+
known-unknown); INDUCED anti-PEG after dose 1 (a separate, larger dynamic, esp. post mRNA-LNP); precise
|
|
178
|
+
region/age/assay values (a range, not a point); non-PEGylated vehicles (abstains)"
|
|
179
|
+
generalizes_to_unseen_loci: false
|
|
180
|
+
license: "open (this work; Chen 10.1021/acs.analchem.6b03109, Yang&Lai 10.1002/wnan.1339,
|
|
181
|
+
Armstrong 10.1002/cncr.22739, Kozma 10.1016/j.addr.2020.07.024)"
|
|
@@ -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]
|