pen-stack 6.5.0__tar.gz → 6.6.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pen_stack-6.5.0 → pen_stack-6.6.0}/CHANGELOG.md +26 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/CITATION.cff +1 -1
- {pen_stack-6.5.0 → pen_stack-6.6.0}/PKG-INFO +2 -2
- {pen_stack-6.5.0 → pen_stack-6.6.0}/README.md +1 -1
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/genotoxicity_oracle.yaml +19 -19
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/metric_guide.yaml +1 -1
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/oracles/scope_cards.yaml +4 -4
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/__init__.py +1 -1
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/ingest_safety_annot.py +48 -11
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/genotoxicity_oracle.py +6 -6
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack.egg-info/PKG-INFO +2 -2
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack.egg-info/SOURCES.txt +1 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pyproject.toml +1 -1
- pen_stack-6.6.0/scripts/fetch_licensed_sources.py +57 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p52_build_genotox_oracle.py +7 -4
- {pen_stack-6.5.0 → pen_stack-6.6.0}/LICENSE +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/MANIFEST.in +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/bench/run.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/README.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_challenge/README.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/antipeg.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/atlas_families.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/bridge_offtarget_profile.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/calibration/preexisting_nab_independent.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/capsid_epitope_oracle.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/capsid_sequences.fasta +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/cargo_polish.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/cell_types.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/datasets.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/delivery_constraints.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/delivery_rules.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/delivery_vehicles.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/expression/modifiers.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/expression/promoters.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/gates_v3.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/gsh_validated_heldout.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/intent_weights.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/known_unknowns.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/llm.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/monitor_queries.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/oracles/execution.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/rules/delivery.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/rules/fold.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/rules/multiplex.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/rules/payload.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/rules/reachability.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/safety/hazard_registry.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/safety/policy.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/safety/probes.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/score_axes.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/seroprevalence.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/target_sites.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/universe_crosswalk.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/write_types.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/wtkb_curated.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/data/curated/bridge_offtarget_energetics.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/data/curated/gene_coords.parquet +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/data/curated/unified_editor_universe.parquet +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/BACKLOG.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/DEPLOY.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/INFRA.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/MCP.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/RELEASING.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/REPRO.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/STABILITY.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/agent.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/alphagenome_feasibility.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/autonomy.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/benchmark_circularity.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/biosecurity.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/build_interface.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/cards/atlas.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/cards/durability.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/cards/safety.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/challenge.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/closed_loop.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/co_scientist.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/co_scientist_loop.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/delivery.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/delivery_immunology.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/digital_twin.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/dissemination.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/environment.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/experiment_design.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/generative_design.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/index.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/integrations.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/live_oracles.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/mechanistic_constraints.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/oracles.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/positioning.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/private_data_formats.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/quickstart.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/responsible_use.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/rules.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/scope.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/scorecard.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/tutorials/compare-families.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/tutorials/score-deliverability.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/tutorials/where-can-i-write.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/uncertainty.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/verify.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/world_model.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/writer_verification.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/wtkb.md +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/_resources.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/active/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/active/acquire.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/active/design.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/active/validate.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/adapt/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/adapt/finetune.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/adapt/ingest.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/adapt/pipeline.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/adapt/recalibrate.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/adapt/report.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/cite.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/co_scientist.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/epistemic.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/guardrails.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/mcp_server.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/orchestrator.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/orchestrator_live.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/pen_agent.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/scope.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/tools.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/api/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/api/manifest.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/build_wtkb.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/crosslink.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/expand.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/schema.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/scorecard.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/universe.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/variant_propose.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/writer_verify.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/activity.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/cli.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/fold_qc.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/guide_qc.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/ingest.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/offtarget.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/ortholog_screen.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/pipeline.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/build/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/build/ingest.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/build/protocol.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/build/simlab.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/cli.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/encode.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/genome.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/ingest_chromatin.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/ingest_integration.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/ingest_trip.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/design/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/design/generate.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/design/pareto.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/design/space.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/env/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/env/genome_writing_env.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/env/policies.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/graph/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/graph/build.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/graph/cell_types.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/graph/ingest.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/graph/query.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/graph/schema.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/loop/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/loop/continual.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/loop/cycle.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/loop/drift.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/mech/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/mech/classify_atlas.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/mech/whitelist.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/monitor/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/monitor/europepmc.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/monitor/run.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/monitor/triage.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/cache.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/energetics.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/genome.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/protein_design.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/rna.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/schema.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/status.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/structure.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/vcell.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/antipeg_oracle.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/cargo.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/cargo_polish.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/delivery.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/delivery_constraints.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/delivery_immunology.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/delivery_vehicles.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/immune_profile.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/innate_sensing.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/multiplex.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/optimize.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/pipeline.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/report.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/router.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/seroprevalence_oracle.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/target_site.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rag/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rag/index.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rag/llm.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rag/qa.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rules/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rules/evaluators.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rules/loader.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rules/schema.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rules/solver.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/audit.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/gate.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/policy.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/redteam.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/registry.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/screen.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/score/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/score/recalibrate.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/score/therapeutic.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/server/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/server/api.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/twin/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/twin/calibrate.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/twin/mechanistic.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/twin/outcome.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/ui/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/ui/app.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/adapt_demo.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/agent_eval.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/cargo_directionality.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/closed_loop.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/durability_baselines.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/experiment_design.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/forward_hypotheses.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/generative_design.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/guide_qc_demo.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/immune_calibration.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/intent_specification.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/outcome_calibration.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/outcome_prediction.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/paper3_benchmark.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/paper4_real_validation.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/paper4_validation.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/protocol_safety.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/safety_screening.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/selective_prediction.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/seq_vs_measured.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/target_site_controls.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/uncertainty_eval.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/within_locus_ranking.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/writer_recovery.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/verify/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/verify/schema.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/verify/service.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/web/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/web/guide.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/web/llm.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/web/router.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/web/server.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/web/tools.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/__init__.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/durability.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/export_tracks.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/features.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/mesh_features.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/ood.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/providers.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/safety.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/structure3d.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/uncertainty.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/writability.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack.egg-info/dependency_links.txt +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack.egg-info/entry_points.txt +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack.egg-info/requires.txt +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack.egg-info/top_level.txt +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_phase0.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_phase2.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_phase3.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_acq.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_calib.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_chat.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_continual.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_drift.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_gen.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_loop.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_mech.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_orch.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_peg.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_policy.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_profile.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_proto.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_screen.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/paper1.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/paper2.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/paper3.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/paper4.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/phase0.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_a.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_acq.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_aldesign.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_alvalidate.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_atlas.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_b.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_ba.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_ba_v33.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_ba_v45.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_bench.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_c.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_cal.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_calib.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_challenge.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_chat.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_cite.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_continual.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_cosci2.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_crit.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_ct.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_d.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_drift.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_e.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_env.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_ep.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_epitope.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_f.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_frontend.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_g.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_gen.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_genotox.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_graph.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_h.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_hybrid.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_immune.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_ingest.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_innate.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_loop.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_manifest.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_mc.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_mcp.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_mech.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_mon.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_o.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_openapi.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_orch.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_outcome.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_pareto.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_peg.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_plan.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_policy.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_profile.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_proto.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_r.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_redteam.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_route.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_screen.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_seroprev.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_simlab.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_twincal.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_uq.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_v.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_vcell.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_wv.yaml +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/calibrate_immune_axes.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p1_build_atlas.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p1_build_durability.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p1_export_tracks.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p1_safety_concordance.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p1_train_safety.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p1_validation_report.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p2_build_atlas.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p3_benchmark_report.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p4_genome_scan.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p53_build_epitope_oracle.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/ws_b_report.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/ws_c_report.py +0 -0
- {pen_stack-6.5.0 → pen_stack-6.6.0}/setup.cfg +0 -0
|
@@ -3,6 +3,32 @@
|
|
|
3
3
|
All notable changes to PEN-STACK are documented here. This file follows
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/) and the program's phase structure.
|
|
5
5
|
|
|
6
|
+
## [6.6.0] - 2026-06-16 - License-clean provenance (COSMIC → CancerMine)
|
|
7
|
+
|
|
8
|
+
**MINOR — provenance refactor, no new science, no capability lost.** The shipped artifact now sources the
|
|
9
|
+
oncogene/TSG/driver list from **CancerMine (CC0)** instead of COSMIC Cancer Gene Census (free for academia but
|
|
10
|
+
**no-redistribution**). Copyright protects the *compiled database*, not the *fact* that a gene is an oncogene — so
|
|
11
|
+
sourcing the *list* from a CC0 compilation removes all licensing doubt while keeping the same capability. Prep for
|
|
12
|
+
the BioFirewall release, whose open repo vendors PEN-STACK's hazard data. Workstream WS-LIC + WS-CM + WS-REGEN.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- `pen_stack/data/ingest_safety_annot.py` — `load_cancermine()` (CC0) is the **default** oncogene/TSG source
|
|
16
|
+
(HUGO→coords via GENCODE, `--min-citations` precision knob); `load_cosmic()` stays available but **off by
|
|
17
|
+
default** (bring-your-own-license, local enrichment only).
|
|
18
|
+
- `configs/genotoxicity_oracle.yaml` — regenerated from CancerMine; provenance + DOIs updated (CancerMine
|
|
19
|
+
10.1038/s41592-019-0422-y). `safety_{ct}.pkl` + the Writable-Genome atlas regenerated on CancerMine features
|
|
20
|
+
(re-deposited on Zenodo, superseding the COSMIC-derived deposit).
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
- **`DATA_LICENSES.md`** — every source × license × redistribution-status × where-used.
|
|
24
|
+
- `tests/unit/test_data_licenses.py` — **CI license gate**: fails if a restricted source (COSMIC/OncoKB) is the
|
|
25
|
+
shipped derived-data source or a raw restricted gene-list is committed; CancerMine is the default.
|
|
26
|
+
- `scripts/fetch_licensed_sources.py` — bring-your-own-license fetcher for COSMIC/OncoKB (local-only, validation).
|
|
27
|
+
|
|
28
|
+
### Honesty
|
|
29
|
+
- Metrics may shift (CancerMine has broader coverage than CGC) — reported, not hidden. The genotoxicity axis is a
|
|
30
|
+
**mechanism-grounded proxy (🟡, not outcome-validated)** before and after; the swap changes only the *source*.
|
|
31
|
+
|
|
6
32
|
## [6.5.0] - 2026-06-15 - Comprehensive expression model + honest proxy-validation pass
|
|
7
33
|
|
|
8
34
|
**MINOR feature release.** Two threads, one principle (no fabrication):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.6.0
|
|
4
4
|
Summary: Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner.
|
|
5
5
|
Author-email: Anees Ahmed Mahaboob Ali <ahmedaneesm@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -90,7 +90,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
90
90
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
91
91
|
[](LICENSE)
|
|
92
92
|
[](https://www.python.org/)
|
|
93
|
-
[](CHANGELOG.md)
|
|
94
94
|
[](docs/STABILITY.md)
|
|
95
95
|
[](tests/)
|
|
96
96
|
[](https://github.com/astral-sh/ruff)
|
|
@@ -15,7 +15,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
15
15
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
16
16
|
[](LICENSE)
|
|
17
17
|
[](https://www.python.org/)
|
|
18
|
-
[](CHANGELOG.md)
|
|
19
19
|
[](docs/STABILITY.md)
|
|
20
20
|
[](tests/)
|
|
21
21
|
[](https://github.com/astral-sh/ruff)
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
version: '1.0'
|
|
2
|
-
built: '2026-06-
|
|
2
|
+
built: '2026-06-16'
|
|
3
3
|
description: 'computed integration-site genotoxicity oracle: per vector class, the
|
|
4
|
-
observed enrichment of integration sites within window_bp of a
|
|
5
|
-
genome background. genotox_score = min(1, 1/enrichment). In-vivo clonal
|
|
6
|
-
is NOT modelled (stays a known-unknown).'
|
|
4
|
+
observed enrichment of integration sites within window_bp of a CancerMine (CC0)
|
|
5
|
+
oncogene vs genome background. genotox_score = min(1, 1/enrichment). In-vivo clonal
|
|
6
|
+
outcome is NOT modelled (stays a known-unknown).'
|
|
7
7
|
window_bp: 50000
|
|
8
|
-
genome_background_frac_oncogene_50kb: 0.
|
|
8
|
+
genome_background_frac_oncogene_50kb: 0.11538
|
|
9
9
|
inputs:
|
|
10
10
|
visdb: VISDB per-virus hg38 catalogues
|
|
11
|
-
oncogenes:
|
|
11
|
+
oncogenes: CancerMine (CC0) via safety_annot
|
|
12
12
|
provenance_dois:
|
|
13
13
|
- 10.1093/nar/gkz867
|
|
14
|
-
- 10.1038/
|
|
14
|
+
- 10.1038/s41592-019-0422-y
|
|
15
15
|
- 10.1016/S0092-8674(02)00864-4
|
|
16
16
|
- 10.1126/science.1083413
|
|
17
17
|
robust_min_n: 1000
|
|
@@ -19,29 +19,29 @@ classes:
|
|
|
19
19
|
lentiviral:
|
|
20
20
|
virus: HIV
|
|
21
21
|
n_sites: 88743
|
|
22
|
-
frac_oncogene_50kb: 0.
|
|
23
|
-
ci95: 0.
|
|
24
|
-
enrichment:
|
|
22
|
+
frac_oncogene_50kb: 0.2244
|
|
23
|
+
ci95: 0.00274
|
|
24
|
+
enrichment: 1.945
|
|
25
25
|
frac_genotoxic_cis: 0.000293
|
|
26
|
-
median_dist_oncogene:
|
|
26
|
+
median_dist_oncogene: 256384
|
|
27
27
|
robust: true
|
|
28
28
|
deltaretroviral:
|
|
29
29
|
virus: HTLV
|
|
30
30
|
n_sites: 51508
|
|
31
|
-
frac_oncogene_50kb: 0.
|
|
32
|
-
ci95: 0.
|
|
33
|
-
enrichment: 1.
|
|
31
|
+
frac_oncogene_50kb: 0.14472
|
|
32
|
+
ci95: 0.00304
|
|
33
|
+
enrichment: 1.254
|
|
34
34
|
frac_genotoxic_cis: 0.000369
|
|
35
|
-
median_dist_oncogene:
|
|
35
|
+
median_dist_oncogene: 547160
|
|
36
36
|
robust: true
|
|
37
37
|
gammaretroviral:
|
|
38
38
|
virus: MLV
|
|
39
39
|
n_sites: 32
|
|
40
|
-
frac_oncogene_50kb: 0.
|
|
41
|
-
ci95: 0.
|
|
42
|
-
enrichment:
|
|
40
|
+
frac_oncogene_50kb: 0.21875
|
|
41
|
+
ci95: 0.14324
|
|
42
|
+
enrichment: 1.896
|
|
43
43
|
frac_genotoxic_cis: 0.0
|
|
44
|
-
median_dist_oncogene:
|
|
44
|
+
median_dist_oncogene: 145675
|
|
45
45
|
robust: false
|
|
46
46
|
vehicle_class:
|
|
47
47
|
lentiviral:
|
|
@@ -14,7 +14,7 @@ metrics:
|
|
|
14
14
|
means: "relative insertional-oncogenesis safety of the delivery/integration strategy. 1.0 = episomal/
|
|
15
15
|
non-integrating (no integration → no insertional mutagenesis); lower = an integrating vector whose insertion
|
|
16
16
|
sites fall nearer known proto-oncogenes."
|
|
17
|
-
computed: "for integrating vectors, from VISDB integration-site maps ×
|
|
17
|
+
computed: "for integrating vectors, from VISDB integration-site maps × CancerMine (CC0) oncogene
|
|
18
18
|
proximity (per-vector enrichment of integrations within 50 kb of an oncogene vs background)."
|
|
19
19
|
validation: "mechanistic proxy — NOT outcome-validated (the actual clonal-transformation rate is measured, not predicted)."
|
|
20
20
|
reference: "e.g. lentiviral ~0.48 (2.08× oncogene-proximity enrichment) vs episomal AAV 1.0."
|
|
@@ -115,16 +115,16 @@ oracles:
|
|
|
115
115
|
|
|
116
116
|
delivery_genotoxicity: # v5.2 WS-GENOTOX: computed integration-site oncogene-proximity
|
|
117
117
|
family: genome
|
|
118
|
-
version: "visdb+
|
|
118
|
+
version: "visdb+cancermine-2026"
|
|
119
119
|
output_kind: baseline # an observed-data comparator (integration catalogues), not generative
|
|
120
120
|
valid_for: "RELATIVE genotoxicity ordering of INTEGRATING vector classes via the observed enrichment of
|
|
121
|
-
integration sites near
|
|
122
|
-
|
|
121
|
+
integration sites near CancerMine (CC0) oncogenes (lentiviral vs gammaretroviral, from VISDB x CancerMine);
|
|
122
|
+
reproduces the integrating-vector-enriched-near-oncogenes signal from data"
|
|
123
123
|
not_valid_for: "the IN-VIVO clonal-expansion / leukemogenesis OUTCOME in a patient (a known-unknown); an
|
|
124
124
|
absolute per-insertion oncogenesis probability; non-integrating vectors (no insertional mechanism);
|
|
125
125
|
classes with too few catalogued sites (flagged extrapolating)"
|
|
126
126
|
generalizes_to_unseen_loci: false
|
|
127
|
-
license: "open (this work; VISDB 10.1093/nar/gkz867,
|
|
127
|
+
license: "open / CC0 (this work; VISDB 10.1093/nar/gkz867, CancerMine 10.1038/s41592-019-0422-y)"
|
|
128
128
|
|
|
129
129
|
capsid_epitope: # v5.3 WS-EPITOPE: computed capsid/envelope CD8 T-cell epitope load
|
|
130
130
|
family: protein_design
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""PEN-STACK v3.0 - open infrastructure for genome writing."""
|
|
2
|
-
__version__ = "6.
|
|
2
|
+
__version__ = "6.6.0"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"""Safety annotations per 1 kb bin (Phase 1, Step 1.4).
|
|
1
|
+
"""Safety annotations per 1 kb bin (Phase 1, Step 1.4; v6.6 license-clean source).
|
|
2
2
|
|
|
3
|
-
Builds per-bin safety features from
|
|
4
|
-
DepMap CRISPRGeneEffect (essential genes), and GENCODE (gene/TSS distances):
|
|
3
|
+
Builds per-bin safety features from CancerMine (CC0; oncogene/TSG loci — the default, shipped) or COSMIC CGC
|
|
4
|
+
(local-only, bring-your-own-license), DepMap CRISPRGeneEffect (essential genes), and GENCODE (gene/TSS distances):
|
|
5
5
|
- dist_oncogene, dist_tsg, dist_essential, dist_tss (bp to nearest, via bedtools closest)
|
|
6
6
|
- genotoxic_cis flag (bins within a window of LMO2/MECOM/CCND2/PRDM16/HMGA2)
|
|
7
7
|
|
|
@@ -48,6 +48,30 @@ def load_cosmic(tsv: str) -> pd.DataFrame:
|
|
|
48
48
|
return df[["chrom", "start", "end", "GENE_SYMBOL", "role"]]
|
|
49
49
|
|
|
50
50
|
|
|
51
|
+
# v6.6: CancerMine (CC0) is the license-clean oncogene/TSG/driver source that REPLACES COSMIC CGC in the shipped
|
|
52
|
+
# artifact. Lever et al., Nat Methods 16:505-507 (2019), doi:10.1038/s41592-019-0422-y, CC0; Zenodo record 7689627.
|
|
53
|
+
# COSMIC stays available (load_cosmic) but OFF by default, for local enrichment under the user's own license (BYO).
|
|
54
|
+
CANCERMINE_URL = "https://zenodo.org/records/7689627/files/cancermine_collated.tsv?download=1"
|
|
55
|
+
_ROLE_MAP = {"Oncogene": "oncogene", "Tumor_Suppressor": "TSG", "Driver": "driver"}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def load_cancermine(tsv: str, genes: pd.DataFrame, min_citations: int = 3) -> pd.DataFrame:
|
|
59
|
+
"""CC0 oncogene/TSG/driver list. The collated file has one row per (gene, cancer, role) with a citation_count;
|
|
60
|
+
we aggregate per gene-role across cancers (sum citations), keep roles with >= min_citations, and map the HUGO
|
|
61
|
+
symbol -> genomic coordinates via GENCODE. Returns the SAME schema as load_cosmic (chrom,start,end,GENE_SYMBOL,
|
|
62
|
+
role) with the role string containing 'oncogene'/'TSG'/'driver' so the downstream filters are unchanged."""
|
|
63
|
+
cm = pd.read_csv(tsv, sep="\t", dtype=str)
|
|
64
|
+
cm["cites"] = pd.to_numeric(cm.get("citation_count"), errors="coerce").fillna(0)
|
|
65
|
+
agg = cm.groupby(["gene_normalized", "role"], as_index=False)["cites"].sum()
|
|
66
|
+
agg = agg[agg["cites"] >= float(min_citations)]
|
|
67
|
+
agg["rn"] = agg["role"].map(_ROLE_MAP).fillna(agg["role"])
|
|
68
|
+
roles = (agg.groupby("gene_normalized")["rn"]
|
|
69
|
+
.apply(lambda s: ",".join(sorted(set(s)))).reset_index(name="role"))
|
|
70
|
+
g = genes[["gene_name", "chrom", "start", "end"]].drop_duplicates("gene_name")
|
|
71
|
+
m = roles.merge(g, left_on="gene_normalized", right_on="gene_name", how="inner")
|
|
72
|
+
return m.rename(columns={"gene_normalized": "GENE_SYMBOL"})[["chrom", "start", "end", "GENE_SYMBOL", "role"]]
|
|
73
|
+
|
|
74
|
+
|
|
51
75
|
def load_depmap_essential(csv: str, thresh: float = -0.5) -> set[str]:
|
|
52
76
|
"""Common-essential genes: mean Chronos effect across cell lines < thresh."""
|
|
53
77
|
df = pd.read_csv(csv, index_col=0)
|
|
@@ -112,17 +136,24 @@ def nearest_dist(bins_bed: pybedtools.BedTool, feat_df: pd.DataFrame, name: str)
|
|
|
112
136
|
return out.groupby(["chrom", "start"], as_index=False)[name].min()
|
|
113
137
|
|
|
114
138
|
|
|
115
|
-
def build(bin_grid: str,
|
|
116
|
-
|
|
139
|
+
def build(bin_grid: str, depmap_csv: str, gencode_dest: str, sizes_tsv: str, out_parquet: str, *,
|
|
140
|
+
source: str = "cancermine", cancermine_tsv: str | None = None, cosmic_tsv: str | None = None,
|
|
141
|
+
min_citations: int = 3) -> pd.DataFrame:
|
|
142
|
+
"""Build per-bin safety features. `source` selects the LICENSE-CLEAN oncogene/TSG list: 'cancermine' (CC0,
|
|
143
|
+
default, shipped) or 'cosmic' (local-only, under the user's own license — bring-your-own-license enrichment)."""
|
|
117
144
|
grid = pd.read_parquet(bin_grid)[["chrom", "start", "bin"]]
|
|
118
145
|
bins_bed = _bed(grid.assign(end=grid["start"] + BIN_BP)).sort()
|
|
119
146
|
|
|
120
|
-
cosmic = load_cosmic(cosmic_tsv)
|
|
121
|
-
onco = cosmic[cosmic["role"].str.contains("oncogene", case=False, na=False)]
|
|
122
|
-
tsg = cosmic[cosmic["role"].str.contains("TSG", case=False, na=False)]
|
|
123
|
-
|
|
124
147
|
gtf = download_gencode(gencode_dest)
|
|
125
148
|
genes = parse_gencode_genes(gtf)
|
|
149
|
+
|
|
150
|
+
if source == "cosmic":
|
|
151
|
+
cg = load_cosmic(cosmic_tsv)
|
|
152
|
+
else: # default: CancerMine (CC0)
|
|
153
|
+
cg = load_cancermine(cancermine_tsv, genes, min_citations=min_citations)
|
|
154
|
+
onco = cg[cg["role"].str.contains("oncogene", case=False, na=False)]
|
|
155
|
+
tsg = cg[cg["role"].str.contains("TSG", case=False, na=False)]
|
|
156
|
+
|
|
126
157
|
ess_syms = load_depmap_essential(depmap_csv)
|
|
127
158
|
ess = genes[genes["gene_name"].isin(ess_syms)]
|
|
128
159
|
|
|
@@ -148,15 +179,21 @@ def build(bin_grid: str, cosmic_tsv: str, depmap_csv: str, gencode_dest: str,
|
|
|
148
179
|
def main() -> None:
|
|
149
180
|
ap = argparse.ArgumentParser()
|
|
150
181
|
ap.add_argument("--bin-grid", default="/data/features/bin_grid_1kb.parquet")
|
|
182
|
+
ap.add_argument("--source", choices=["cancermine", "cosmic"], default="cancermine",
|
|
183
|
+
help="oncogene/TSG source: cancermine (CC0, shipped default) or cosmic (local-only BYO-license)")
|
|
184
|
+
ap.add_argument("--cancermine", default="/data/external/cancermine_collated.tsv")
|
|
185
|
+
ap.add_argument("--min-citations", type=int, default=3,
|
|
186
|
+
help="CancerMine per-gene-role citation threshold (3 = validated precision: safety AUROC 0.74)")
|
|
151
187
|
ap.add_argument("--cosmic", default="/data/external/Cosmic_CancerGeneCensus_v104_GRCh38.tsv")
|
|
152
188
|
ap.add_argument("--depmap", default="/data/external/CRISPRGeneEffect.csv")
|
|
153
189
|
ap.add_argument("--gencode", default="/data/raw/gencode.v46.basic.gtf.gz")
|
|
154
190
|
ap.add_argument("--sizes", default="/data/raw/hg38.chrom.sizes")
|
|
155
191
|
ap.add_argument("--out", default="/data/features/safety_annot.parquet")
|
|
156
192
|
a = ap.parse_args()
|
|
157
|
-
df = build(a.bin_grid, a.
|
|
193
|
+
df = build(a.bin_grid, a.depmap, a.gencode, a.sizes, a.out, source=a.source,
|
|
194
|
+
cancermine_tsv=a.cancermine, cosmic_tsv=a.cosmic, min_citations=a.min_citations)
|
|
158
195
|
n_onco = (df["dist_oncogene"] == 0).sum()
|
|
159
|
-
print(f"safety_annot bins={len(df)} cols={[c for c in df.columns if c.startswith('dist') or c=='genotoxic_cis']}")
|
|
196
|
+
print(f"safety_annot[{a.source}] bins={len(df)} cols={[c for c in df.columns if c.startswith('dist') or c=='genotoxic_cis']}")
|
|
160
197
|
print(f"bins in an oncogene={n_onco} genotoxic_cis bins={int(df['genotoxic_cis'].sum())}")
|
|
161
198
|
|
|
162
199
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"""Computed genotoxicity oracle for integrating delivery vectors (v5.2, WS-GENOTOX).
|
|
2
2
|
|
|
3
3
|
Replaces the hard-coded `genotoxicity` ordinal tier (v5.1, documented prior) with a DATA-COMPUTED signal for
|
|
4
|
-
INTEGRATING vehicles: the observed enrichment of a vector class's integration sites near
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
INTEGRATING vehicles: the observed enrichment of a vector class's integration sites near CancerMine (CC0)
|
|
5
|
+
oncogenes, from VISDB integration catalogues x the Phase-1 oncogene annotation (configs/genotoxicity_oracle.yaml,
|
|
6
|
+
built by scripts/p52_build_genotox_oracle.py on the VM where the data lives). v6.6: oncogene source COSMIC->CancerMine.
|
|
7
7
|
|
|
8
8
|
genotox_score = min(1, 1 / enrichment) # 1 = safest; episomal/non-targeting ~ 1.0
|
|
9
9
|
|
|
@@ -46,7 +46,7 @@ def _vehicle_to_class() -> dict:
|
|
|
46
46
|
|
|
47
47
|
def _prov(source: str, **extra) -> Provenance:
|
|
48
48
|
art = _artifact()
|
|
49
|
-
return Provenance(model="
|
|
49
|
+
return Provenance(model="visdb_integration_x_cancermine", version=str(art.get("version", "1.0")),
|
|
50
50
|
source=source, extra={"built": art.get("built"),
|
|
51
51
|
"provenance_dois": art.get("provenance_dois", []), **extra})
|
|
52
52
|
|
|
@@ -55,7 +55,7 @@ def genotoxicity_oracle(vehicle_name: str) -> OracleResult:
|
|
|
55
55
|
"""Computed genotoxicity for a delivery vehicle, as an OracleResult (v4.0 contract).
|
|
56
56
|
|
|
57
57
|
- non-integrating vehicle -> genotox_score 1.0 by mechanism (episomal/transient; no insertional risk).
|
|
58
|
-
- integrating + computed class -> data-derived score from VISDB x
|
|
58
|
+
- integrating + computed class -> data-derived score from VISDB x CancerMine; small-n class -> extrapolating.
|
|
59
59
|
- integrating but no computed class / unknown vehicle -> available=False (caller falls back to the
|
|
60
60
|
documented `immune_safety.genotoxicity` tier; no number is fabricated)."""
|
|
61
61
|
rec = vehicle(vehicle_name)
|
|
@@ -97,7 +97,7 @@ def genotoxicity_oracle(vehicle_name: str) -> OracleResult:
|
|
|
97
97
|
native_uncertainty=nu, scope_card=_SCOPE_CARD, in_scope=True,
|
|
98
98
|
extrapolating=not robust, output_kind="baseline", available=True,
|
|
99
99
|
note=(f"{cls} integration is {enrich}x enriched within "
|
|
100
|
-
f"{_artifact().get('window_bp')} bp of a
|
|
100
|
+
f"{_artifact().get('window_bp')} bp of a CancerMine oncogene vs background "
|
|
101
101
|
f"({frac:.3%}, n={n}); genotox_score=min(1,1/enrichment)."
|
|
102
102
|
+ ("" if robust else " SMALL-N class: directional only (extrapolating).")
|
|
103
103
|
+ " In-vivo clonal outcome is a known-unknown (not modelled).")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.6.0
|
|
4
4
|
Summary: Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner.
|
|
5
5
|
Author-email: Anees Ahmed Mahaboob Ali <ahmedaneesm@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -90,7 +90,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
90
90
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
91
91
|
[](LICENSE)
|
|
92
92
|
[](https://www.python.org/)
|
|
93
|
-
[](CHANGELOG.md)
|
|
94
94
|
[](docs/STABILITY.md)
|
|
95
95
|
[](tests/)
|
|
96
96
|
[](https://github.com/astral-sh/ruff)
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pen-stack"
|
|
7
|
-
version = "6.
|
|
7
|
+
version = "6.6.0"
|
|
8
8
|
description = "Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Bring-your-own-license fetcher (v6.6, WS-LIC) — OPTIONAL local enrichment.
|
|
2
|
+
|
|
3
|
+
PEN-STACK ships open data only (CancerMine/DepMap/gnomAD/ClinGen/GENCODE). This script lets a REGISTERED academic
|
|
4
|
+
user pull license-restricted sources (COSMIC, OncoKB) into a gitignored `licensed_data/` under THEIR OWN license,
|
|
5
|
+
to enrich/validate the screen LOCALLY. The repo never contains that data; this only automates the user's own
|
|
6
|
+
licensed download (you still authenticate / accept the license yourself).
|
|
7
|
+
|
|
8
|
+
After fetching COSMIC, rebuild the safety features with the restricted source locally:
|
|
9
|
+
python -m pen_stack.data.ingest_safety_annot --source cosmic --cosmic licensed_data/cosmic_cgc.tsv ...
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
python scripts/fetch_licensed_sources.py --source cosmic # prints instructions; never bypasses the license
|
|
13
|
+
python scripts/fetch_licensed_sources.py --source oncokb
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
_LICENSED_DIR = Path("licensed_data") # gitignored
|
|
21
|
+
|
|
22
|
+
_INSTRUCTIONS = {
|
|
23
|
+
"cosmic": (
|
|
24
|
+
"COSMIC Cancer Gene Census — free for academic use WITH registration; NO redistribution.\n"
|
|
25
|
+
" 1. Register/login at https://cancer.sanger.ac.uk/cosmic/register\n"
|
|
26
|
+
" 2. Download 'Cancer Gene Census' (GRCh38 TSV) under YOUR account.\n"
|
|
27
|
+
f" 3. Save it to {_LICENSED_DIR}/cosmic_cgc.tsv (this dir is gitignored — never commit it).\n"
|
|
28
|
+
" 4. Rebuild locally: python -m pen_stack.data.ingest_safety_annot --source cosmic "
|
|
29
|
+
f"--cosmic {_LICENSED_DIR}/cosmic_cgc.tsv\n"
|
|
30
|
+
" NOTE: the SHIPPED default is CancerMine (CC0); COSMIC is local-only enrichment under your own license."
|
|
31
|
+
),
|
|
32
|
+
"oncokb": (
|
|
33
|
+
"OncoKB — academic API license; NO ML training, NO redistribution. VALIDATION/benchmarking only, with\n"
|
|
34
|
+
"written permission.\n"
|
|
35
|
+
" 1. Register at https://www.oncokb.org/account/register and request API/academic access.\n"
|
|
36
|
+
" 2. Email OncoKB describing your benchmarking use case to obtain written permission.\n"
|
|
37
|
+
f" 3. Download the cancer gene list to {_LICENSED_DIR}/oncokb_cancerGeneList.tsv (gitignored).\n"
|
|
38
|
+
" 4. Use it ONLY to validate/benchmark locus flags — never as training data, never committed."
|
|
39
|
+
),
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def main() -> None:
|
|
44
|
+
ap = argparse.ArgumentParser(description="BYO-license fetcher for COSMIC/OncoKB (local-only enrichment).")
|
|
45
|
+
ap.add_argument("--source", choices=sorted(_INSTRUCTIONS), required=True)
|
|
46
|
+
a = ap.parse_args()
|
|
47
|
+
_LICENSED_DIR.mkdir(exist_ok=True)
|
|
48
|
+
(_LICENSED_DIR / ".gitignore").write_text("*\n!.gitignore\n", encoding="utf-8") # belt-and-braces
|
|
49
|
+
print("=" * 78)
|
|
50
|
+
print(f"Bring-your-own-license: {a.source.upper()} (PEN-STACK ships CancerMine/CC0 by default)")
|
|
51
|
+
print("=" * 78)
|
|
52
|
+
print(_INSTRUCTIONS[a.source])
|
|
53
|
+
print("\nThis tool does NOT download restricted data for you — it documents your own licensed download.")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
if __name__ == "__main__":
|
|
57
|
+
main()
|
|
@@ -45,7 +45,9 @@ VIRUS_CLASS = {"HIV": "lentiviral", "HTLV": "deltaretroviral",
|
|
|
45
45
|
# which palette vehicles each computed class grounds (others are non-integrating -> handled by mechanism)
|
|
46
46
|
CLASS_VEHICLES = {"lentiviral": ["lentivirus"]}
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
# v6.6: oncogene SOURCE is CancerMine (CC0, via safety_annot), replacing COSMIC CGC. DOIs: VISDB; CancerMine;
|
|
49
|
+
# HIV/lentiviral integration biology; MLV/gammaretroviral. (COSMIC methodology may still be CITED in the paper.)
|
|
50
|
+
PROVENANCE_DOIS = ["10.1093/nar/gkz867", "10.1038/s41592-019-0422-y",
|
|
49
51
|
"10.1016/S0092-8674(02)00864-4", "10.1126/science.1083413"]
|
|
50
52
|
|
|
51
53
|
|
|
@@ -95,12 +97,13 @@ def build() -> dict:
|
|
|
95
97
|
"version": "1.0",
|
|
96
98
|
"built": _dt.date.today().isoformat(),
|
|
97
99
|
"description": ("computed integration-site genotoxicity oracle: per vector class, the observed "
|
|
98
|
-
"enrichment of integration sites within window_bp of a
|
|
99
|
-
"background. genotox_score = min(1, 1/enrichment). In-vivo clonal outcome is NOT "
|
|
100
|
+
"enrichment of integration sites within window_bp of a CancerMine (CC0) oncogene vs "
|
|
101
|
+
"genome background. genotox_score = min(1, 1/enrichment). In-vivo clonal outcome is NOT "
|
|
100
102
|
"modelled (stays a known-unknown)."),
|
|
101
103
|
"window_bp": WINDOW_BP,
|
|
102
104
|
"genome_background_frac_oncogene_50kb": round(background, 5),
|
|
103
|
-
"inputs": {"visdb": "VISDB per-virus hg38 catalogues",
|
|
105
|
+
"inputs": {"visdb": "VISDB per-virus hg38 catalogues",
|
|
106
|
+
"oncogenes": "CancerMine (CC0) via safety_annot"},
|
|
104
107
|
"provenance_dois": PROVENANCE_DOIS,
|
|
105
108
|
"robust_min_n": ROBUST_MIN_N,
|
|
106
109
|
"classes": classes,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|