pen-stack 8.0.0__tar.gz → 8.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pen_stack-8.0.0 → pen_stack-8.0.2}/CHANGELOG.md +46 -2
- {pen_stack-8.0.0 → pen_stack-8.0.2}/CITATION.cff +1 -1
- {pen_stack-8.0.0 → pen_stack-8.0.2}/PKG-INFO +84 -53
- {pen_stack-8.0.0 → pen_stack-8.0.2}/README.md +76 -52
- {pen_stack-8.0.0 → pen_stack-8.0.2}/bench/run.py +14 -5
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/genome_writing_bench/LEADERBOARD.md +15 -9
- pen_stack-8.0.2/benchmarks/genome_writing_bench/SHA256SUMS +7 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/position_effect_human/SHA256SUMS +1 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/biosecurity.md +20 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/__init__.py +1 -1
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/agent/epistemic.py +6 -4
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/oracles/schema.py +16 -2
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/oracles/structure.py +1 -2
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rules/schema.py +20 -3
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/safety/policy.py +5 -1
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/safety/screen.py +5 -1
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/verify/schema.py +6 -1
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/verify/service.py +4 -1
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack.egg-info/PKG-INFO +84 -53
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack.egg-info/SOURCES.txt +3 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack.egg-info/requires.txt +7 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pyproject.toml +7 -2
- pen_stack-8.0.2/scripts/p2_build_human_head.py +79 -0
- pen_stack-8.0.2/scripts/pa_epridict_distinctness.py +66 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/reproduce.py +27 -7
- pen_stack-8.0.2/scripts/validate_components.py +158 -0
- pen_stack-8.0.0/benchmarks/genome_writing_bench/SHA256SUMS +0 -7
- {pen_stack-8.0.0 → pen_stack-8.0.2}/LICENSE +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/MANIFEST.in +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/agentic_baseline/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/chat_grounding/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/chat_grounding/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/chat_headtohead/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/chat_routing/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/chat_routing/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/chat_safety/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/chat_safety/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/delivery/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/genome_writing_bench/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/genome_writing_challenge/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/genotox_panel/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/grounding_llm_on/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/loop/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/offtarget/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/offtarget/integrase/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/offtarget/integrase/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/offtarget/integrase_chalberg/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/oracle/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/position_effect/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/position_effect/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/position_effect_human/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/priorart/epridict/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/priorart/epridict/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/priorart/gsh_recovery/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/priorart/gsh_recovery/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/verify/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/writer_efficiency/README.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/writer_efficiency/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/benchmarks/writespec/SHA256SUMS +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/aav_serotype_tropism.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/antipeg.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/atlas_families.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/bridge_offtarget_profile.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/calibration/preexisting_nab_independent.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/capsid_epitope_oracle.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/capsid_sequences.fasta +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/cargo_polish.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/cell_types.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/datasets.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/delivery_constraints.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/delivery_rules.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/delivery_vehicles.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/expression/modifiers.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/expression/promoters.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/gates_v3.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/genotoxicity_oracle.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/gsh_validated_heldout.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/intent_weights.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/known_unknowns.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/llm.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/metric_guide.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/mhc_epitope_oracle.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/monitor_queries.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/oracles/execution.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/oracles/reliability.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/oracles/scope_cards.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/rules/compliance.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/rules/delivery.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/rules/fold.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/rules/multiplex.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/rules/payload.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/rules/reachability.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/safety/hazard_registry.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/safety/policy.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/safety/probes.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/score_axes.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/seroprevalence.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/target_sites.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/universe_crosswalk.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/write_types.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/writer_sequences.fasta +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/configs/wtkb_curated.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/data/curated/bridge_offtarget_energetics.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/data/curated/cast_systems.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/data/curated/gene_coords.parquet +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/data/curated/integrase_att.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/data/curated/unified_editor_universe.parquet +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/data/offtarget/enumerated_cache.parquet +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/data/offtarget/motif_cache.parquet +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/BACKLOG.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/DEPLOY.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/INFRA.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/MCP.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/RELEASING.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/REPRO.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/STABILITY.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/agent.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/alphagenome_feasibility.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/autonomy.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/benchmark_circularity.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/build_interface.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/cards/atlas.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/cards/durability.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/cards/offtarget_data.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/cards/position_effect_data.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/cards/priorart.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/cards/safety.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/cards/writer_efficiency_data.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/challenge.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/closed_loop.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/co_scientist.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/co_scientist_loop.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/delivery.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/delivery_immunology.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/delivery_recommender.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/digital_twin.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/dissemination.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/environment.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/experiment_design.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/generative_design.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/immune_profiler.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/index.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/integrations.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/live_oracles.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/mechanistic_constraints.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/offtarget.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/oracle_mesh.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/oracles.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/position_effect.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/positioning.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/private_data_formats.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/quickstart.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/responsible_use.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/rule_spec.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/rules.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/scope.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/scorecard.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/tpe_bench.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/tutorials/compare-families.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/tutorials/score-deliverability.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/tutorials/where-can-i-write.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/tutorials/which-writer-reaches-locus.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/uncertainty.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/verify.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/verify_service.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/world_model.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/writer_efficiency.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/writer_verification.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/writespec_bench.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/writespec_profile.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/docs/wtkb.md +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/_resources.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/active/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/active/acquire.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/active/brains.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/active/campaign.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/active/design.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/active/validate.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/adapt/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/adapt/finetune.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/adapt/ingest.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/adapt/pipeline.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/adapt/recalibrate.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/adapt/report.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/agent/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/agent/cite.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/agent/co_scientist.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/agent/guardrails.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/agent/mcp_server.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/agent/orchestrator.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/agent/orchestrator_live.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/agent/pen_agent.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/agent/scope.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/agent/tools.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/api/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/api/manifest.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/atlas/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/atlas/build_wtkb.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/atlas/crosslink.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/atlas/expand.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/atlas/guide_design.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/atlas/schema.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/atlas/scorecard.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/atlas/universe.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/atlas/variant_propose.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/atlas/writer_efficiency.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/atlas/writer_predict.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/atlas/writer_recommend.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/atlas/writer_verify.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/bridge/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/bridge/activity.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/bridge/cli.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/bridge/fold_qc.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/bridge/guide_qc.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/bridge/ingest.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/bridge/offtarget.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/bridge/offtarget_energetics.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/bridge/ortholog_screen.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/bridge/pipeline.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/build/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/build/cloudlab.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/build/ingest.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/build/protocol.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/build/simlab.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/cli.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/data/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/data/encode.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/data/genome.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/data/ingest_chromatin.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/data/ingest_integration.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/data/ingest_safety_annot.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/data/ingest_trip.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/design/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/design/capsid_generate.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/design/generate.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/design/pareto.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/design/space.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/design/writer_variants.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/env/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/env/genome_writing_env.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/env/policies.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/graph/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/graph/build.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/graph/cell_types.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/graph/ingest.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/graph/query.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/graph/schema.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/loop/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/loop/continual.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/loop/cycle.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/loop/drift.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/mech/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/mech/classify_atlas.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/mech/whitelist.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/monitor/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/monitor/europepmc.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/monitor/run.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/monitor/triage.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/oracles/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/oracles/affinity.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/oracles/cache.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/oracles/energetics.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/oracles/genome.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/oracles/protein_design.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/oracles/reliability.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/oracles/rna.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/oracles/status.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/oracles/structure_run.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/oracles/vcell.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/ada_risk.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/antipeg_oracle.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/cargo.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/cargo_polish.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/chromosome.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/delivery.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/delivery_constraints.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/delivery_immune.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/delivery_immunology.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/delivery_predict.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/delivery_vehicles.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/genotoxicity_oracle.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/immune_mhc2.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/immune_profile.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/innate_sensing.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/multiplex.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/optimize.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/pipeline.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/report.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/router.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/seroprevalence_oracle.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/planner/target_site.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rag/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rag/corpus.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rag/embed.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rag/ground.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rag/index.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rag/llm.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rag/qa.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rag/retrieve.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rules/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rules/evaluators.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rules/loader.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rules/solver.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/rules/spec.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/safety/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/safety/audit.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/safety/gate.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/safety/pfam_scan.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/safety/redteam.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/safety/registry.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/safety/standards.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/score/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/score/recalibrate.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/score/therapeutic.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/server/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/server/api.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/spec/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/spec/clarify.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/spec/extract.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/spec/resolvers/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/spec/resolvers/cell.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/spec/resolvers/chem.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/spec/resolvers/feature.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/spec/resolvers/gene.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/spec/resolvers/locus.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/spec/resolvers/phenotype.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/spec/satisfy.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/spec/service.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/spec/writespec.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/twin/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/twin/calibrate.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/twin/data/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/twin/data/position_effect.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/twin/mechanistic.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/twin/outcome.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/twin/position_effect.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/ui/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/ui/app.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/adapt_demo.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/agent_eval.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/bench_graph_tasks.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/bench_rule_tasks.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/bench_trust_tasks.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/bench_writetype_tasks.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/blind_gsh_discovery.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/cargo_directionality.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/closed_loop.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/durability_baselines.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/experiment_design.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/expr_controls.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/forward_hypotheses.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/generative_design.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/guide_qc_demo.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/heldout_celltype_expr.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/immune_calibration.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/intent_specification.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/known_biology_expr.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/out_of_scope_refusal.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/outcome_calibration.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/outcome_prediction.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/paper3_benchmark.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/paper4_real_validation.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/paper4_validation.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/protocol_safety.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/safety_screening.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/selective_prediction.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/seq_vs_measured.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/target_site_controls.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/uncertainty_eval.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/ungrounded_baseline.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/within_locus_ranking.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/validate/writer_recovery.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/verify/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/verify/proof.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/web/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/web/guide.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/web/llm.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/web/llm_provider.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/web/router.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/web/server.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/web/tools.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/__init__.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/chromatin_seq.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/durability.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/export_tracks.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/features.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/gsh_baseline.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/mesh_features.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/offtarget_assay.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/offtarget_bridge.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/offtarget_cast.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/offtarget_data.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/offtarget_enumerate.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/offtarget_integrase.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/offtarget_nuclease.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/offtarget_paste.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/offtarget_predict.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/ood.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/providers.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/safety.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/structure3d.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/uncertainty.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack/wgenome/writability.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack.egg-info/dependency_links.txt +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack.egg-info/entry_points.txt +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/pen_stack.egg-info/top_level.txt +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_phase0.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_phase1_5.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_phase2.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_phase3.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_a.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_acq.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_b.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_ba.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_bench.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_c.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_cal.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_calib.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_chat.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_cite.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_closedloop.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_continual.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_crit.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_ct.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_d.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_delivery.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_drift.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_e.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_env.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_ep.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_expr2.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_f.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_g.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_gen.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_graph.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_h.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_immune.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_immune2.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_innate.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_loop.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_mc.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_mech.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_mon.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_o.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_offtarget.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_offtarget2.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_oracle.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_orch.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_peg.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_penchat.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_plan.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_policy.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_priorart.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_profile.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_proto.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_r.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_route.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_screen.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_uq.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_v.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_verify.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_writer.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_writespec.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/SHA256_LOCK_ws_wv.json +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/paper1.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/paper2.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/paper3.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/paper4.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/phase0.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_a.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_acq.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_aldesign.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_alvalidate.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_atlas.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_b.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_ba.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_ba_v33.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_ba_v45.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_bench.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_c.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_cal.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_calib.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_challenge.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_chat.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_cite.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_closedloop.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_continual.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_cosci2.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_crit.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_ct.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_d.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_delivery.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_drift.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_e.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_env.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_ep.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_epitope.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_expr2.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_f.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_frontend.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_g.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_gen.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_genotox.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_graph.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_h.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_hybrid.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_immune.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_immune2.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_ingest.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_innate.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_loop.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_manifest.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_mc.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_mcp.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_mech.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_mon.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_o.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_offtarget.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_offtarget2.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_openapi.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_oracle.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_orch.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_outcome.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_pareto.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_peg.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_penchat.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_plan.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_policy.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_priorart.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_profile.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_proto.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_r.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_redteam.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_route.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_screen.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_seroprev.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_simlab.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_twincal.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_uq.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_v.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_vcell.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_verify.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_writer.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_writespec.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/prereg/ws_wv.yaml +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/build_capsid_fitness.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/build_rag_corpus.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/calibrate_immune_axes.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/fetch_artifacts.sh +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/fetch_licensed_sources.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/offtarget_chromatin_incremental.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/offtarget_chromatin_matched.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/offtarget_chromatin_validation.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/p1_build_atlas.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/p1_build_durability.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/p1_build_position_effect.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/p1_build_writer_eff.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/p1_export_tracks.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/p1_safety_concordance.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/p1_train_safety.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/p1_validation_report.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/p2_build_atlas.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/p3_benchmark_report.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/p4_genome_scan.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/p52_build_genotox_oracle.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/p53_build_epitope_oracle.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/ws_b_report.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/scripts/ws_c_report.py +0 -0
- {pen_stack-8.0.0 → pen_stack-8.0.2}/setup.cfg +0 -0
|
@@ -3,10 +3,54 @@
|
|
|
3
3
|
All notable changes to PEN-STACK are documented here. This file follows
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/).
|
|
5
5
|
|
|
6
|
+
## [8.0.2] - 2026-07-13
|
|
7
|
+
|
|
8
|
+
A documentation-correctness and reproducibility-enforcement patch. No scientific result and no public
|
|
9
|
+
function signature changes.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
- **Corrected the MCP tool count.** The MCP server exposes twenty-two tools; the README, CHANGELOG, and
|
|
13
|
+
manuscript are corrected from "twenty," and a guard test now fails if the registered count ever diverges
|
|
14
|
+
from the documented one.
|
|
15
|
+
- **Synced the Docker image version** to the package version, enforced by the release version-consistency
|
|
16
|
+
test so the image label cannot drift again.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- **CI enforces reproducibility on every commit.** `make repro` now runs in CI on each Python version, so the
|
|
20
|
+
two headline recomputations, the frozen-input integrity check, and the no-fabrication gate are verified
|
|
21
|
+
rather than assumed.
|
|
22
|
+
|
|
23
|
+
## [8.0.1] - 2026-07-13
|
|
24
|
+
|
|
25
|
+
A reproducibility and API-hardening patch. No scientific result and no public function signature changes.
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
- **Result, verdict, and safety types are now immutable (frozen).** `OracleResult` and its nested
|
|
29
|
+
`Provenance`, `Verdict`, `SafetyVerdict`, `ScreenHit`, `Rule`, and `RuleResult` can no longer be mutated
|
|
30
|
+
after construction, so a result's provenance and scope, a verdict's legality, or a screen hit's severity
|
|
31
|
+
cannot be edited downstream. Build a changed copy with `model_copy(update=...)`.
|
|
32
|
+
- **The REST, MCP, and Gymnasium-environment tests and the SBOL3/GenBank round-trip run by default.**
|
|
33
|
+
`fastapi`, `uvicorn`, `httpx`, `fastmcp`, `gymnasium`, `sbol3`, and `biopython` are in the `[dev]` extra, so
|
|
34
|
+
the full suite exercises these features rather than skipping them. Heavy compiled extras stay opt-in.
|
|
35
|
+
- **The one-command reproduction recomputes a second headline from committed source.**
|
|
36
|
+
`scripts/pa_epridict_distinctness.py` (wired into `make repro`) re-derives the durability-vs-ePRIDICT
|
|
37
|
+
distinctness result, and `scripts/reproduce.py` now distinguishes recomputed headlines from echoed sealed
|
|
38
|
+
metrics.
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
- **An abstention is no longer reported as high confidence.** A design verified with no calibrated confidence
|
|
42
|
+
is now `not-computable`, not `grounded-confident`.
|
|
43
|
+
- **The frozen-input integrity check works on a fresh checkout.** `python bench/run.py --verify` parses the
|
|
44
|
+
standard `sha256sum` manifest format (two-space, CRLF-tolerant); the manifest re-seals only on explicit
|
|
45
|
+
`--seal`; a `.gitattributes` pins the hashed inputs to LF for cross-platform stability.
|
|
46
|
+
- **The reproduction harness can fail.** `scripts/reproduce.py` exits non-zero if any block fails instead of
|
|
47
|
+
always reporting success.
|
|
48
|
+
- Corrected the ePRIDICT variance figure in the README (R-squared 0.041, matching the committed metrics).
|
|
49
|
+
|
|
6
50
|
## [8.0.0] - 2026-07-13 - Stable release of record
|
|
7
51
|
|
|
8
52
|
The first stable, citable release. The major version marks a committed public API surface (the SDK
|
|
9
|
-
functions, the REST endpoints, and the twenty MCP tools) governed by a one-minor-version deprecation policy.
|
|
53
|
+
functions, the REST endpoints, and the twenty-two MCP tools) governed by a one-minor-version deprecation policy.
|
|
10
54
|
It consolidates the gated 7.x development trail rather than replacing it: the pre-registrations, SHA-locked
|
|
11
55
|
benchmarks, and disclosed negatives that trail documents remain intact and referenced. Stable surfaces
|
|
12
56
|
carry calibrated uncertainty and validation status; the mechanism-based paths (serine-integrase, bridge, and
|
|
@@ -39,7 +83,7 @@ CAST off-target) are marked experimental and may change.
|
|
|
39
83
|
the repository.
|
|
40
84
|
|
|
41
85
|
### Changed
|
|
42
|
-
- Benchmark provenance references relative paths only. The license (MIT), MCP tool count (twenty), and
|
|
86
|
+
- Benchmark provenance references relative paths only. The license (MIT), MCP tool count (twenty-two), and
|
|
43
87
|
Verify-Bench rule count (eleven) are reconciled across the package metadata, the repository, and the
|
|
44
88
|
manuscript. The repository was confirmed free of hardcoded credentials, addresses, and absolute local paths.
|
|
45
89
|
|
|
@@ -1,7 +1,7 @@
|
|
|
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: 8.0.
|
|
4
|
+
version: 8.0.2
|
|
5
5
|
date-released: 2026-07-13
|
|
6
6
|
# The concept DOI is minted when the Zenodo record is published; add it here and in the manuscript:
|
|
7
7
|
# identifiers:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.2
|
|
4
4
|
Summary: Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner.
|
|
5
5
|
Author-email: Anees Ahmed Mahaboob Ali <ahmedaneesm@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -75,6 +75,13 @@ Provides-Extra: dev
|
|
|
75
75
|
Requires-Dist: pytest>=8; extra == "dev"
|
|
76
76
|
Requires-Dist: ruff>=0.5; extra == "dev"
|
|
77
77
|
Requires-Dist: pytest-cov>=5; extra == "dev"
|
|
78
|
+
Requires-Dist: fastapi>=0.111; extra == "dev"
|
|
79
|
+
Requires-Dist: uvicorn>=0.30; extra == "dev"
|
|
80
|
+
Requires-Dist: httpx>=0.27; extra == "dev"
|
|
81
|
+
Requires-Dist: fastmcp>=2.3; extra == "dev"
|
|
82
|
+
Requires-Dist: gymnasium>=0.29; extra == "dev"
|
|
83
|
+
Requires-Dist: sbol3>=1.1; extra == "dev"
|
|
84
|
+
Requires-Dist: biopython>=1.84; extra == "dev"
|
|
78
85
|
Dynamic: license-file
|
|
79
86
|
|
|
80
87
|
<div align="center">
|
|
@@ -99,7 +106,7 @@ Foundation models generate candidate edits; PEN-STACK checks them. It tells you
|
|
|
99
106
|
|
|
100
107
|
PEN-STACK is an installable Python package and service for the genome-*writing* era, the modality that installs new information into a genome (inserting genes, flipping or excising kilobases, placing programmable landing pads) rather than editing a base in place. Writing is harder and less tooled than editing, and it is gated by questions that have no canonical answer: where can you write, what can write there, and how should the write be designed.
|
|
101
108
|
|
|
102
|
-
The package consolidates five earlier research projects into one citable stack and adds the
|
|
109
|
+
The package consolidates five earlier research projects into one citable stack and adds the maps and the design engine the field was missing: a genome-wide Writable-Genome atlas, a cross-family Writer Atlas, an inverse-design Write Planner, a per-mechanism off-target engine, a design-stage biosecurity gate, immunogenicity and delivery profiling, a calibrated digital twin, and a grounded agent that drives them end to end. All of it runs under one engineered invariant: every reported quantity comes from a validated tool or an out-of-distribution-gated oracle, never from a language model, and anything out of scope is returned as a known-unknown rather than guessed. It runs on a single GPU, uses bulk-downloadable public data, and is validated against pre-registered baselines with the negatives reported in full.
|
|
103
110
|
|
|
104
111
|
See the [CHANGELOG](CHANGELOG.md) for release history and [docs/](docs/) for the full documentation.
|
|
105
112
|
|
|
@@ -110,55 +117,57 @@ See the [CHANGELOG](CHANGELOG.md) for release history and [docs/](docs/) for the
|
|
|
110
117
|
| Where can you write? | Labs re-derive ad-hoc "safe harbour" shortlists from inconsistent criteria; published lists range from thousands of sites to a few dozen, rarely predict expression durability, and usually cover one cell type. | The Writable Genome: a learned, cell-type-aware, writer-aware atlas scoring every locus for safety (genotoxicity risk), durability (whether a cassette stays expressed), and reachability (which enzyme can engage it). |
|
|
111
118
|
| What can write there, and how well? | Enzyme capabilities are scattered across papers, with no catalogue placing the genome-writing families on common measured axes with their targeting requirements. | The Writer Atlas: 33,370 enzyme systems across 8 families on common measured axes, joined to the Writable Genome by a bidirectional cross-link. |
|
|
112
119
|
| How do I design the write? | Destination, enzyme, cargo, and delivery are interdependent and goal-dependent, and no tool optimises them together. | The Write Planner: inverse design that, given a goal and an edit intent, returns ranked, traceable site, writer, cargo, and delivery plans. |
|
|
113
|
-
| Where might
|
|
120
|
+
| Where might the write go off-target? | Off-target behaviour differs by writer mechanism, and most writer classes had no genome-wide screening tool. | A per-mechanism off-target engine across five writer classes (RNA-guided nuclease, serine integrase, prime-editing integrase, CAST, and bridge recombinase). It behaves like established nuclease tools where genome-wide assay data exists and reports a truthful mechanism-based screen, with its validation status, where it does not. |
|
|
121
|
+
| Can I trust the outputs? | LLM design assistants produce fluent but unsourced quantities, and large-cargo design is dual-use. | A no-fabrication invariant (every number traces to a validated tool) that we verify with the model live, and a design-stage biosecurity gate that screens function, family, taxon, and raw sequence before any protocol can be emitted. |
|
|
114
122
|
|
|
115
123
|
## Architecture
|
|
116
124
|
|
|
117
|
-
A goal enters through one of the interfaces. The agent layer turns it into candidate designs. Every candidate passes through the verifier, the central gate: it runs a biosecurity screen first, checks the design against the rule base, attaches a calibrated confidence and a per-axis immune-risk profile, and discards anything that is unsafe, illegal, or uncalibrated. The reference layers and the oracle mesh supply the grounded answers the verifier and planner rely on, and everything rests on public data. No value is reported without a traceable source.
|
|
118
|
-
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
125
|
+
A goal enters through one of the interfaces. The agent layer turns it into candidate designs. Every candidate passes through the verifier, the central gate: it runs a biosecurity screen first, checks the design against the rule base, attaches a calibrated confidence and a per-axis immune-risk profile, and discards anything that is unsafe, illegal, or uncalibrated. The reference layers and the oracle mesh supply the grounded answers the verifier and planner rely on, and everything rests on public data. No value is reported without a traceable source, and no value comes from a language model.
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
Interfaces
|
|
129
|
+
CLI | REST API | MCP server | Web app
|
|
130
|
+
|
|
|
131
|
+
v
|
|
132
|
+
Agent layer
|
|
133
|
+
Co-scientist | Write Planner | Experiment Designer
|
|
134
|
+
(goal -> typed WriteSpec -> ranked site / writer / cargo / delivery plan)
|
|
135
|
+
|
|
|
136
|
+
v
|
|
137
|
+
+===========================================================+
|
|
138
|
+
| VERIFIER (the central gate, runs on every design) |
|
|
139
|
+
| 1. biosecurity screen 2. legality rules |
|
|
140
|
+
| 3. calibrated confidence 4. per-axis immune-risk |
|
|
141
|
+
| unsafe / illegal / uncalibrated designs are rejected |
|
|
142
|
+
+===========================================================+
|
|
143
|
+
|
|
|
144
|
+
v
|
|
145
|
+
Reference and model layers
|
|
146
|
+
+-------------------+ +----------------+ +-------------------+
|
|
147
|
+
| Writable Genome | | Writer Atlas | | Oracle mesh |
|
|
148
|
+
| per-locus safety, | | 33,370 enzyme | | AlphaFold3, Evo2, |
|
|
149
|
+
| durability, | | systems, 8 | | AlphaGenome, |
|
|
150
|
+
| expression- | | families, on | | ESM3, RFdiffusion,|
|
|
151
|
+
| robustness, | | common axes, | | ProteinMPNN under |
|
|
152
|
+
| reachability, | | cross-linked | | one OracleResult |
|
|
153
|
+
| per-mechanism | | to every locus | | contract (scope- |
|
|
154
|
+
| off-target | | | | gated, provenance)|
|
|
155
|
+
+-------------------+ +----------------+ +-------------------+
|
|
156
|
+
|
|
|
157
|
+
v
|
|
158
|
+
Public data: hg38, ENCODE / Roadmap chromatin, TRIP, CancerMine (CC0),
|
|
159
|
+
DepMap, VISDB, UniProt, Pfam / InterPro, Europe PMC, Perry 2025 bridge data
|
|
151
160
|
```
|
|
152
161
|
|
|
153
162
|
## Components
|
|
154
163
|
|
|
155
164
|
| Component | Module | What it does |
|
|
156
165
|
|---|---|---|
|
|
157
|
-
| Writable Genome | `pen_stack.wgenome` | Learned per-locus safety, durability, and reachability; 3D structural-risk axis;
|
|
166
|
+
| Writable Genome | `pen_stack.wgenome` | Learned per-locus safety (genotoxicity risk), expression-robustness (durability), and writer reachability; a 3D structural-risk axis; and a per-mechanism off-target engine across five writer classes with per-class validation status. |
|
|
158
167
|
| Writer Atlas | `pen_stack.atlas`, `.mech`, `.score` | Cross-family enzyme catalogue and Writer-Targeting knowledge base, cross-linked to loci. |
|
|
159
168
|
| Write Planner | `pen_stack.planner` | Inverse design conditioned on an edit intent, including the delivery palette and the delivery-immunology profile. |
|
|
160
169
|
| Verifier | `pen_stack.verify`, `pen_stack.rules` | `verify(design)` returns legality, biosecurity verdict, calibrated confidence, and the immune-risk profile as distinct axes. |
|
|
161
|
-
| Biosecurity gate | `pen_stack.safety` | A dual-use screening gate that runs first in `verify()`, screening declared function, family, and taxon signatures and translating a raw cargo sequence against curated Pfam toxin-family profiles; a refusal short-circuits scoring, with a tamper-evident audit trail. |
|
|
170
|
+
| Biosecurity gate | `pen_stack.safety` | A dual-use screening gate that runs first in `verify()`, screening declared function, family, and taxon signatures and translating a raw cargo sequence against curated Pfam toxin-family profiles; a refusal short-circuits scoring, with a tamper-evident audit trail. It reads hazard content only from declared fields (`cargo_function`, `function_annotation`, `goal_function`, `source_taxon`, `organism`, `host_taxon`, `cargo_seq`, `cargo_sequence`); content in `edit_intent` or other framing fields is not screened, so a verdict with `declared_signal=False` means "nothing screenable was declared", not "screened and safe" (see [`docs/biosecurity.md`](docs/biosecurity.md)). |
|
|
162
171
|
| Oracle mesh | `pen_stack.oracles` | One `OracleResult` contract over the biomolecular foundation models, with provenance, native uncertainty, and a scope card; generated output is a candidate, out-of-distribution inputs are flagged. |
|
|
163
172
|
| World-model graph | `pen_stack.graph` | A typed, provenanced knowledge graph with a gated, propose-only update loop. |
|
|
164
173
|
| Generative designer | `pen_stack.design` | Proposes candidate writing systems and keeps only those that pass safety, legality, and calibration, returning a Pareto frontier. |
|
|
@@ -168,17 +177,18 @@ flowchart TB
|
|
|
168
177
|
| Closed loop | `pen_stack.loop`, `pen_stack.active` | A gated design, build, test, learn loop with drift detection and versioned, reversible recalibration; an SDL-brain benchmark and a validation-campaign engine that orders the most-informative next measurements by expected information gain. |
|
|
169
178
|
| Write intent (WriteSpec) | `pen_stack.spec` | A typed, ontology-backed `WriteRequest` (an SBOL3 profile) with a grounded extractor that resolves free text to verified ontology ids, asks clarifying questions on ambiguity, and runs a SAT feasibility check. |
|
|
170
179
|
| Agent, co-scientist, and chat | `pen_stack.agent`, `pen_stack.web`, `pen_stack.rag` | Goal to cited, auditable plan; MCP server; the co-scientist that drives the loop; and the grounded conversational chat (four lanes: design, explain, meta, general; provenance-tagged retrieval; a swappable LLM provider). |
|
|
171
|
-
| Bridge off-target engine | `pen_stack.bridge` |
|
|
180
|
+
| Bridge off-target engine | `pen_stack.bridge` | The measured-data-validated off-target engine for bridge recombinases (IS110/IS621): candidate-site nomination, ranking, and guide QC, validated on the Perry 2025 data. |
|
|
181
|
+
| Immunogenicity and delivery | `pen_stack.planner` | Per-writer T-cell immunogenicity profiling (NetMHCpan / NetMHCIIpan) with a human-albumin self-control, a delivery-vehicle palette, and anti-drug-antibody and anti-PEG proxies, each labelled by validation status. |
|
|
172
182
|
| Interfaces | `pen_stack.server`, `pen_stack.web`, `pen_stack.ui`, `pen_stack.cli` | REST API, web application, and command-line tools. |
|
|
173
183
|
|
|
174
184
|
## Key results
|
|
175
185
|
|
|
176
186
|
All results are blind and pre-registered (success criteria, baselines, and held-out sets are SHA-locked in [`prereg/`](prereg/) before any model sees the test data). Estimates are reported with their sample size and confidence interval.
|
|
177
187
|
|
|
178
|
-
- **
|
|
179
|
-
- **
|
|
180
|
-
- **
|
|
181
|
-
- **
|
|
188
|
+
- **Expression-robustness axis (the headline result).** A per-locus prediction of whether an integrated cassette stays expressed rather than being positionally silenced. On measured human K562 position-effect data (Leemans 2019) the axis reaches a held-out Spearman rho of 0.571 (0.558 on an independent held-out variant), and it is empirically *distinct* from ePRIDICT's chromatin prediction of prime-editing efficiency (rho 0.212, R-squared 0.041 across 7,295 loci): a complementary signal, not a restatement of one. It is validated at exact-site resolution; the deployment commonly serves coarse 1-kb features, at which the axis reaches rho about 0.16, and that gap is reported as a result rather than claimed away. See [`benchmarks/position_effect_human/`](benchmarks/position_effect_human/).
|
|
189
|
+
- **Writable Genome and the integrated safety filter.** A genome-wide atlas of 3,031,030 loci across three cell types (K562, HepG2, CD34+ HSPC) recovers experimentally validated safe harbours as highly writable and clinical genotoxic loci as non-writable, blind. The three-way integrated score (safety x durability x reachability) is characterised honestly as a *reject-known-bad safety filter*: against oncogene-distance and accessibility-matched controls it reaches AUROC 0.679 (95% CI 0.536 to 0.825) versus a safety-only baseline of 0.51, with real false negatives on documented clinical genotoxic loci reported in full; it is not a calibrated genotoxicity predictor.
|
|
190
|
+
- **Writer Atlas.** 33,370 enzyme systems across 8 families on common measured axes; the mechanism classifier agrees with the audited labels on the curated core (1.00); the cross-link to loci is validated on AAVS1. Writer-family recovery at rank 1 is 0.86 against a prevalence of 0.29.
|
|
191
|
+
- **Per-mechanism off-target engine.** The RNA-guided nuclease path *wraps* the published CRISOT scorer (which beats naive homology, CRISOT's own result, stated plainly). The serine-integrase path, on the Chalberg 115-site human genomic pseudo-attP set, reaches AUROC 0.637 and AUPRC 0.215, beating a palindrome baseline (CI excludes zero) and matching an attP-similarity baseline on AUROC while beating it on AUPRC: an informative two-stage result, reported as such. The bridge path (Perry 2025, 6,856 measured off-targets) ranks real off-targets above core-disrupted decoys at AUROC 0.77 versus 0.62 for Hamming distance. The bridge and CAST paths are mechanism-based screens, not per-site risk calculators, and are labelled as such.
|
|
182
192
|
- **No fabrication, measured with the model live.** Given no tools, an ungrounded LLM fabricates 91 to 99 percent of the tool-only planning quantities (writability, safety, durability, off-target count, structural risk, coordinate) under a naive prompt, across three model families spanning a small local model to hosted-frontier models; the same models driving the validated tools as an agent fabricate none, every number audited to a direct tool call. Anti-fabrication prompting is an uneven guardrail; grounding is not. See [`benchmarks/grounding_llm_on/`](benchmarks/grounding_llm_on/) and [`benchmarks/agentic_baseline/`](benchmarks/agentic_baseline/).
|
|
183
193
|
|
|
184
194
|
## Installation
|
|
@@ -248,6 +258,23 @@ docker compose run --rm bench python bench/run.py --agent # on the clean i
|
|
|
248
258
|
|
|
249
259
|
The deterministic planner beats the naive baselines on the grounded tasks; a tool-using LLM agent reaches the planner's numbers only by grounding every value (zero fabricated), while the same models with no tools fabricate the tool-only fields. See [`benchmarks/genome_writing_bench/`](benchmarks/genome_writing_bench/). The held-out public leaderboard is the [Genome-Writing Challenge](benchmarks/genome_writing_challenge/).
|
|
250
260
|
|
|
261
|
+
Every benchmark ships a frozen split with a SHA-256 lock and a committed `metrics.json`, so a fresh clone reproduces the central numbers with no download and no API key:
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
make repro # demo-atlas quickstart, grounding eval, agentic baseline, and the recomputed headline result
|
|
265
|
+
make repro-human # recompute the headline human K562 expression-robustness result (rho=0.571) from source data
|
|
266
|
+
make repro-full # the above plus the genome-wide atlas benchmarks (needs 'make fetch' with ZENODO_DOI)
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
The headline expression-robustness result is **recomputed from source, not read from a stored number**:
|
|
270
|
+
`scripts/p2_build_human_head.py` (run by `make repro-human`, and folded into `make repro`) trains the shipped
|
|
271
|
+
twin on the committed Leemans K562 features table, holds out chromosomes 3/8/12 exactly as the sealed
|
|
272
|
+
pre-registration specifies, and asserts the recomputed held-out Spearman correlation (0.5711) matches the
|
|
273
|
+
committed metrics. The three headline analyses each ship their metrics: the human K562 expression-robustness
|
|
274
|
+
head ([`benchmarks/position_effect_human/`](benchmarks/position_effect_human/)), the integrase off-target set
|
|
275
|
+
([`benchmarks/offtarget/integrase_chalberg/`](benchmarks/offtarget/integrase_chalberg/)), and the clinical
|
|
276
|
+
genotoxicity panel ([`benchmarks/genotox_panel/`](benchmarks/genotox_panel/)).
|
|
277
|
+
|
|
251
278
|
## Built on prior repositories
|
|
252
279
|
|
|
253
280
|
PEN-STACK consolidates and re-grounds five earlier projects. Their reusable assets are imported here; the originals are archived read-only for provenance and DOI stability.
|
|
@@ -312,16 +339,19 @@ Large artifacts (multi-million-row atlases, BigWig tracks, trained models) and a
|
|
|
312
339
|
|
|
313
340
|
## Data sources
|
|
314
341
|
|
|
315
|
-
All public: hg38 (UCSC)
|
|
342
|
+
All public, and license-clean by policy. Genome and annotation: hg38 (UCSC), GENCODE v46. Chromatin: ENCODE and Roadmap (ATAC/DNase and histone marks for K562, HepG2, CD34+ progenitor, and mouse ES-Bruce4). Position-effect: TRIP (Akhtar 2013, GEO GSE49806/GSE49807) and the Leemans 2019 K562 TRIP data, which is the external validation of the expression-robustness axis. Safety: **CancerMine (CC0)** is the default oncogene and tumour-suppressor source; DepMap Public 26Q1 essentiality; LaFave 2014 MLV integrations; VISDB. Enzymes: UniProt orthologs, Pfam and InterPro. Off-target: the Perry 2025 bridge-recombinase off-target and DMS data (copyrighted, kept local, only derived products released) and the Chalberg 2006 genomic pseudo-attP set. Literature and reagents: Europe PMC, Addgene.
|
|
343
|
+
|
|
344
|
+
License-restricted sources (COSMIC Cancer Gene Census, OncoKB) are **never committed and never used as training data**; they are optional, local-only enrichers a registered user pulls under their own license, and a CI test fails if a restricted source appears as a shipped derived-data source. Every accession and DOI is pinned in [`configs/datasets.yaml`](configs/datasets.yaml) and indexed in [`DATA_SOURCES.md`](DATA_SOURCES.md); the full open-data policy is in [`DATA_LICENSES.md`](DATA_LICENSES.md).
|
|
316
345
|
|
|
317
346
|
## Validation approach
|
|
318
347
|
|
|
319
|
-
- Pre-register before training: success criteria, baselines, and held-out sets are SHA-locked in `prereg/` before any model sees test data.
|
|
320
|
-
- Always report a baseline
|
|
348
|
+
- Pre-register before training: success criteria, baselines, and held-out sets are SHA-locked in `prereg/` before any model sees the test data.
|
|
349
|
+
- Always report a baseline: a safety-only far-from-oncogene prior and CancerMine oncogene distance for the integrated score; a learned lamina-associated-domain chromatin baseline and ePRIDICT for the expression-robustness axis; intent-blind ranking for the planner; and attP-similarity, palindrome, or Hamming-distance baselines for the per-mechanism off-target paths.
|
|
350
|
+
- Guard against circularity: the expression-robustness axis is validated with lamina and heterochromatin features removed, so it cannot restate a chromatin baseline, and no task is scored against a label derived from the model's own features (asserted by a dedicated de-circularization test).
|
|
321
351
|
- Blind external concordance: recover validated safe harbours, clinical genotoxic loci, documented writes, and measured off-targets the model never trained on.
|
|
322
|
-
- Report failure: cross-cell-type degradation, small benchmark sizes, and the limits of sequence-only off-target magnitude prediction are reported as results, not footnotes.
|
|
352
|
+
- Report failure: cross-cell-type degradation, the exact-site-versus-served-resolution gap, small benchmark sizes, and the limits of sequence-only off-target magnitude prediction are reported as results, not footnotes.
|
|
323
353
|
- Every estimate carries its sample size and confidence interval. The validated gold sets are small, and statistical power is a stated limitation; scaling them is the top priority for turning the proof of concept into an adopted resource.
|
|
324
|
-
- Grounded services: every quantitative answer comes from a validated tool call, never a language model; the living database never auto-edits the atlas; clinical directives are refused.
|
|
354
|
+
- Grounded services: every quantitative answer comes from a validated tool call, never a language model, verified with the model live; the living database never auto-edits the atlas; clinical directives are refused.
|
|
325
355
|
|
|
326
356
|
## Citation
|
|
327
357
|
|
|
@@ -330,7 +360,7 @@ All public: hg38 (UCSC); ENCODE and Roadmap chromatin (ATAC/DNase and histone ma
|
|
|
330
360
|
author = {Mahaboob Ali, Anees Ahmed},
|
|
331
361
|
title = {PEN-STACK: open infrastructure for genome writing (The Writable Genome)},
|
|
332
362
|
year = {2026},
|
|
333
|
-
version = {8.0.
|
|
363
|
+
version = {8.0.2},
|
|
334
364
|
url = {https://github.com/ahmedanees-m/pen-stack}
|
|
335
365
|
}
|
|
336
366
|
```
|
|
@@ -339,9 +369,10 @@ Author: Anees Ahmed Mahaboob Ali, VIT University, Vellore. MIT licensed.
|
|
|
339
369
|
|
|
340
370
|
## API stability
|
|
341
371
|
|
|
342
|
-
Version 8.0.
|
|
343
|
-
|
|
344
|
-
|
|
372
|
+
Version 8.0.2 is the current stable release; 8.0.0 established the committed public API and the 8.0.x patches
|
|
373
|
+
(8.0.1, 8.0.2) are reproducibility, documentation, and API-hardening fixes within it (no signature changes). The committed public API is the SDK
|
|
374
|
+
functions, the REST endpoints, and the twenty-two MCP tools; these follow semantic versioning with a
|
|
375
|
+
one-minor-version deprecation warning before any breaking change. Stable surfaces carry calibrated uncertainty and an explicit validation
|
|
345
376
|
status. The mechanism-based off-target paths (serine-integrase, bridge, and CAST) are marked experimental and
|
|
346
377
|
may change as measured data becomes available. The major version marks this API commitment; it consolidates
|
|
347
378
|
the gated 7.x development history rather than replacing it, so every pre-registration, sealed benchmark, and
|
|
@@ -20,7 +20,7 @@ Foundation models generate candidate edits; PEN-STACK checks them. It tells you
|
|
|
20
20
|
|
|
21
21
|
PEN-STACK is an installable Python package and service for the genome-*writing* era, the modality that installs new information into a genome (inserting genes, flipping or excising kilobases, placing programmable landing pads) rather than editing a base in place. Writing is harder and less tooled than editing, and it is gated by questions that have no canonical answer: where can you write, what can write there, and how should the write be designed.
|
|
22
22
|
|
|
23
|
-
The package consolidates five earlier research projects into one citable stack and adds the
|
|
23
|
+
The package consolidates five earlier research projects into one citable stack and adds the maps and the design engine the field was missing: a genome-wide Writable-Genome atlas, a cross-family Writer Atlas, an inverse-design Write Planner, a per-mechanism off-target engine, a design-stage biosecurity gate, immunogenicity and delivery profiling, a calibrated digital twin, and a grounded agent that drives them end to end. All of it runs under one engineered invariant: every reported quantity comes from a validated tool or an out-of-distribution-gated oracle, never from a language model, and anything out of scope is returned as a known-unknown rather than guessed. It runs on a single GPU, uses bulk-downloadable public data, and is validated against pre-registered baselines with the negatives reported in full.
|
|
24
24
|
|
|
25
25
|
See the [CHANGELOG](CHANGELOG.md) for release history and [docs/](docs/) for the full documentation.
|
|
26
26
|
|
|
@@ -31,55 +31,57 @@ See the [CHANGELOG](CHANGELOG.md) for release history and [docs/](docs/) for the
|
|
|
31
31
|
| Where can you write? | Labs re-derive ad-hoc "safe harbour" shortlists from inconsistent criteria; published lists range from thousands of sites to a few dozen, rarely predict expression durability, and usually cover one cell type. | The Writable Genome: a learned, cell-type-aware, writer-aware atlas scoring every locus for safety (genotoxicity risk), durability (whether a cassette stays expressed), and reachability (which enzyme can engage it). |
|
|
32
32
|
| What can write there, and how well? | Enzyme capabilities are scattered across papers, with no catalogue placing the genome-writing families on common measured axes with their targeting requirements. | The Writer Atlas: 33,370 enzyme systems across 8 families on common measured axes, joined to the Writable Genome by a bidirectional cross-link. |
|
|
33
33
|
| How do I design the write? | Destination, enzyme, cargo, and delivery are interdependent and goal-dependent, and no tool optimises them together. | The Write Planner: inverse design that, given a goal and an edit intent, returns ranked, traceable site, writer, cargo, and delivery plans. |
|
|
34
|
-
| Where might
|
|
34
|
+
| Where might the write go off-target? | Off-target behaviour differs by writer mechanism, and most writer classes had no genome-wide screening tool. | A per-mechanism off-target engine across five writer classes (RNA-guided nuclease, serine integrase, prime-editing integrase, CAST, and bridge recombinase). It behaves like established nuclease tools where genome-wide assay data exists and reports a truthful mechanism-based screen, with its validation status, where it does not. |
|
|
35
|
+
| Can I trust the outputs? | LLM design assistants produce fluent but unsourced quantities, and large-cargo design is dual-use. | A no-fabrication invariant (every number traces to a validated tool) that we verify with the model live, and a design-stage biosecurity gate that screens function, family, taxon, and raw sequence before any protocol can be emitted. |
|
|
35
36
|
|
|
36
37
|
## Architecture
|
|
37
38
|
|
|
38
|
-
A goal enters through one of the interfaces. The agent layer turns it into candidate designs. Every candidate passes through the verifier, the central gate: it runs a biosecurity screen first, checks the design against the rule base, attaches a calibrated confidence and a per-axis immune-risk profile, and discards anything that is unsafe, illegal, or uncalibrated. The reference layers and the oracle mesh supply the grounded answers the verifier and planner rely on, and everything rests on public data. No value is reported without a traceable source.
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
39
|
+
A goal enters through one of the interfaces. The agent layer turns it into candidate designs. Every candidate passes through the verifier, the central gate: it runs a biosecurity screen first, checks the design against the rule base, attaches a calibrated confidence and a per-axis immune-risk profile, and discards anything that is unsafe, illegal, or uncalibrated. The reference layers and the oracle mesh supply the grounded answers the verifier and planner rely on, and everything rests on public data. No value is reported without a traceable source, and no value comes from a language model.
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
Interfaces
|
|
43
|
+
CLI | REST API | MCP server | Web app
|
|
44
|
+
|
|
|
45
|
+
v
|
|
46
|
+
Agent layer
|
|
47
|
+
Co-scientist | Write Planner | Experiment Designer
|
|
48
|
+
(goal -> typed WriteSpec -> ranked site / writer / cargo / delivery plan)
|
|
49
|
+
|
|
|
50
|
+
v
|
|
51
|
+
+===========================================================+
|
|
52
|
+
| VERIFIER (the central gate, runs on every design) |
|
|
53
|
+
| 1. biosecurity screen 2. legality rules |
|
|
54
|
+
| 3. calibrated confidence 4. per-axis immune-risk |
|
|
55
|
+
| unsafe / illegal / uncalibrated designs are rejected |
|
|
56
|
+
+===========================================================+
|
|
57
|
+
|
|
|
58
|
+
v
|
|
59
|
+
Reference and model layers
|
|
60
|
+
+-------------------+ +----------------+ +-------------------+
|
|
61
|
+
| Writable Genome | | Writer Atlas | | Oracle mesh |
|
|
62
|
+
| per-locus safety, | | 33,370 enzyme | | AlphaFold3, Evo2, |
|
|
63
|
+
| durability, | | systems, 8 | | AlphaGenome, |
|
|
64
|
+
| expression- | | families, on | | ESM3, RFdiffusion,|
|
|
65
|
+
| robustness, | | common axes, | | ProteinMPNN under |
|
|
66
|
+
| reachability, | | cross-linked | | one OracleResult |
|
|
67
|
+
| per-mechanism | | to every locus | | contract (scope- |
|
|
68
|
+
| off-target | | | | gated, provenance)|
|
|
69
|
+
+-------------------+ +----------------+ +-------------------+
|
|
70
|
+
|
|
|
71
|
+
v
|
|
72
|
+
Public data: hg38, ENCODE / Roadmap chromatin, TRIP, CancerMine (CC0),
|
|
73
|
+
DepMap, VISDB, UniProt, Pfam / InterPro, Europe PMC, Perry 2025 bridge data
|
|
72
74
|
```
|
|
73
75
|
|
|
74
76
|
## Components
|
|
75
77
|
|
|
76
78
|
| Component | Module | What it does |
|
|
77
79
|
|---|---|---|
|
|
78
|
-
| Writable Genome | `pen_stack.wgenome` | Learned per-locus safety, durability, and reachability; 3D structural-risk axis;
|
|
80
|
+
| Writable Genome | `pen_stack.wgenome` | Learned per-locus safety (genotoxicity risk), expression-robustness (durability), and writer reachability; a 3D structural-risk axis; and a per-mechanism off-target engine across five writer classes with per-class validation status. |
|
|
79
81
|
| Writer Atlas | `pen_stack.atlas`, `.mech`, `.score` | Cross-family enzyme catalogue and Writer-Targeting knowledge base, cross-linked to loci. |
|
|
80
82
|
| Write Planner | `pen_stack.planner` | Inverse design conditioned on an edit intent, including the delivery palette and the delivery-immunology profile. |
|
|
81
83
|
| Verifier | `pen_stack.verify`, `pen_stack.rules` | `verify(design)` returns legality, biosecurity verdict, calibrated confidence, and the immune-risk profile as distinct axes. |
|
|
82
|
-
| Biosecurity gate | `pen_stack.safety` | A dual-use screening gate that runs first in `verify()`, screening declared function, family, and taxon signatures and translating a raw cargo sequence against curated Pfam toxin-family profiles; a refusal short-circuits scoring, with a tamper-evident audit trail. |
|
|
84
|
+
| Biosecurity gate | `pen_stack.safety` | A dual-use screening gate that runs first in `verify()`, screening declared function, family, and taxon signatures and translating a raw cargo sequence against curated Pfam toxin-family profiles; a refusal short-circuits scoring, with a tamper-evident audit trail. It reads hazard content only from declared fields (`cargo_function`, `function_annotation`, `goal_function`, `source_taxon`, `organism`, `host_taxon`, `cargo_seq`, `cargo_sequence`); content in `edit_intent` or other framing fields is not screened, so a verdict with `declared_signal=False` means "nothing screenable was declared", not "screened and safe" (see [`docs/biosecurity.md`](docs/biosecurity.md)). |
|
|
83
85
|
| Oracle mesh | `pen_stack.oracles` | One `OracleResult` contract over the biomolecular foundation models, with provenance, native uncertainty, and a scope card; generated output is a candidate, out-of-distribution inputs are flagged. |
|
|
84
86
|
| World-model graph | `pen_stack.graph` | A typed, provenanced knowledge graph with a gated, propose-only update loop. |
|
|
85
87
|
| Generative designer | `pen_stack.design` | Proposes candidate writing systems and keeps only those that pass safety, legality, and calibration, returning a Pareto frontier. |
|
|
@@ -89,17 +91,18 @@ flowchart TB
|
|
|
89
91
|
| Closed loop | `pen_stack.loop`, `pen_stack.active` | A gated design, build, test, learn loop with drift detection and versioned, reversible recalibration; an SDL-brain benchmark and a validation-campaign engine that orders the most-informative next measurements by expected information gain. |
|
|
90
92
|
| Write intent (WriteSpec) | `pen_stack.spec` | A typed, ontology-backed `WriteRequest` (an SBOL3 profile) with a grounded extractor that resolves free text to verified ontology ids, asks clarifying questions on ambiguity, and runs a SAT feasibility check. |
|
|
91
93
|
| Agent, co-scientist, and chat | `pen_stack.agent`, `pen_stack.web`, `pen_stack.rag` | Goal to cited, auditable plan; MCP server; the co-scientist that drives the loop; and the grounded conversational chat (four lanes: design, explain, meta, general; provenance-tagged retrieval; a swappable LLM provider). |
|
|
92
|
-
| Bridge off-target engine | `pen_stack.bridge` |
|
|
94
|
+
| Bridge off-target engine | `pen_stack.bridge` | The measured-data-validated off-target engine for bridge recombinases (IS110/IS621): candidate-site nomination, ranking, and guide QC, validated on the Perry 2025 data. |
|
|
95
|
+
| Immunogenicity and delivery | `pen_stack.planner` | Per-writer T-cell immunogenicity profiling (NetMHCpan / NetMHCIIpan) with a human-albumin self-control, a delivery-vehicle palette, and anti-drug-antibody and anti-PEG proxies, each labelled by validation status. |
|
|
93
96
|
| Interfaces | `pen_stack.server`, `pen_stack.web`, `pen_stack.ui`, `pen_stack.cli` | REST API, web application, and command-line tools. |
|
|
94
97
|
|
|
95
98
|
## Key results
|
|
96
99
|
|
|
97
100
|
All results are blind and pre-registered (success criteria, baselines, and held-out sets are SHA-locked in [`prereg/`](prereg/) before any model sees the test data). Estimates are reported with their sample size and confidence interval.
|
|
98
101
|
|
|
99
|
-
- **
|
|
100
|
-
- **
|
|
101
|
-
- **
|
|
102
|
-
- **
|
|
102
|
+
- **Expression-robustness axis (the headline result).** A per-locus prediction of whether an integrated cassette stays expressed rather than being positionally silenced. On measured human K562 position-effect data (Leemans 2019) the axis reaches a held-out Spearman rho of 0.571 (0.558 on an independent held-out variant), and it is empirically *distinct* from ePRIDICT's chromatin prediction of prime-editing efficiency (rho 0.212, R-squared 0.041 across 7,295 loci): a complementary signal, not a restatement of one. It is validated at exact-site resolution; the deployment commonly serves coarse 1-kb features, at which the axis reaches rho about 0.16, and that gap is reported as a result rather than claimed away. See [`benchmarks/position_effect_human/`](benchmarks/position_effect_human/).
|
|
103
|
+
- **Writable Genome and the integrated safety filter.** A genome-wide atlas of 3,031,030 loci across three cell types (K562, HepG2, CD34+ HSPC) recovers experimentally validated safe harbours as highly writable and clinical genotoxic loci as non-writable, blind. The three-way integrated score (safety x durability x reachability) is characterised honestly as a *reject-known-bad safety filter*: against oncogene-distance and accessibility-matched controls it reaches AUROC 0.679 (95% CI 0.536 to 0.825) versus a safety-only baseline of 0.51, with real false negatives on documented clinical genotoxic loci reported in full; it is not a calibrated genotoxicity predictor.
|
|
104
|
+
- **Writer Atlas.** 33,370 enzyme systems across 8 families on common measured axes; the mechanism classifier agrees with the audited labels on the curated core (1.00); the cross-link to loci is validated on AAVS1. Writer-family recovery at rank 1 is 0.86 against a prevalence of 0.29.
|
|
105
|
+
- **Per-mechanism off-target engine.** The RNA-guided nuclease path *wraps* the published CRISOT scorer (which beats naive homology, CRISOT's own result, stated plainly). The serine-integrase path, on the Chalberg 115-site human genomic pseudo-attP set, reaches AUROC 0.637 and AUPRC 0.215, beating a palindrome baseline (CI excludes zero) and matching an attP-similarity baseline on AUROC while beating it on AUPRC: an informative two-stage result, reported as such. The bridge path (Perry 2025, 6,856 measured off-targets) ranks real off-targets above core-disrupted decoys at AUROC 0.77 versus 0.62 for Hamming distance. The bridge and CAST paths are mechanism-based screens, not per-site risk calculators, and are labelled as such.
|
|
103
106
|
- **No fabrication, measured with the model live.** Given no tools, an ungrounded LLM fabricates 91 to 99 percent of the tool-only planning quantities (writability, safety, durability, off-target count, structural risk, coordinate) under a naive prompt, across three model families spanning a small local model to hosted-frontier models; the same models driving the validated tools as an agent fabricate none, every number audited to a direct tool call. Anti-fabrication prompting is an uneven guardrail; grounding is not. See [`benchmarks/grounding_llm_on/`](benchmarks/grounding_llm_on/) and [`benchmarks/agentic_baseline/`](benchmarks/agentic_baseline/).
|
|
104
107
|
|
|
105
108
|
## Installation
|
|
@@ -169,6 +172,23 @@ docker compose run --rm bench python bench/run.py --agent # on the clean i
|
|
|
169
172
|
|
|
170
173
|
The deterministic planner beats the naive baselines on the grounded tasks; a tool-using LLM agent reaches the planner's numbers only by grounding every value (zero fabricated), while the same models with no tools fabricate the tool-only fields. See [`benchmarks/genome_writing_bench/`](benchmarks/genome_writing_bench/). The held-out public leaderboard is the [Genome-Writing Challenge](benchmarks/genome_writing_challenge/).
|
|
171
174
|
|
|
175
|
+
Every benchmark ships a frozen split with a SHA-256 lock and a committed `metrics.json`, so a fresh clone reproduces the central numbers with no download and no API key:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
make repro # demo-atlas quickstart, grounding eval, agentic baseline, and the recomputed headline result
|
|
179
|
+
make repro-human # recompute the headline human K562 expression-robustness result (rho=0.571) from source data
|
|
180
|
+
make repro-full # the above plus the genome-wide atlas benchmarks (needs 'make fetch' with ZENODO_DOI)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
The headline expression-robustness result is **recomputed from source, not read from a stored number**:
|
|
184
|
+
`scripts/p2_build_human_head.py` (run by `make repro-human`, and folded into `make repro`) trains the shipped
|
|
185
|
+
twin on the committed Leemans K562 features table, holds out chromosomes 3/8/12 exactly as the sealed
|
|
186
|
+
pre-registration specifies, and asserts the recomputed held-out Spearman correlation (0.5711) matches the
|
|
187
|
+
committed metrics. The three headline analyses each ship their metrics: the human K562 expression-robustness
|
|
188
|
+
head ([`benchmarks/position_effect_human/`](benchmarks/position_effect_human/)), the integrase off-target set
|
|
189
|
+
([`benchmarks/offtarget/integrase_chalberg/`](benchmarks/offtarget/integrase_chalberg/)), and the clinical
|
|
190
|
+
genotoxicity panel ([`benchmarks/genotox_panel/`](benchmarks/genotox_panel/)).
|
|
191
|
+
|
|
172
192
|
## Built on prior repositories
|
|
173
193
|
|
|
174
194
|
PEN-STACK consolidates and re-grounds five earlier projects. Their reusable assets are imported here; the originals are archived read-only for provenance and DOI stability.
|
|
@@ -233,16 +253,19 @@ Large artifacts (multi-million-row atlases, BigWig tracks, trained models) and a
|
|
|
233
253
|
|
|
234
254
|
## Data sources
|
|
235
255
|
|
|
236
|
-
All public: hg38 (UCSC)
|
|
256
|
+
All public, and license-clean by policy. Genome and annotation: hg38 (UCSC), GENCODE v46. Chromatin: ENCODE and Roadmap (ATAC/DNase and histone marks for K562, HepG2, CD34+ progenitor, and mouse ES-Bruce4). Position-effect: TRIP (Akhtar 2013, GEO GSE49806/GSE49807) and the Leemans 2019 K562 TRIP data, which is the external validation of the expression-robustness axis. Safety: **CancerMine (CC0)** is the default oncogene and tumour-suppressor source; DepMap Public 26Q1 essentiality; LaFave 2014 MLV integrations; VISDB. Enzymes: UniProt orthologs, Pfam and InterPro. Off-target: the Perry 2025 bridge-recombinase off-target and DMS data (copyrighted, kept local, only derived products released) and the Chalberg 2006 genomic pseudo-attP set. Literature and reagents: Europe PMC, Addgene.
|
|
257
|
+
|
|
258
|
+
License-restricted sources (COSMIC Cancer Gene Census, OncoKB) are **never committed and never used as training data**; they are optional, local-only enrichers a registered user pulls under their own license, and a CI test fails if a restricted source appears as a shipped derived-data source. Every accession and DOI is pinned in [`configs/datasets.yaml`](configs/datasets.yaml) and indexed in [`DATA_SOURCES.md`](DATA_SOURCES.md); the full open-data policy is in [`DATA_LICENSES.md`](DATA_LICENSES.md).
|
|
237
259
|
|
|
238
260
|
## Validation approach
|
|
239
261
|
|
|
240
|
-
- Pre-register before training: success criteria, baselines, and held-out sets are SHA-locked in `prereg/` before any model sees test data.
|
|
241
|
-
- Always report a baseline
|
|
262
|
+
- Pre-register before training: success criteria, baselines, and held-out sets are SHA-locked in `prereg/` before any model sees the test data.
|
|
263
|
+
- Always report a baseline: a safety-only far-from-oncogene prior and CancerMine oncogene distance for the integrated score; a learned lamina-associated-domain chromatin baseline and ePRIDICT for the expression-robustness axis; intent-blind ranking for the planner; and attP-similarity, palindrome, or Hamming-distance baselines for the per-mechanism off-target paths.
|
|
264
|
+
- Guard against circularity: the expression-robustness axis is validated with lamina and heterochromatin features removed, so it cannot restate a chromatin baseline, and no task is scored against a label derived from the model's own features (asserted by a dedicated de-circularization test).
|
|
242
265
|
- Blind external concordance: recover validated safe harbours, clinical genotoxic loci, documented writes, and measured off-targets the model never trained on.
|
|
243
|
-
- Report failure: cross-cell-type degradation, small benchmark sizes, and the limits of sequence-only off-target magnitude prediction are reported as results, not footnotes.
|
|
266
|
+
- Report failure: cross-cell-type degradation, the exact-site-versus-served-resolution gap, small benchmark sizes, and the limits of sequence-only off-target magnitude prediction are reported as results, not footnotes.
|
|
244
267
|
- Every estimate carries its sample size and confidence interval. The validated gold sets are small, and statistical power is a stated limitation; scaling them is the top priority for turning the proof of concept into an adopted resource.
|
|
245
|
-
- Grounded services: every quantitative answer comes from a validated tool call, never a language model; the living database never auto-edits the atlas; clinical directives are refused.
|
|
268
|
+
- Grounded services: every quantitative answer comes from a validated tool call, never a language model, verified with the model live; the living database never auto-edits the atlas; clinical directives are refused.
|
|
246
269
|
|
|
247
270
|
## Citation
|
|
248
271
|
|
|
@@ -251,7 +274,7 @@ All public: hg38 (UCSC); ENCODE and Roadmap chromatin (ATAC/DNase and histone ma
|
|
|
251
274
|
author = {Mahaboob Ali, Anees Ahmed},
|
|
252
275
|
title = {PEN-STACK: open infrastructure for genome writing (The Writable Genome)},
|
|
253
276
|
year = {2026},
|
|
254
|
-
version = {8.0.
|
|
277
|
+
version = {8.0.2},
|
|
255
278
|
url = {https://github.com/ahmedanees-m/pen-stack}
|
|
256
279
|
}
|
|
257
280
|
```
|
|
@@ -260,9 +283,10 @@ Author: Anees Ahmed Mahaboob Ali, VIT University, Vellore. MIT licensed.
|
|
|
260
283
|
|
|
261
284
|
## API stability
|
|
262
285
|
|
|
263
|
-
Version 8.0.
|
|
264
|
-
|
|
265
|
-
|
|
286
|
+
Version 8.0.2 is the current stable release; 8.0.0 established the committed public API and the 8.0.x patches
|
|
287
|
+
(8.0.1, 8.0.2) are reproducibility, documentation, and API-hardening fixes within it (no signature changes). The committed public API is the SDK
|
|
288
|
+
functions, the REST endpoints, and the twenty-two MCP tools; these follow semantic versioning with a
|
|
289
|
+
one-minor-version deprecation warning before any breaking change. Stable surfaces carry calibrated uncertainty and an explicit validation
|
|
266
290
|
status. The mechanism-based off-target paths (serine-integrase, bridge, and CAST) are marked experimental and
|
|
267
291
|
may change as measured data becomes available. The major version marks this API commitment; it consolidates
|
|
268
292
|
the gated 7.x development history rather than replacing it, so every pre-registration, sealed benchmark, and
|