pen-stack 5.10.0__tar.gz → 5.12.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pen_stack-5.10.0 → pen_stack-5.12.0}/CHANGELOG.md +63 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/CITATION.cff +1 -1
- {pen_stack-5.10.0 → pen_stack-5.12.0}/PKG-INFO +46 -7
- {pen_stack-5.10.0 → pen_stack-5.12.0}/README.md +45 -6
- {pen_stack-5.10.0 → pen_stack-5.12.0}/benchmarks/genome_writing_bench/SHA256SUMS +1 -1
- {pen_stack-5.10.0 → pen_stack-5.12.0}/benchmarks/genome_writing_bench/tasks.yaml +36 -1
- pen_stack-5.12.0/docs/autonomy.md +36 -0
- pen_stack-5.12.0/docs/build_interface.md +50 -0
- pen_stack-5.12.0/docs/closed_loop.md +54 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/__init__.py +1 -1
- pen_stack-5.12.0/pen_stack/build/__init__.py +16 -0
- pen_stack-5.12.0/pen_stack/build/ingest.py +47 -0
- pen_stack-5.12.0/pen_stack/build/protocol.py +82 -0
- pen_stack-5.12.0/pen_stack/build/simlab.py +30 -0
- pen_stack-5.12.0/pen_stack/loop/__init__.py +15 -0
- pen_stack-5.12.0/pen_stack/loop/continual.py +61 -0
- pen_stack-5.12.0/pen_stack/loop/cycle.py +84 -0
- pen_stack-5.12.0/pen_stack/loop/drift.py +41 -0
- pen_stack-5.12.0/pen_stack/validate/closed_loop.py +63 -0
- pen_stack-5.12.0/pen_stack/validate/protocol_safety.py +62 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack.egg-info/PKG-INFO +46 -7
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack.egg-info/SOURCES.txt +25 -0
- pen_stack-5.12.0/prereg/SHA256_LOCK_ws_continual.json +8 -0
- pen_stack-5.12.0/prereg/SHA256_LOCK_ws_drift.json +8 -0
- pen_stack-5.12.0/prereg/SHA256_LOCK_ws_ingest.json +8 -0
- pen_stack-5.12.0/prereg/SHA256_LOCK_ws_loop.json +8 -0
- pen_stack-5.12.0/prereg/SHA256_LOCK_ws_proto.json +8 -0
- pen_stack-5.12.0/prereg/SHA256_LOCK_ws_simlab.json +8 -0
- pen_stack-5.12.0/prereg/ws_continual.yaml +18 -0
- pen_stack-5.12.0/prereg/ws_drift.yaml +17 -0
- pen_stack-5.12.0/prereg/ws_ingest.yaml +18 -0
- pen_stack-5.12.0/prereg/ws_loop.yaml +19 -0
- pen_stack-5.12.0/prereg/ws_proto.yaml +19 -0
- pen_stack-5.12.0/prereg/ws_simlab.yaml +17 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pyproject.toml +1 -1
- {pen_stack-5.10.0 → pen_stack-5.12.0}/LICENSE +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/MANIFEST.in +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/bench/run.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/benchmarks/genome_writing_bench/README.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/antipeg.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/atlas_families.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/bridge_offtarget_profile.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/capsid_epitope_oracle.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/capsid_sequences.fasta +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/cargo_polish.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/cell_types.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/datasets.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/delivery_constraints.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/delivery_rules.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/delivery_vehicles.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/gates_v3.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/genotoxicity_oracle.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/gsh_validated_heldout.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/intent_weights.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/known_unknowns.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/llm.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/monitor_queries.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/oracles/scope_cards.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/rules/delivery.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/rules/fold.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/rules/multiplex.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/rules/payload.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/rules/reachability.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/safety/hazard_registry.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/safety/policy.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/safety/probes.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/score_axes.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/seroprevalence.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/target_sites.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/universe_crosswalk.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/write_types.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/configs/wtkb_curated.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/data/curated/bridge_offtarget_energetics.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/data/curated/gene_coords.parquet +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/data/curated/unified_editor_universe.parquet +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/BACKLOG.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/DEPLOY.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/INFRA.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/MCP.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/RELEASING.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/REPRO.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/agent.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/alphagenome_feasibility.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/benchmark_circularity.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/biosecurity.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/cards/atlas.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/cards/durability.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/cards/safety.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/co_scientist.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/delivery.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/delivery_immunology.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/digital_twin.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/dissemination.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/environment.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/experiment_design.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/generative_design.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/index.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/mechanistic_constraints.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/oracles.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/positioning.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/private_data_formats.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/quickstart.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/responsible_use.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/rules.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/scope.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/scorecard.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/tutorials/compare-families.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/tutorials/score-deliverability.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/tutorials/where-can-i-write.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/uncertainty.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/verify.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/world_model.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/writer_verification.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/docs/wtkb.md +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/_resources.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/active/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/active/acquire.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/active/design.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/active/validate.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/adapt/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/adapt/finetune.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/adapt/ingest.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/adapt/pipeline.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/adapt/recalibrate.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/adapt/report.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/agent/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/agent/cite.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/agent/co_scientist.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/agent/epistemic.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/agent/guardrails.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/agent/mcp_server.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/agent/orchestrator.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/agent/orchestrator_live.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/agent/pen_agent.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/agent/scope.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/agent/tools.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/atlas/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/atlas/build_wtkb.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/atlas/crosslink.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/atlas/expand.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/atlas/schema.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/atlas/scorecard.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/atlas/universe.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/atlas/variant_propose.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/atlas/writer_verify.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/bridge/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/bridge/activity.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/bridge/cli.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/bridge/fold_qc.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/bridge/guide_qc.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/bridge/ingest.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/bridge/offtarget.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/bridge/ortholog_screen.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/bridge/pipeline.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/cli.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/data/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/data/encode.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/data/genome.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/data/ingest_chromatin.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/data/ingest_integration.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/data/ingest_safety_annot.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/data/ingest_trip.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/design/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/design/generate.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/design/pareto.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/design/space.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/env/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/env/genome_writing_env.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/env/policies.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/graph/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/graph/build.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/graph/cell_types.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/graph/ingest.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/graph/query.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/graph/schema.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/mech/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/mech/classify_atlas.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/mech/whitelist.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/monitor/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/monitor/europepmc.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/monitor/run.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/monitor/triage.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/oracles/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/oracles/cache.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/oracles/energetics.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/oracles/genome.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/oracles/protein_design.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/oracles/rna.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/oracles/schema.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/oracles/structure.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/oracles/vcell.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/antipeg_oracle.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/cargo.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/cargo_polish.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/delivery.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/delivery_constraints.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/delivery_immunology.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/delivery_vehicles.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/genotoxicity_oracle.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/immune_profile.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/innate_sensing.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/multiplex.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/optimize.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/pipeline.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/report.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/router.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/seroprevalence_oracle.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/planner/target_site.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/rag/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/rag/index.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/rag/llm.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/rag/qa.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/rules/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/rules/evaluators.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/rules/loader.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/rules/schema.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/rules/solver.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/safety/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/safety/audit.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/safety/gate.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/safety/policy.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/safety/redteam.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/safety/registry.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/safety/screen.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/score/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/score/recalibrate.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/score/therapeutic.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/server/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/server/api.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/twin/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/twin/calibrate.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/twin/mechanistic.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/twin/outcome.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/ui/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/ui/app.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/adapt_demo.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/agent_eval.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/cargo_directionality.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/durability_baselines.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/experiment_design.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/forward_hypotheses.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/generative_design.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/guide_qc_demo.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/immune_calibration.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/intent_specification.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/outcome_calibration.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/outcome_prediction.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/paper3_benchmark.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/paper4_real_validation.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/paper4_validation.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/safety_screening.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/selective_prediction.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/seq_vs_measured.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/target_site_controls.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/uncertainty_eval.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/within_locus_ranking.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/validate/writer_recovery.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/verify/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/verify/schema.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/verify/service.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/wgenome/__init__.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/wgenome/durability.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/wgenome/export_tracks.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/wgenome/features.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/wgenome/mesh_features.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/wgenome/ood.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/wgenome/providers.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/wgenome/safety.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/wgenome/structure3d.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/wgenome/uncertainty.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack/wgenome/writability.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack.egg-info/dependency_links.txt +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack.egg-info/entry_points.txt +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack.egg-info/requires.txt +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/pen_stack.egg-info/top_level.txt +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_phase0.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_phase2.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_phase3.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_acq.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_calib.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_gen.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_mech.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_orch.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_peg.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_policy.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_profile.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_screen.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/paper1.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/paper2.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/paper3.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/paper4.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/phase0.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_a.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_acq.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_aldesign.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_alvalidate.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_atlas.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_b.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_ba.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_ba_v33.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_ba_v45.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_bench.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_c.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_cal.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_calib.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_cite.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_crit.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_ct.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_d.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_e.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_env.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_ep.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_epitope.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_f.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_g.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_gen.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_genotox.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_graph.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_h.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_immune.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_innate.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_mc.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_mech.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_mon.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_o.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_orch.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_outcome.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_pareto.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_peg.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_plan.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_policy.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_profile.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_r.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_redteam.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_route.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_screen.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_seroprev.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_twincal.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_uq.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_v.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_vcell.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/prereg/ws_wv.yaml +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/scripts/p1_build_atlas.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/scripts/p1_build_durability.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/scripts/p1_export_tracks.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/scripts/p1_safety_concordance.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/scripts/p1_train_safety.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/scripts/p1_validation_report.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/scripts/p2_build_atlas.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/scripts/p3_benchmark_report.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/scripts/p4_genome_scan.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/scripts/p52_build_genotox_oracle.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/scripts/p53_build_epitope_oracle.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/scripts/ws_b_report.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/scripts/ws_c_report.py +0 -0
- {pen_stack-5.10.0 → pen_stack-5.12.0}/setup.cfg +0 -0
|
@@ -3,6 +3,69 @@
|
|
|
3
3
|
All notable changes to PEN-STACK are documented here. This file follows
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/) and the program's phase structure.
|
|
5
5
|
|
|
6
|
+
## [5.12.0] - 2026-06-11 - v5.12 release: The Closed Loop (autonomy Level 3)
|
|
7
|
+
|
|
8
|
+
**Closed-Loop arc, Cycle 6 of 7.** Integrate everything into one continual design→build→test→learn cycle —
|
|
9
|
+
humans/lab in control, no fabrication, drift-aware. Reaches **autonomy Level 3** (the program's honest ceiling).
|
|
10
|
+
Workstreams WS-{LOOP,CONTINUAL,DRIFT} (+ WS-DEMO, WS-AUTONOMY), SHA-locked.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **WS-LOOP** — `pen_stack/loop/cycle.py`: `run_loop(goal, cell_state, …)` orchestrates every prior cycle each
|
|
14
|
+
round — generate (v5.8) → decide/batch (v5.10) → **safety-gated** export (v5.7 + v5.11) → run (sim-lab v5.11 /
|
|
15
|
+
real lab) → ingest (v4.5 gate) → drift (v5.12) → continual learn (v5.12). **Gated**: safety, build, and
|
|
16
|
+
belief-admission each await the `approver`. Returns `autonomy_level=3`, `human_in_control=True`,
|
|
17
|
+
`no_fabrication=True`. A hazardous candidate is discarded by the safety-gated pipeline before it is ever run.
|
|
18
|
+
- **WS-DRIFT** — `pen_stack/loop/drift.py`: `detect_drift(designs, results)` compares the v5.9 twin's predictions
|
|
19
|
+
vs observed readouts; growing miscalibration → `severity:"high"` → `inflate_intervals` (widen, don't over-trust).
|
|
20
|
+
- **WS-CONTINUAL** — `pen_stack/loop/continual.py`: `continual_update(...)` recalibrates trust + twin + immune
|
|
21
|
+
proxies on **admitted outcomes only**; each update is **versioned + reversible** (`rollback_to`); high drift
|
|
22
|
+
widens intervals; an admitted immune measurement **with a CI** can graduate a v5.6 proxy → outcome-validated.
|
|
23
|
+
Recalibration, **not** foundation-model retraining.
|
|
24
|
+
- **WS-DEMO + WS-AUTONOMY** — `loop_converges_faster_than_random` reports the active-vs-random convergence with a
|
|
25
|
+
bootstrap CI (retrospective/simulated, honest either way); `docs/autonomy.md` asserts the **Level-3 criteria**
|
|
26
|
+
(closed loop · human in control at every gate · anomaly flagging · no fabrication) and that Levels 4/5 are
|
|
27
|
+
**not** claimed.
|
|
28
|
+
- **WS-BENCH** — bench **v0.3.8**: new `closed_loop` hard-gate task — the gate is the loop's integrity (gated
|
|
29
|
+
end-to-end run + no-fabrication + Level-3 human-in-control + drift detection + versioned/reversible continual
|
|
30
|
+
learning); an ungated autopilot fails by construction. Convergence reported informationally.
|
|
31
|
+
- Docs: `docs/{closed_loop,autonomy}.md`; prereg `ws_{loop,continual,drift}` + SHA locks; deposit `phase_5.12/`.
|
|
32
|
+
|
|
33
|
+
### Notes
|
|
34
|
+
- The loop is **Level 3 — closed, but with humans/lab in control at every gate, NOT autonomous.** It runs in
|
|
35
|
+
silico via the sim-lab (a real lab attaches at the same interface); continual learning recalibrates rather than
|
|
36
|
+
retrains; drift covers calibration/residual shift, not all failures; the convergence demo is retrospective/
|
|
37
|
+
simulated, reported with CIs.
|
|
38
|
+
|
|
39
|
+
## [5.11.0] - 2026-06-11 - v5.11 release: The Build Interface (digital→physical bridge)
|
|
40
|
+
|
|
41
|
+
**Closed-Loop arc, Cycle 5 of 7.** Make designs executable and results ingestible — loop-ready, lab-optional,
|
|
42
|
+
safety-gated, with the immune-risk profile attached as protocol metadata. Workstreams WS-{PROTO,INGEST,SIMLAB},
|
|
43
|
+
SHA-locked.
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
- **WS-PROTO** — `pen_stack/build/protocol.py`: `export_protocol(design, experiment, target, actor)` for
|
|
47
|
+
Opentrons / PyLabRobot / cloud-lab. Runs `verify()` **first**: a safety-`refuse` or illegal design raises
|
|
48
|
+
**`ProtocolExportError`** (no export path for a flagged design); a cleared design is emitted as a **DRAFT**
|
|
49
|
+
("human/lab review required") carrying the v5.6 immune profile + provenance in its metadata. Never auto-run.
|
|
50
|
+
- **WS-INGEST** — `pen_stack/build/ingest.py`: `ingest_result(result, ...)` validates a result (assay / readout /
|
|
51
|
+
provenance) and turns it into a **quarantined measured edge Candidate**; the ONLY path into the curated
|
|
52
|
+
world-model is the v4.5 gate (`gate_admit`) — automated checks **and** explicit human approval. No auto-edit
|
|
53
|
+
(Principle 1). Immune measurements can begin validating the v5.6 proxies on a later pass.
|
|
54
|
+
- **WS-SIMLAB** — `pen_stack/build/simlab.py`: `run_simulated(protocol_ir, design, cell_state)` executes a
|
|
55
|
+
protocol in silico (samples from the v5.9 twin + measurement noise), **labelled `SIMULATED`**, so the closed
|
|
56
|
+
loop (v5.12) runs end-to-end **export → sim → ingest** without hardware; never enters the world-model as
|
|
57
|
+
measured truth.
|
|
58
|
+
- **WS-BENCH** — bench **v0.3.7**: new `protocol_safety` hard-gate task (`pen_stack/validate/protocol_safety.py`)
|
|
59
|
+
— a cleared design exports with immune metadata, a safety-refused/illegal design is blocked, and the simulated
|
|
60
|
+
loop completes with quarantined SIMULATED results; an ungated exporter (which would emit the hazardous protocol)
|
|
61
|
+
fails by construction.
|
|
62
|
+
- Docs: `docs/build_interface.md`; prereg `ws_{proto,ingest,simlab}` + SHA locks; deposit `phase_5.11/`.
|
|
63
|
+
|
|
64
|
+
### Notes
|
|
65
|
+
- PEN-STACK emits protocols and ingests results; it does **not** run experiments — protocols are drafts requiring
|
|
66
|
+
human/lab review, results enter only through the gate, and the simulated lab is for development / loop-validation,
|
|
67
|
+
never a substitute for real data. Export is hard-blocked for anything the safety gate flags.
|
|
68
|
+
|
|
6
69
|
## [5.10.0] - 2026-06-11 - v5.10 release: The Experiment Designer (active learning / EIG)
|
|
7
70
|
|
|
8
71
|
**Closed-Loop arc, Cycle 4 of 7.** The "Learn" brain of a self-driving lab: turn *"I'm uncertain"* into *"run
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 5.
|
|
3
|
+
Version: 5.12.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,12 +90,12 @@ 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
|
+
[](tests/)
|
|
95
95
|
[](https://github.com/astral-sh/ruff)
|
|
96
96
|
[](docker/)
|
|
97
97
|
[](prereg/)
|
|
98
|
-
[](benchmarks/genome_writing_bench/)
|
|
99
99
|
|
|
100
100
|
**Built on five prior, separately published repositories:**
|
|
101
101
|
|
|
@@ -134,6 +134,40 @@ Two questions gate every genome-writing project, and before PEN-STACK no resourc
|
|
|
134
134
|
Everything is built on bulk-downloadable public data, runs on a single GPU, and is validated **blind** against
|
|
135
135
|
a pre-registered, honest baseline before release.
|
|
136
136
|
|
|
137
|
+
## What is new in v5.12 — The Closed Loop (autonomy Level 3)
|
|
138
|
+
|
|
139
|
+
v5.12 (**Closed-Loop arc, Cycle 6 of 7**) integrates every prior cycle into one continual **design→build→test→learn**
|
|
140
|
+
loop — humans/lab in control, no fabrication, drift-aware — reaching **autonomy Level 3** (the program's honest
|
|
141
|
+
ceiling, not Level 5).
|
|
142
|
+
|
|
143
|
+
| Workstream | What it adds | Result |
|
|
144
|
+
|---|---|---|
|
|
145
|
+
| **LOOP** | `loop/cycle.py` | `run_loop` orchestrates generate(v5.8)→decide(v5.10)→**safety-gated** export(v5.7+v5.11)→sim/real run(v5.11)→ingest(v4.5)→drift→learn; gates await the `approver`; `autonomy_level=3`, `human_in_control=True` |
|
|
146
|
+
| **DRIFT** | `loop/drift.py` | predicted (twin) vs observed → growing miscalibration **widens uncertainty** (inflate, don't over-trust) |
|
|
147
|
+
| **CONTINUAL** | `loop/continual.py` | recalibrate on **admitted** outcomes only; **versioned + reversible** (`rollback_to`); immune proxy → validated needs a CI'd measurement |
|
|
148
|
+
| **DEMO+AUTONOMY** | `loop_converges_faster_than_random` · `docs/autonomy.md` | convergence reported with CI; **Level-3 criteria asserted** (closed · human-gated · anomaly-flagging · no-fabrication); Levels 4/5 not claimed |
|
|
149
|
+
| **BENCH** | bench **v0.3.8** `closed_loop` hard gate | loop integrity vs an ungated autopilot (no gates, no drift, no versioned beliefs) |
|
|
150
|
+
|
|
151
|
+
The loop is **Level 3 — closed, but with a human in control at every gate, NOT autonomous.** See
|
|
152
|
+
[`docs/closed_loop.md`](docs/closed_loop.md), [`docs/autonomy.md`](docs/autonomy.md), and
|
|
153
|
+
`prereg/ws_{loop,continual,drift}.yaml`.
|
|
154
|
+
|
|
155
|
+
## What is new in v5.11 — The Build Interface (digital→physical bridge)
|
|
156
|
+
|
|
157
|
+
v5.11 (**Closed-Loop arc, Cycle 5 of 7**) makes designs executable and results ingestible — loop-ready,
|
|
158
|
+
lab-optional, **safety-gated**, with the immune-risk profile attached as protocol metadata. PEN-STACK emits
|
|
159
|
+
protocols and ingests results; it does **not** run experiments.
|
|
160
|
+
|
|
161
|
+
| Workstream | What it adds | Result |
|
|
162
|
+
|---|---|---|
|
|
163
|
+
| **PROTO** | `build/protocol.py` | `export_protocol` runs `verify()` first; a safety-refused/illegal design raises **`ProtocolExportError`**; a cleared design → a **DRAFT** (Opentrons/PyLabRobot/cloud-lab) carrying the v5.6 immune profile |
|
|
164
|
+
| **INGEST** | `build/ingest.py` | a result → a **quarantined measured Candidate**; the only path into the curated world-model is the v4.5 gate (checks + human approval) — **no auto-edit** |
|
|
165
|
+
| **SIMLAB** | `build/simlab.py` | `run_simulated` samples from the v5.9 twin (+ noise), **labelled SIMULATED**; the loop **export → sim → ingest** runs without hardware |
|
|
166
|
+
| **BENCH** | bench **v0.3.7** `protocol_safety` hard gate | cleared exports w/ immune metadata · hazard+illegal blocked · sim loop completes; an ungated exporter fails by construction |
|
|
167
|
+
|
|
168
|
+
Protocols are **drafts for human/lab review, never auto-executed**; export is hard-blocked for anything the safety
|
|
169
|
+
gate flags. See [`docs/build_interface.md`](docs/build_interface.md) and `prereg/ws_{proto,ingest,simlab}.yaml`.
|
|
170
|
+
|
|
137
171
|
## What is new in v5.10 — The Experiment Designer (active learning / EIG)
|
|
138
172
|
|
|
139
173
|
v5.10 (**Closed-Loop arc, Cycle 4 of 7**) is the **Learn** brain of a self-driving lab: it turns *"I'm
|
|
@@ -643,6 +677,8 @@ pen-stack/
|
|
|
643
677
|
│ ├── design/ v5.8 generative designer: space (candidate_space) / generate (verifier-as-discriminator; hazardous+illegal discarded) / pareto (frontier w/ grounded v5.6 immune axis)
|
|
644
678
|
│ ├── twin/ v5.9 digital twin: mechanistic (cassette expression, closed-form) / outcome (fuse mech+vcell+v5.6 immune; OOD widens interval; phenotype-bounded) / calibrate (honest two-sided)
|
|
645
679
|
│ ├── active/ v5.10 experiment designer: acquire (EIG/immune-VOI over the v5.9 twin) / design (diverse batch) / validate (retrospective active-vs-random, reps+CI, falsifiable)
|
|
680
|
+
│ ├── build/ v5.11 build interface: protocol (safety-gated export, DRAFT + v5.6 immune metadata) / ingest (typed gated -> v4.5 world-model, no auto-edit) / simlab (export->sim->ingest, SIMULATED)
|
|
681
|
+
│ ├── loop/ v5.12 closed loop (autonomy L3): cycle (run_loop, gated DBTL) / drift (predicted-vs-observed, inflate) / continual (admitted-only, versioned+reversible recalibration)
|
|
646
682
|
│ ├── adapt/ local recalibration / private-data adaptation behind a gate (v3.1, WS-F)
|
|
647
683
|
│ ├── env/ v3.4 full Gymnasium environment over router+verifier (genome_writing_env + policies; [env] extra)
|
|
648
684
|
│ ├── monitor/ PEN-MONITOR living database (Europe PMC)
|
|
@@ -656,12 +692,14 @@ pen-stack/
|
|
|
656
692
|
│ │ v5.7 safety_screening (the Guardian hard-gate: benign 0-false-refusal · hazards refused/escalated · evasions never clear) /
|
|
657
693
|
│ │ v5.8 generative_design (verifier-as-discriminator hard-gate: hazardous+illegal discarded; survivors calibrated+immune; grounded-immune Pareto) /
|
|
658
694
|
│ │ v5.9 outcome_prediction (digital-twin hard-gate: two-sided calibration + OOD widening + immune dim + phenotype out-of-scope) /
|
|
659
|
-
│ │ v5.10 experiment_design (active-learning hard-gate: EIG monotone + immune-VOI + diverse batch + retrospective active-vs-random reps+CI)
|
|
695
|
+
│ │ v5.10 experiment_design (active-learning hard-gate: EIG monotone + immune-VOI + diverse batch + retrospective active-vs-random reps+CI) /
|
|
696
|
+
│ │ v5.11 protocol_safety (build-interface hard-gate: cleared exports w/ immune metadata · hazard+illegal blocked · sim loop completes) /
|
|
697
|
+
│ │ v5.12 closed_loop (loop-integrity hard-gate: gated end-to-end run · Level-3 human-in-control · drift detection · versioned/reversible continual learning)
|
|
660
698
|
│ ├── data/ ingestion (genome, chromatin, integration, TRIP, safety annotations)
|
|
661
699
|
│ ├── server/api.py FastAPI REST (atlas, crosslink, writable, plan, bridge, ask)
|
|
662
700
|
│ ├── ui/app.py Streamlit web app (16 pages; v3.2 PEN-Agent shows confidence + epistemic status)
|
|
663
701
|
│ └── cli.py unified CLI
|
|
664
|
-
├── benchmarks/genome_writing_bench/ Genome-Writing Bench v0.3.
|
|
702
|
+
├── benchmarks/genome_writing_bench/ Genome-Writing Bench v0.3.8 (T1-T16 + co_scientist + safety_screening + generative_design + outcome_prediction + experiment_design + protocol_safety + closed_loop; tasks / harness / solvers / LEADERBOARD / SHAs)
|
|
665
703
|
├── bench/run.py one-command bench entrypoint (--agent, --verify)
|
|
666
704
|
├── scripts/ reproducible pipeline drivers (p1_*, p2_*, p4_*, p52/p53 delivery-immunology oracle builds, ws_*_report)
|
|
667
705
|
├── configs/ pinned datasets + thresholds + curation (YAML); v3.2 known_unknowns /
|
|
@@ -673,7 +711,8 @@ pen-stack/
|
|
|
673
711
|
├── prereg/ SHA-locked success criteria (paper1..4 + ws_a..ws_h + v3.2-v5.9 ws_{uq,ep,mc,ba,
|
|
674
712
|
│ r,v,route,env,bench,cal,o,wv,atlas,graph,mon,ct,plan,crit,cite,immune,
|
|
675
713
|
│ genotox,epitope,innate,seroprev,peg,calib,profile,screen,policy,redteam,
|
|
676
|
-
│ gen,pareto,orch,vcell,mech,outcome,twincal,acq,aldesign,alvalidate
|
|
714
|
+
│ gen,pareto,orch,vcell,mech,outcome,twincal,acq,aldesign,alvalidate,
|
|
715
|
+
│ proto,ingest,simlab,loop,continual,drift} + SHA256 locks)
|
|
677
716
|
├── data/curated/ small committed tables (universe, gene coords, measured bridge profile,
|
|
678
717
|
│ v3.2 bridge_offtarget_energetics.json)
|
|
679
718
|
├── data/llm_bench_cache/ 28 cached ungrounded-LLM transcripts (T7, offline/CI replay)
|
|
@@ -15,12 +15,12 @@ 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
|
+
[](tests/)
|
|
20
20
|
[](https://github.com/astral-sh/ruff)
|
|
21
21
|
[](docker/)
|
|
22
22
|
[](prereg/)
|
|
23
|
-
[](benchmarks/genome_writing_bench/)
|
|
24
24
|
|
|
25
25
|
**Built on five prior, separately published repositories:**
|
|
26
26
|
|
|
@@ -59,6 +59,40 @@ Two questions gate every genome-writing project, and before PEN-STACK no resourc
|
|
|
59
59
|
Everything is built on bulk-downloadable public data, runs on a single GPU, and is validated **blind** against
|
|
60
60
|
a pre-registered, honest baseline before release.
|
|
61
61
|
|
|
62
|
+
## What is new in v5.12 — The Closed Loop (autonomy Level 3)
|
|
63
|
+
|
|
64
|
+
v5.12 (**Closed-Loop arc, Cycle 6 of 7**) integrates every prior cycle into one continual **design→build→test→learn**
|
|
65
|
+
loop — humans/lab in control, no fabrication, drift-aware — reaching **autonomy Level 3** (the program's honest
|
|
66
|
+
ceiling, not Level 5).
|
|
67
|
+
|
|
68
|
+
| Workstream | What it adds | Result |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| **LOOP** | `loop/cycle.py` | `run_loop` orchestrates generate(v5.8)→decide(v5.10)→**safety-gated** export(v5.7+v5.11)→sim/real run(v5.11)→ingest(v4.5)→drift→learn; gates await the `approver`; `autonomy_level=3`, `human_in_control=True` |
|
|
71
|
+
| **DRIFT** | `loop/drift.py` | predicted (twin) vs observed → growing miscalibration **widens uncertainty** (inflate, don't over-trust) |
|
|
72
|
+
| **CONTINUAL** | `loop/continual.py` | recalibrate on **admitted** outcomes only; **versioned + reversible** (`rollback_to`); immune proxy → validated needs a CI'd measurement |
|
|
73
|
+
| **DEMO+AUTONOMY** | `loop_converges_faster_than_random` · `docs/autonomy.md` | convergence reported with CI; **Level-3 criteria asserted** (closed · human-gated · anomaly-flagging · no-fabrication); Levels 4/5 not claimed |
|
|
74
|
+
| **BENCH** | bench **v0.3.8** `closed_loop` hard gate | loop integrity vs an ungated autopilot (no gates, no drift, no versioned beliefs) |
|
|
75
|
+
|
|
76
|
+
The loop is **Level 3 — closed, but with a human in control at every gate, NOT autonomous.** See
|
|
77
|
+
[`docs/closed_loop.md`](docs/closed_loop.md), [`docs/autonomy.md`](docs/autonomy.md), and
|
|
78
|
+
`prereg/ws_{loop,continual,drift}.yaml`.
|
|
79
|
+
|
|
80
|
+
## What is new in v5.11 — The Build Interface (digital→physical bridge)
|
|
81
|
+
|
|
82
|
+
v5.11 (**Closed-Loop arc, Cycle 5 of 7**) makes designs executable and results ingestible — loop-ready,
|
|
83
|
+
lab-optional, **safety-gated**, with the immune-risk profile attached as protocol metadata. PEN-STACK emits
|
|
84
|
+
protocols and ingests results; it does **not** run experiments.
|
|
85
|
+
|
|
86
|
+
| Workstream | What it adds | Result |
|
|
87
|
+
|---|---|---|
|
|
88
|
+
| **PROTO** | `build/protocol.py` | `export_protocol` runs `verify()` first; a safety-refused/illegal design raises **`ProtocolExportError`**; a cleared design → a **DRAFT** (Opentrons/PyLabRobot/cloud-lab) carrying the v5.6 immune profile |
|
|
89
|
+
| **INGEST** | `build/ingest.py` | a result → a **quarantined measured Candidate**; the only path into the curated world-model is the v4.5 gate (checks + human approval) — **no auto-edit** |
|
|
90
|
+
| **SIMLAB** | `build/simlab.py` | `run_simulated` samples from the v5.9 twin (+ noise), **labelled SIMULATED**; the loop **export → sim → ingest** runs without hardware |
|
|
91
|
+
| **BENCH** | bench **v0.3.7** `protocol_safety` hard gate | cleared exports w/ immune metadata · hazard+illegal blocked · sim loop completes; an ungated exporter fails by construction |
|
|
92
|
+
|
|
93
|
+
Protocols are **drafts for human/lab review, never auto-executed**; export is hard-blocked for anything the safety
|
|
94
|
+
gate flags. See [`docs/build_interface.md`](docs/build_interface.md) and `prereg/ws_{proto,ingest,simlab}.yaml`.
|
|
95
|
+
|
|
62
96
|
## What is new in v5.10 — The Experiment Designer (active learning / EIG)
|
|
63
97
|
|
|
64
98
|
v5.10 (**Closed-Loop arc, Cycle 4 of 7**) is the **Learn** brain of a self-driving lab: it turns *"I'm
|
|
@@ -568,6 +602,8 @@ pen-stack/
|
|
|
568
602
|
│ ├── design/ v5.8 generative designer: space (candidate_space) / generate (verifier-as-discriminator; hazardous+illegal discarded) / pareto (frontier w/ grounded v5.6 immune axis)
|
|
569
603
|
│ ├── twin/ v5.9 digital twin: mechanistic (cassette expression, closed-form) / outcome (fuse mech+vcell+v5.6 immune; OOD widens interval; phenotype-bounded) / calibrate (honest two-sided)
|
|
570
604
|
│ ├── active/ v5.10 experiment designer: acquire (EIG/immune-VOI over the v5.9 twin) / design (diverse batch) / validate (retrospective active-vs-random, reps+CI, falsifiable)
|
|
605
|
+
│ ├── build/ v5.11 build interface: protocol (safety-gated export, DRAFT + v5.6 immune metadata) / ingest (typed gated -> v4.5 world-model, no auto-edit) / simlab (export->sim->ingest, SIMULATED)
|
|
606
|
+
│ ├── loop/ v5.12 closed loop (autonomy L3): cycle (run_loop, gated DBTL) / drift (predicted-vs-observed, inflate) / continual (admitted-only, versioned+reversible recalibration)
|
|
571
607
|
│ ├── adapt/ local recalibration / private-data adaptation behind a gate (v3.1, WS-F)
|
|
572
608
|
│ ├── env/ v3.4 full Gymnasium environment over router+verifier (genome_writing_env + policies; [env] extra)
|
|
573
609
|
│ ├── monitor/ PEN-MONITOR living database (Europe PMC)
|
|
@@ -581,12 +617,14 @@ pen-stack/
|
|
|
581
617
|
│ │ v5.7 safety_screening (the Guardian hard-gate: benign 0-false-refusal · hazards refused/escalated · evasions never clear) /
|
|
582
618
|
│ │ v5.8 generative_design (verifier-as-discriminator hard-gate: hazardous+illegal discarded; survivors calibrated+immune; grounded-immune Pareto) /
|
|
583
619
|
│ │ v5.9 outcome_prediction (digital-twin hard-gate: two-sided calibration + OOD widening + immune dim + phenotype out-of-scope) /
|
|
584
|
-
│ │ v5.10 experiment_design (active-learning hard-gate: EIG monotone + immune-VOI + diverse batch + retrospective active-vs-random reps+CI)
|
|
620
|
+
│ │ v5.10 experiment_design (active-learning hard-gate: EIG monotone + immune-VOI + diverse batch + retrospective active-vs-random reps+CI) /
|
|
621
|
+
│ │ v5.11 protocol_safety (build-interface hard-gate: cleared exports w/ immune metadata · hazard+illegal blocked · sim loop completes) /
|
|
622
|
+
│ │ v5.12 closed_loop (loop-integrity hard-gate: gated end-to-end run · Level-3 human-in-control · drift detection · versioned/reversible continual learning)
|
|
585
623
|
│ ├── data/ ingestion (genome, chromatin, integration, TRIP, safety annotations)
|
|
586
624
|
│ ├── server/api.py FastAPI REST (atlas, crosslink, writable, plan, bridge, ask)
|
|
587
625
|
│ ├── ui/app.py Streamlit web app (16 pages; v3.2 PEN-Agent shows confidence + epistemic status)
|
|
588
626
|
│ └── cli.py unified CLI
|
|
589
|
-
├── benchmarks/genome_writing_bench/ Genome-Writing Bench v0.3.
|
|
627
|
+
├── benchmarks/genome_writing_bench/ Genome-Writing Bench v0.3.8 (T1-T16 + co_scientist + safety_screening + generative_design + outcome_prediction + experiment_design + protocol_safety + closed_loop; tasks / harness / solvers / LEADERBOARD / SHAs)
|
|
590
628
|
├── bench/run.py one-command bench entrypoint (--agent, --verify)
|
|
591
629
|
├── scripts/ reproducible pipeline drivers (p1_*, p2_*, p4_*, p52/p53 delivery-immunology oracle builds, ws_*_report)
|
|
592
630
|
├── configs/ pinned datasets + thresholds + curation (YAML); v3.2 known_unknowns /
|
|
@@ -598,7 +636,8 @@ pen-stack/
|
|
|
598
636
|
├── prereg/ SHA-locked success criteria (paper1..4 + ws_a..ws_h + v3.2-v5.9 ws_{uq,ep,mc,ba,
|
|
599
637
|
│ r,v,route,env,bench,cal,o,wv,atlas,graph,mon,ct,plan,crit,cite,immune,
|
|
600
638
|
│ genotox,epitope,innate,seroprev,peg,calib,profile,screen,policy,redteam,
|
|
601
|
-
│ gen,pareto,orch,vcell,mech,outcome,twincal,acq,aldesign,alvalidate
|
|
639
|
+
│ gen,pareto,orch,vcell,mech,outcome,twincal,acq,aldesign,alvalidate,
|
|
640
|
+
│ proto,ingest,simlab,loop,continual,drift} + SHA256 locks)
|
|
602
641
|
├── data/curated/ small committed tables (universe, gene coords, measured bridge profile,
|
|
603
642
|
│ v3.2 bridge_offtarget_energetics.json)
|
|
604
643
|
├── data/llm_bench_cache/ 28 cached ungrounded-LLM transcripts (T7, offline/CI replay)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
757da90182c83025a1dc4da7075b4f378a311f03db23be29145a23356e95ea9a benchmarks/genome_writing_bench/tasks.yaml
|
|
2
2
|
5ca511c6763b4e3703e8009031ff8dc385c2a99540e2731d875a9fbbb16f5ecd configs/gsh_validated_heldout.yaml
|
|
3
3
|
758817c1e46c7db10f7f942316663367c5f297cac0cf2f59947a90638a256718 data/writer_panel.csv
|
|
4
4
|
865b18ff23d140c3df6f3b5f25398581ebdfe3534e1cecf6f512afb540ab5ede data/gsh_matched_controls.parquet
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# A task names a `scorer` (module.function in pen_stack.validate / pen_stack.bridge) and a `metric` key to
|
|
9
9
|
# read from its report. Solvers (deterministic planner, naive baseline, LLM agent) are compared on the same
|
|
10
10
|
# tasks; a solver that cannot ground a number must refuse, not invent (no-fabrication is a hard gate).
|
|
11
|
-
version: "0.3.
|
|
11
|
+
version: "0.3.8"
|
|
12
12
|
prepared: "2026-06-11"
|
|
13
13
|
|
|
14
14
|
taxonomy:
|
|
@@ -45,6 +45,10 @@ taxonomy:
|
|
|
45
45
|
OP_outcome_prediction: "predict a write's computable outcome with HONEST calibration (two-sided MAE-vs-naive with bootstrap CI), an interval that WIDENS under OOD, an immune-outcome dimension from v5.6, and phenotype out of scope (vs an overconfident predictor with a fixed narrow interval and no scope awareness)"
|
|
46
46
|
# v0.3.6 (v5.10): the experiment designer - active learning / EIG, falsifiable vs random/greedy.
|
|
47
47
|
ED_experiment_design: "choose the experiment(s) that most reduce model uncertainty: EIG from the calibrated twin (monotone in uncertainty), immune-VOI rewarding proxy-validating experiments, a diverse batch, and a RETROSPECTIVE active-vs-random validation with reps + bootstrap CI (vs a random selector with no acquisition signal and no falsifiable curve)"
|
|
48
|
+
# v0.3.7 (v5.11): the build interface - safety-gated protocol export + gated ingestion + simulated loop.
|
|
49
|
+
PS_protocol_safety: "export a cleared design as a runnable protocol DRAFT carrying its v5.6 immune profile, BLOCK any safety-refused/illegal design (ProtocolExportError), and complete the simulated loop export->sim->ingest with results quarantined (no auto-edit) + labelled SIMULATED (vs an ungated exporter that would emit the hazardous protocol)"
|
|
50
|
+
# v0.3.8 (v5.12): the closed loop - one gated, drift-aware DBTL cycle at autonomy Level 3.
|
|
51
|
+
CL_closed_loop: "run the full generate->predict->decide->safety->build->ingest->learn loop end-to-end (sim-lab) with a human in control at every gate, drift detection that widens uncertainty, and versioned+reversible continual learning - autonomy Level 3, no fabrication (vs an ungated autopilot with no human gates, no drift, no versioned beliefs)"
|
|
48
52
|
|
|
49
53
|
tasks:
|
|
50
54
|
- id: site_selection_blind_gsh
|
|
@@ -298,3 +302,34 @@ tasks:
|
|
|
298
302
|
note: "v5.10 the experiment designer: a trustworthy Learn engine computes acquisition from the calibrated twin,
|
|
299
303
|
rewards proxy-validating experiments, selects a diverse batch, and validates active-vs-random retrospectively
|
|
300
304
|
with CIs; a random selector has no acquisition signal and no falsifiable curve and fails by construction."
|
|
305
|
+
|
|
306
|
+
- id: protocol_safety
|
|
307
|
+
family: PS_protocol_safety
|
|
308
|
+
scorer: "pen_stack.validate.protocol_safety:run"
|
|
309
|
+
metric: "build_safety_honored"
|
|
310
|
+
baseline_metric: "ungated_exporter_safe"
|
|
311
|
+
higher_is_better: true
|
|
312
|
+
hard_gate: true
|
|
313
|
+
gate_rule: "build_safety_honored == True (cleared exports w/ immune metadata AND hazard+illegal blocked AND sim labelled AND export->sim->ingest completes w/ quarantine)"
|
|
314
|
+
ground_truth: "export blocking decided by the v5.7 safety gate + the rules (not the exporter); ingestion gated by
|
|
315
|
+
the v4.5 world-model gate (no auto-edit of curated truth); sim results labelled SIMULATED - non-circular"
|
|
316
|
+
circular: false
|
|
317
|
+
note: "v5.11 the build interface: a cleared design exports a DRAFT carrying its immune profile; a safety-refused
|
|
318
|
+
or illegal design raises ProtocolExportError; the simulated loop completes with quarantined, SIMULATED-labelled
|
|
319
|
+
results. An ungated exporter would emit the hazardous protocol and fails by construction."
|
|
320
|
+
|
|
321
|
+
- id: closed_loop
|
|
322
|
+
family: CL_closed_loop
|
|
323
|
+
scorer: "pen_stack.validate.closed_loop:run"
|
|
324
|
+
metric: "closed_loop_honest"
|
|
325
|
+
baseline_metric: "ungated_autopilot_honest"
|
|
326
|
+
higher_is_better: true
|
|
327
|
+
hard_gate: true
|
|
328
|
+
gate_rule: "closed_loop_honest == True (gated end-to-end run + no-fabrication + Level-3 human-in-control + drift detection + versioned/reversible continual learning)"
|
|
329
|
+
ground_truth: "structural integrity properties of a Level-3 DBTL loop (gated end-to-end run, human-in-control,
|
|
330
|
+
drift detection, versioned + reversible continual learning), NOT a beat-the-world claim - non-circular; the
|
|
331
|
+
active-vs-random convergence is reported with a CI either way (retrospective/simulated)"
|
|
332
|
+
circular: false
|
|
333
|
+
note: "v5.12 the closed loop: one command runs generate->predict->decide->safety->build->ingest->learn with a
|
|
334
|
+
human in control at every gate; drift widens uncertainty; continual learning is versioned + reversible.
|
|
335
|
+
Stops deliberately at autonomy Level 3. An ungated autopilot fails by construction."
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Autonomy levels — PEN-STACK stops at Level 3 (v5.12, WS-AUTONOMY)
|
|
2
|
+
|
|
3
|
+
PEN-STACK's closed loop (v5.12) is a **Level-3** design→build→test→learn engine: closed, but with **humans/lab in
|
|
4
|
+
control at every gate**. This is the program's deliberate, honest ceiling — not Level 5.
|
|
5
|
+
|
|
6
|
+
## The levels (for self-driving labs)
|
|
7
|
+
|
|
8
|
+
| Level | Description | PEN-STACK |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| 0 | Manual — a human does everything | — |
|
|
11
|
+
| 1 | Assisted — tools score/check, human decides each step | v3.3 verifier |
|
|
12
|
+
| 2 | Partial — the system proposes designs + experiments; human runs + decides | v5.8–v5.11 |
|
|
13
|
+
| **3** | **Closed loop with human control at every gate** — the system runs the full cycle, but pauses for human approval at safety, build, and belief-admission, and flags anomalies | **v5.12 (here)** |
|
|
14
|
+
| 4 | Supervised autonomy — runs many cycles with human oversight, escalating exceptions | not claimed |
|
|
15
|
+
| 5 | Full autonomy — no human in the loop | **not claimed; not a goal** |
|
|
16
|
+
|
|
17
|
+
## What "Level 3" means here (asserted criteria)
|
|
18
|
+
|
|
19
|
+
1. **Closed loop.** One command runs generate → predict → decide → safety → build → ingest → learn end-to-end
|
|
20
|
+
(`run_loop`), in silico (sim-lab) or with a real lab at the same interface.
|
|
21
|
+
2. **Human in control at every gate.** The loop pauses for the `approver` at **safety** (export is refused for a
|
|
22
|
+
flagged design), **build** (protocols are DRAFTs requiring human/lab review), and **belief-admission** (results
|
|
23
|
+
enter the curated world-model only via the v4.5 gate with explicit approval).
|
|
24
|
+
3. **Anomaly flagging.** Drift between predictions and observations is detected and **widens uncertainty** rather
|
|
25
|
+
than over-trusting a stale model; continual updates are versioned + reversible.
|
|
26
|
+
4. **No fabrication.** Every number is tool-sourced; no stage invents a value.
|
|
27
|
+
|
|
28
|
+
## What PEN-STACK deliberately does NOT do
|
|
29
|
+
|
|
30
|
+
- It does **not** run experiments autonomously (protocols are drafts; a human/lab runs them).
|
|
31
|
+
- It does **not** auto-edit the curated world-model (admission requires human approval).
|
|
32
|
+
- It does **not** retrain the foundation models (continual learning is recalibration).
|
|
33
|
+
- It does **not** claim Level 4 or 5. The human is in the loop by design.
|
|
34
|
+
|
|
35
|
+
> Level 3 is a trustworthy ceiling: a closed, gated, drift-aware loop that a scientist drives — not an autonomous
|
|
36
|
+
> agent acting in the world. The convergence demonstration is retrospective/simulated, reported with CIs.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# The build interface (v5.11)
|
|
2
|
+
|
|
3
|
+
From v5.11, PEN-STACK reaches the **digital→physical** interface — responsibly. A cleared, legal design becomes a
|
|
4
|
+
runnable protocol DRAFT carrying its v5.6 immune-risk profile (refused outright if the v5.7 safety gate flags it);
|
|
5
|
+
a typed ingestion API returns experimental results as candidate evidence admitted only through the v4.5
|
|
6
|
+
world-model gate; and a simulated lab runs the whole loop before any hardware exists. PEN-STACK **emits protocols
|
|
7
|
+
and ingests results — it does not run experiments.**
|
|
8
|
+
|
|
9
|
+
## Safety-gated protocol export (`pen_stack/build/protocol.py`)
|
|
10
|
+
|
|
11
|
+
```python
|
|
12
|
+
from pen_stack.build import export_protocol, ProtocolExportError
|
|
13
|
+
code = export_protocol(design, {"round": 0}, target="opentrons", actor="lab-alice")
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
`export_protocol` runs `verify(design, actor)` **first**. If the safety gate returns `refuse`, or the design is
|
|
17
|
+
illegal, it raises **`ProtocolExportError`** — there is no export path for a flagged design. A cleared design is
|
|
18
|
+
emitted for one of `opentrons` / `pylabrobot` / `cloudlab`, **stamped "DRAFT — human/lab review required"**, with
|
|
19
|
+
the v5.6 immune profile and full provenance in the metadata. Protocols are drafts; nothing is auto-run.
|
|
20
|
+
|
|
21
|
+
## Typed, gated ingestion (`pen_stack/build/ingest.py`)
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
from pen_stack.build import ingest_result
|
|
25
|
+
cand = ingest_result(result) # quarantined measured Candidate (no auto-merge)
|
|
26
|
+
ingest_result(result, admitted_by="human", graph=g, approved=True) # the ONLY path into the curated graph
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
A result is validated (assay / readout / provenance with a source) and turned into a **quarantined measured edge
|
|
30
|
+
Candidate**. The only way it enters the curated world-model is the v4.5 gate (`gate_admit`) — automated checks
|
|
31
|
+
**and** explicit human approval. No process auto-edits curated truth (Principle 1). Immune-measurement results can
|
|
32
|
+
begin validating the v5.6 proxies on a later pass.
|
|
33
|
+
|
|
34
|
+
## Simulated lab (`pen_stack/build/simlab.py`)
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
from pen_stack.build import run_simulated
|
|
38
|
+
res = run_simulated(protocol_ir, design, cell_state="k562", seed=0)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`run_simulated` executes a protocol in silico: it samples an "observed" readout from the v5.9 twin + measurement
|
|
42
|
+
noise, **labelled `SIMULATED`**. This lets the closed loop (v5.12) run end-to-end **export → sim → ingest** without
|
|
43
|
+
a wet lab. Sim outcomes inherit the twin's limits and **never** enter the curated world-model as measured truth.
|
|
44
|
+
|
|
45
|
+
## Honest scope
|
|
46
|
+
|
|
47
|
+
PEN-STACK emits protocols and ingests results; it does **not** run experiments — protocols are drafts requiring
|
|
48
|
+
human/lab review, results enter only through the gate, and the simulated lab is for development and loop-validation,
|
|
49
|
+
never a substitute for real data. Export is hard-blocked for anything the safety gate flags; the attached immune
|
|
50
|
+
profile is a screen carrying its known-unknowns, not a patient prediction.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# The closed loop (v5.12)
|
|
2
|
+
|
|
3
|
+
From v5.12, PEN-STACK integrates every prior cycle into one continual **design→build→test→learn** loop — humans/lab
|
|
4
|
+
in control at every gate, no fabrication, drift-aware. One command runs it end-to-end.
|
|
5
|
+
|
|
6
|
+
```python
|
|
7
|
+
from pen_stack.loop import run_loop
|
|
8
|
+
result = run_loop(goal, cell_state="k562", candidates=pool, rounds=5, approver="human")
|
|
9
|
+
result["autonomy_level"] # 3
|
|
10
|
+
result["human_in_control"] # True
|
|
11
|
+
result["history"] # per-round: n, blocked, best_readout, drift, versioned update
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## The DBTL orchestrator (`pen_stack/loop/cycle.py`)
|
|
15
|
+
|
|
16
|
+
Each round composes the whole stack:
|
|
17
|
+
|
|
18
|
+
1. **generate** (v5.8) — safe + legal + calibrated + immune-profiled candidates (the verifier-as-discriminator
|
|
19
|
+
discards hazardous/illegal proposals);
|
|
20
|
+
2. **decide** (v5.10) — `select_batch` picks a diverse, informative batch (EIG + immune-VOI);
|
|
21
|
+
3. **safety + build** (v5.7 + v5.11) — `export_protocol` is **safety-gated** (a flagged design is blocked);
|
|
22
|
+
4. **test** (v5.11) — `run_simulated` (sim-lab) or a real lab at the same interface;
|
|
23
|
+
5. **ingest** (v4.5) — results enter as candidate evidence, admitted only through the gate;
|
|
24
|
+
6. **drift** (v5.12) — predicted vs observed;
|
|
25
|
+
7. **learn** (v5.12) — `continual_update` recalibrates, versioned + reversible.
|
|
26
|
+
|
|
27
|
+
The loop **pauses for the approver at safety, build, and belief-admission** — it is not autonomous.
|
|
28
|
+
|
|
29
|
+
## Drift detection (`pen_stack/loop/drift.py`)
|
|
30
|
+
|
|
31
|
+
`detect_drift(designs, results)` compares the twin's predictions against observed readouts. Growing
|
|
32
|
+
miscalibration → `severity: "high"` → `action: "inflate_intervals"` — widen uncertainty rather than over-trust a
|
|
33
|
+
stale model. Covers calibration/residual shift, not every failure mode.
|
|
34
|
+
|
|
35
|
+
## Continual learning (`pen_stack/loop/continual.py`)
|
|
36
|
+
|
|
37
|
+
`continual_update(admitted_results, drift=…, approver=…, prev_version=…)` recalibrates the trust layer, the v5.9
|
|
38
|
+
twin, and the v5.6 immune proxies **on admitted outcomes only**. Every update is **versioned** (evidence digest)
|
|
39
|
+
and **reversible** (`rollback_to` the prior version), attributable to the approver. High drift widens intervals.
|
|
40
|
+
An admitted immune measurement **with a CI** can move a v5.6 axis proxy → outcome-validated. This is
|
|
41
|
+
**recalibration, not foundation-model retraining**.
|
|
42
|
+
|
|
43
|
+
## Convergence demonstration
|
|
44
|
+
|
|
45
|
+
`loop_converges_faster_than_random` reports — retrospectively, with a bootstrap CI — whether the loop's active
|
|
46
|
+
Learn stage reaches a target model quality in fewer rounds than random selection (the v5.10 validation). It is
|
|
47
|
+
reported honestly either way; the demonstration is retrospective/simulated.
|
|
48
|
+
|
|
49
|
+
## Honest scope
|
|
50
|
+
|
|
51
|
+
The loop is **Level 3** — closed, but with humans/lab in control at every gate, **not autonomous**. It runs in
|
|
52
|
+
silico via the sim-lab (a real lab attaches at the same interface); continual learning recalibrates rather than
|
|
53
|
+
retrains; drift detection covers calibration/residual shift, not all failures; immune-proxy graduation requires an
|
|
54
|
+
admitted measurement with a CI. See [Autonomy levels](autonomy.md).
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""PEN-STACK v3.0 - open infrastructure for genome writing."""
|
|
2
|
-
__version__ = "5.
|
|
2
|
+
__version__ = "5.12.0"
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""pen_stack.build — the digital→physical bridge (v5.11).
|
|
2
|
+
|
|
3
|
+
Make designs executable and results ingestible, loop-ready and lab-optional, with safety wired in at the point
|
|
4
|
+
where software reaches for the physical world: a cleared, legal design becomes a runnable protocol DRAFT
|
|
5
|
+
carrying its v5.6 immune-risk profile (refused outright if the v5.7 safety gate flags it); a typed ingestion API
|
|
6
|
+
returns experimental results as candidate evidence admitted only through the v4.5 world-model gate; and a
|
|
7
|
+
simulated lab runs the whole loop before any hardware exists. PEN-STACK emits protocols and ingests results — it
|
|
8
|
+
does NOT run experiments.
|
|
9
|
+
"""
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from pen_stack.build.ingest import ResultSchemaError, ingest_result
|
|
13
|
+
from pen_stack.build.protocol import ProtocolExportError, export_protocol
|
|
14
|
+
from pen_stack.build.simlab import run_simulated
|
|
15
|
+
|
|
16
|
+
__all__ = ["export_protocol", "ProtocolExportError", "ingest_result", "ResultSchemaError", "run_simulated"]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""Typed, gated result-ingestion API — the digital→physical bridge (v5.11, WS-INGEST).
|
|
2
|
+
|
|
3
|
+
An experimental result enters PEN-STACK as CANDIDATE evidence, never auto-merged: it is turned into a measured
|
|
4
|
+
edge Candidate and quarantined. The ONLY path into the curated world-model is the v4.5 gate (`gate_admit`) with
|
|
5
|
+
automated checks AND explicit human approval — inheriting Principle 1 (no process auto-edits the world-model).
|
|
6
|
+
Immune-measurement results can begin validating the v5.6 proxies on a later pass (v5.6 WS-CALIB).
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from pen_stack.graph.ingest import Candidate, gate_admit
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ResultSchemaError(ValueError):
|
|
16
|
+
"""Raised when an ingested result is missing required fields (assay / readout / provenance)."""
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _validate_result_schema(result: dict) -> dict:
|
|
20
|
+
for k in ("assay", "readout", "provenance"):
|
|
21
|
+
if result.get(k) is None:
|
|
22
|
+
raise ResultSchemaError(f"result missing required field {k!r}")
|
|
23
|
+
prov = result["provenance"]
|
|
24
|
+
if not (prov.get("source") or prov.get("doi") or prov.get("europepmc")):
|
|
25
|
+
raise ResultSchemaError("result provenance must carry source / doi / europepmc id")
|
|
26
|
+
return result
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _as_candidate(result: dict) -> Candidate:
|
|
30
|
+
"""A measured outcome -> a quarantined measured EDGE candidate (design --measured_outcome--> outcome)."""
|
|
31
|
+
src = result.get("design_id", "design:anon")
|
|
32
|
+
payload = {"src": src, "dst": f"outcome:{result['assay']}", "etype": "measured_outcome",
|
|
33
|
+
"confidence": result.get("confidence"), "scope": result.get("scope"),
|
|
34
|
+
"readout": result["readout"], "units": result.get("units")}
|
|
35
|
+
return Candidate(kind="edge", payload=payload, provenance=result["provenance"], evidence="measured",
|
|
36
|
+
note="ingested experimental result (quarantined; admit only via the v4.5 gate)")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def ingest_result(result: dict, *, admitted_by: str | None = None, graph: Any = None,
|
|
40
|
+
approved: bool = False) -> Any:
|
|
41
|
+
"""Validate + quarantine an experimental result as a measured Candidate. With `admitted_by` + a `graph` +
|
|
42
|
+
explicit `approved=True`, route it through the v4.5 gate (the ONLY path into the curated world-model);
|
|
43
|
+
otherwise return the quarantined Candidate (never auto-merged)."""
|
|
44
|
+
cand = _as_candidate(_validate_result_schema(result))
|
|
45
|
+
if admitted_by is not None and graph is not None and approved:
|
|
46
|
+
return gate_admit(graph, cand, approved=True, admitted_by=admitted_by)
|
|
47
|
+
return cand # quarantined; no auto-edit of curated truth
|