From f9613ec60b15e7d89830da82ca8d01423159308b Mon Sep 17 00:00:00 2001 From: nialloleary Date: Mon, 12 Oct 2026 09:33:31 +0100 Subject: [PATCH 01/12] research: benchmark expansion candidates (partial: web, amass, non-liquid-handling) Co-Authored-By: Claude Opus 5.5 --- research/expansion/amass_candidates.jsonl | 12 +++ research/expansion/nonlh_candidates.jsonl | 58 ++++++++++++ research/expansion/web_candidates.jsonl | 60 ++++++++++++ research/expansion/web_notes.md | 107 ++++++++++++++++++++++ 4 files changed, 237 insertions(+) create mode 100644 research/expansion/amass_candidates.jsonl create mode 100644 research/expansion/nonlh_candidates.jsonl create mode 100644 research/expansion/web_candidates.jsonl create mode 100644 research/expansion/web_notes.md diff --git a/research/expansion/amass_candidates.jsonl b/research/expansion/amass_candidates.jsonl new file mode 100644 index 0000000..cab33ff --- /dev/null +++ b/research/expansion/amass_candidates.jsonl @@ -0,0 +1,12 @@ +{"id": "massspecpreppy", "title": "MassSpecPreppy-An end-to-end solution for automated protein concentration determination and flexible sample digestion for proteomics applications", "doi": "10.1002/pmic.202300294", "paper_url": "https://doi.org/10.1002/pmic.202300294", "year": 2023, "venue": "Proteomics", "open_access_license": "cc-by (Wiley Proteomics OA, verify)", "code_url": "https://github.com/stemicha/MassSpecPreppy", "code_files": ["OT2_protocols_template/Mass_Spec_Preppy__OT2_part4_post_EvoTip_loading.py", "OT2_protocols_template/Mass_Spec_Preppy__OT2_part2_SP3_in_96well_enzyme_sequential.py", "OT2_protocols_template/Mass_Spec_Preppy__OT2_part1_sample_preparation_in_96well.py", "OT2_protocols_template/Mass_Spec_Preppy__OT2_part1_sample_preparation_in_96well_without_red_alk.py", "OT2_protocols_template/Mass_Spec_Preppy__OT2_BCAassay_take3_HS.py", "OT2_protocols_template/Mass_Spec_Preppy__OT2_BCAassay_take3_slow_retract.py", "OT2_protocols_template/Mass_Spec_Preppy__OT2_part3_EvoTip_loading.py", "OT2_protocols_template/Mass_Spec_Preppy__OT2_part3_vial_elution.py", "OT2_protocols_template/Mass_Spec_Preppy__OT2_BCAassay.py", "OT2_protocols_template/Mass_Spec_Preppy__OT2_part2_SP3_in_96well_enzyme_mix.py"], "code_license": "GPL-3.0", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "proteomics sample prep (BCA, SP3 digestion, Evotip loading)", "results_evidence": "BCA assay average recovery 101.3% (SD 7.82%) vs 96.3% manual; 94.5% of protein groups passed significance for OT-2 digestion vs 95% manual.", "wet_lab_validated": true, "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "10 OT-2 apiLevel .py templates (BCA, SP3 digestion, Evotip loading) generated by Shiny app; GPL-3.0; quantitative validation; overlaps thematically with proteomics-digestion-workflow but distinct paper/code.", "est_tasks": 6, "source_agent": "amass", "amass_ids": ["AMBC_XpNyVYaPbRFaGhr2QlXH8oh5ucp"]} +{"id": "beckham-enzyme-pipeline", "title": "Enabling high-throughput enzyme discovery and engineering with a low-cost, robot-assisted pipeline", "doi": "10.1038/s41598-024-64938-0", "paper_url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC11196671/", "year": 2024, "venue": "Scientific reports", "open_access_license": "cc-by", "code_url": "https://github.com/beckham-lab/opentrons", "code_files": ["Misc/Magbead_wash_elution/MagBead_Wash_Elution_OT2.py", "1-Transformation/Transformation_platetoplate/transformation_platetoplate_OT2.py", "1-Transformation/Transformation_cherrypicking/Generate_transformation_cherrypicking_protocol.py", "1-Transformation/Transformation_cherrypicking/2024-03-18_Transformation_cherrypicking_OT2.py", "4-Transfer/Transfer_row_swap/Transfer_rowswap_4x24_to_1x96_OT2_old.py", "4-Transfer/Transfer_row_swap/Transfer_rowswap_4x24_to_1x96_OT2.py", "4-Transfer/Transfer_row_swap/Transfer_rowswap_4x24_to_1x96_OT2_test_plateCandD.py", "4-Transfer/Transfer_plate-to-plate/Transfer_plate-to-plate_4x24_to_1x96_OT2.py", "2-Inoculation/Inculation_swap_rows_for_multichannel/Inoculation_swap_rows_1x96_to_4x24_OT2.py", "2-Inoculation/Inoculation_platetoplate/Inoculation_1x96_to_4x24_OT2.py", "2-Inoculation/Inoculation_cherrypicking/Generate_inoculation_cherrypicking_protocol.py", "3-Lysis/Lysis_buffer_addition/Lysis_buffer_addition_OT2.py", "3-Lysis/Lysis_4-plate_aspiration/Lysis_4-plate_aspiration_OT2.py", "3-Lysis/Lysis_1-plate_aspiration/Lysis_1-plate_aspiration_OT2.py", "5-Purification/Transfer_off_mag_beads/Transfer_off_MagBeads_OT2.py", "5-Purification/Purification_pipetting_only/Purification_pipetting_only_OT2.py", "5-Purification/Purification_with_shaker/Purification_with_shaker_OT2.py", "7-Normalization/Calculate_Volumes_to_Normalize.py", "7-Normalization/2024-03-29_Normalization_OT2.py", "8-DSF/DSF_setup_OT2.py", "6-Quantification/BCA_assay_OT2.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "transformation, protein expression and Ni-bead purification of 96 enzymes", "results_evidence": "Purified 96 PET hydrolases in parallel with yields up to 400 ug, reproducible purity, thermostability and activity benchmark dataset.", "wet_lab_validated": true, "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "21 OT-2 apiLevel scripts (transformation, cherry-picking, mag-bead wash/elution, transfers) but repo has no LICENSE; otherwise strong.", "est_tasks": 8, "source_agent": "amass", "amass_ids": ["AMBC_BlS5kMf4ztlWBtPPCnmSR0WVgO8"]} +{"id": "tidytron", "title": "TidyTron: Reducing lab waste using validated wash-and-reuse protocols for common plasticware in Opentrons OT-2 lab robots", "doi": "10.1016/j.slast.2023.08.007", "paper_url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC12212179/", "year": 2023, "venue": "SLAS technology", "open_access_license": "cc-by", "code_url": "https://github.com/PlantSynBioLab/TidyTron", "code_files": ["scripts/p10/p10_DNAclean_no_neuts.py", "scripts/p10/p10_Ecoliclean_1-2-1.py", "scripts/p10/p10_DNAclean_no_neuts_multichan.py", "scripts/p10/p10_Ecoliclean_1-1_multichan.py", "scripts/p10/p10_Ecoliclean_3-3-3_multichan.py", "scripts/p10/p10_Ecoliclean_1-1.py", "scripts/p10/p10_Ecoliclean_1-2-1_multichan.py", "scripts/p10/p10_DNAclean_neutralizers.py", "scripts/p10/p10_Ecoliclean_3-3-3.py", "scripts/p10/p10_DNAclean_neutralizers_multichan.py", "scripts/p1000/p1000_Ecoliclean_3-3-3.py", "scripts/p1000/p1000_DNAclean_no_neuts.py", "scripts/p1000/p1000_Ecoliclean_1-1.py", "scripts/p1000/p1000_Ecoliclean_1-2-1.py", "scripts/p1000/p1000_DNAclean_neutralizers.py", "scripts/plate/integrated_tipclean_plateclean_RT.py", "scripts/plate/integrated_tipclean_plateclean_RT_multi.py", "scripts/plate/integrated_tipclean_plateclean_HOT.py", "scripts/plate/integrated_tipclean_plateclean_HOT_multi.py", "scripts/p300/p300_Ecoliclean_1-2-1_multichan.py", "scripts/p300/p300_DNAclean_no_neuts.py", "scripts/p300/p300_DNAclean_neutralizers.py", "scripts/p300/p300_DNAclean_neutralizers_multichan.py", "scripts/p300/p300_Ecoliclean_3-3-3_multichan.py", "scripts/p300/p300_Ecoliclean_3-3-3.py", "scripts/p300/p300_Ecoliclean_1-1.py", "scripts/p300/p300_DNAclean_no_neuts_multichan.py", "scripts/p300/p300_Ecoliclean_1-1_multichan.py", "scripts/p300/p300_Ecoliclean_1-2-1.py", "scripts/optimization_scripts/DNAcleaning optimization.py", "scripts/optimization_scripts/integrated_tipclean_plateclean_RT_multi.py", "scripts/optimization_scripts/plate_clean_optimization.py", "scripts/optimization_scripts/DNAcleaning.py", "scripts/optimization_scripts/fig1C_10ul_tip_cleaning_optimization.py", "scripts/optimization_scripts/fig1D_96rack_variation_10ul_tip_cleaningproject.py", "scripts/optimization_scripts/fig1A_B_p10_tip.py", "scripts/optimization_scripts/integrated_tipclean_plateclean_HOT_multi.py"], "code_license": "Apache-2.0", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "plasticware decontamination / tip and plate washing", "results_evidence": "Validated cleaning of tips and plates contaminated with DNA, E. coli and S. cerevisiae (qPCR/growth-based residual contamination measured across cleaning solutions and contact times).", "wet_lab_validated": true, "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "37 OT-2 apiLevel scripts, Apache-2.0, OA SLAS Technology, quantitative validation; repetitive variants so a few distinct tasks.", "est_tasks": 4, "source_agent": "amass", "amass_ids": ["AMBC_VZZYciJKR3AVWynhK7tRyLwMqZV"]} +{"id": "krisp-sars2-pooling", "title": "Implementation of an efficient SARS-CoV-2 specimen pooling strategy for high throughput diagnostic testing", "doi": "10.1038/s41598-021-96934-z", "paper_url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC8423848/", "year": 2021, "venue": "Scientific reports", "open_access_license": "cc-by", "code_url": "https://github.com/krisp-kwazulu-natal/efficient-SARS-CoV-2-pooled-testing-strategy-code", "code_files": ["scripts/pooling27_300pip.py", "scripts/pooling27_50pip.py", "scripts/pooling81_50pip.py", "scripts/pooling81_300pip.py"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v1", "protocol_category": "SARS-CoV-2 hypercube sample pooling", "results_evidence": "Infected samples reliably detected in pools of 27 and 81 with minimal sensitivity loss for individual Ct up to 32.", "wet_lab_validated": true, "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "4 pooling scripts use the deprecated Opentrons v1 API (from opentrons import robot); would need porting to v2; MIT.", "est_tasks": 2, "source_agent": "amass", "amass_ids": ["AMBC_Kt4JG1AeKTTljzD16AIh1saLcLf"]} +{"id": "openblend-media", "title": "Modular development enables rapid design of media for alternative hosts", "doi": "10.1002/bit.27947", "paper_url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC9298315/", "year": 2021, "venue": "Biotechnology and bioengineering", "open_access_license": "cc-by (PMC OA, verify)", "code_url": "https://github.com/abiedermann/openblend_public", "code_files": ["openblend_plates.py", "plate_builder.py", "run_plate_prep.py", "cal_protocol.py"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "media blending / design of experiments", "results_evidence": "Modular blended media improved Pichia pastoris biomass accumulation and heterologous protein titre in mL-scale batch fermentations.", "wet_lab_validated": true, "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Python package generates OT-2 plate-prep protocols (opentrons imports; one apiLevel calibration file); needs wrapper to produce a standalone simulate-able protocol; MIT.", "est_tasks": 2, "source_agent": "amass", "amass_ids": ["AMBC_Z6bmqGnumWlGkqT380EkIxGMIbS"]} +{"id": "roboctab", "title": "High-Throughput DNA Extraction Using Robotic Automation (RoboCTAB) for Large-Scale Genotyping", "doi": "10.3390/plants14152263", "paper_url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC12348566/", "year": 2025, "venue": "Plants (Basel, Switzerland)", "open_access_license": "cc-by", "code_url": "https://github.com/tomstamour/RoboCTAB", "code_files": ["RoboCTAB_OT2.py", "RoboCTAB_Flex.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "plant DNA extraction (CTAB) for genotyping", "results_evidence": "DNA yield and quality from leaves and roots sufficient for SNP genotyping/sequencing; compared tissue types for yield.", "wet_lab_validated": true, "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Clean OT-2 and Flex versions of the CTAB script (good OT-2 vs Flex pair) but repo has no LICENSE file.", "est_tasks": 4, "source_agent": "amass", "amass_ids": ["AMBC_S2FodXDUCy94XapVqSKJA7lsf1H"]} +{"id": "pasta-spatial", "title": "PASTA: versatile tyramide-oligonucleotide amplification for multimodal spatial biology", "doi": "10.1038/s41592-026-03200-z", "paper_url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC13539481/", "year": 2026, "venue": "Nature methods", "open_access_license": "cc-by (PMC OA, verify)", "code_url": "https://github.com/SizunJiangLab/PASTA", "code_files": ["automation/PASTA_oligoHRP_automation.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "spatial proteomics staining (tyramide-oligo amplification cycles on slides)", "results_evidence": "High-plex protein and RNA codetection on FFPE tissue via cyclical tyramide-oligonucleotide amplification and imaging (Nature Methods figures).", "wet_lab_validated": true, "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Single OT-2 apiLevel 2.7 script for oligo-HRP staining cycles; no LICENSE; custom slide labware likely needed.", "est_tasks": 2, "source_agent": "amass", "amass_ids": ["AMBC_8AMU8xpBC4bYAOyoUy4ljNomnML"]} +{"id": "pipette-opt-dna-assembly", "title": "A linear programming-based strategy to save pipette tips in automated DNA assembly", "doi": "10.1093/synbio/ysac004", "paper_url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC9074407/", "year": 2022, "venue": "Synthetic biology (Oxford, England)", "open_access_license": "cc-by", "code_url": "https://github.com/KSechkar/pipette_opt", "code_files": ["src/ppopt/estimate_runtimes/estimate_runtimes.py"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "DNA assembly reaction setup with tip-saving optimisation", "results_evidence": "Algorithm reduced pipette tip consumption in randomly generated and real-life modular DNA assembly scenarios (computational; runtime estimated via opentrons simulate).", "wet_lab_validated": false, "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Mainly an optimiser; robot code is a runtime-estimation wrapper plus related DAMPLAB/OT2-MoClo-Transformation-Ecoli templates in v1 API (BSD); no wet-lab validation of the optimised runs.", "est_tasks": 1, "source_agent": "amass", "amass_ids": ["AMBC_FWl11HjtE3lKjjh4oLSkI1YqJw"]} +{"id": "reacsight", "title": "Enhancing bioreactor arrays for automated measurements and reactive control with ReacSight", "doi": "10.1038/s41467-022-31033-9", "paper_url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC9188569/", "year": 2022, "venue": "Nature communications", "open_access_license": "cc-by", "code_url": "https://github.com/konst-ac/reacsight-project", "code_files": ["OT2/flaskr_withLib.py"], "code_license": "none", "robot_platform": "ot2", "api": "other", "protocol_category": "bioreactor sampling / cytometry loading, reactive control", "results_evidence": "Real-time optogenetic control of yeast gene expression, competition assays under nutrient scarcity, and dynamic control of two-strain consortium composition.", "wet_lab_validated": true, "duplicate_of_existing": null, "readiness": "no", "readiness_reason": "OT-2 driven via Flask server using opentrons.execute and smoothie driver internals (not a protocol file); hardware-integrated (bioreactors, cytometer); repo here is a later project fork, original code on Zenodo 10.5281/zenodo.4776009; no license.", "est_tasks": 1, "source_agent": "amass", "amass_ids": ["AMBC_NFUrVUFmrASp5tcgz1qZ1YNekjL"]} +{"id": "peg-solubility-assay", "title": "An open-source automated PEG precipitation assay to measure the relative solubility of proteins with low material requirement", "doi": "10.1038/s41598-021-01126-4", "paper_url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC8578320/", "year": 2021, "venue": "Scientific reports", "open_access_license": "cc-by", "code_url": "https://gitlab.developers.cam.ac.uk/ch/sormanni/peg-solubility-assay", "code_files": ["PEG_Assay_Step1.py", "PEG_Assay_Step2.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "protein solubility assay (PEG titration, plate prep and transfer)", "results_evidence": "Relative solubility of proteins/antibodies quantified from PEG-precipitation midpoints using ~200 ug material; accuracy compared against established methods.", "wet_lab_validated": true, "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Two OT-2 API v2 scripts (step1 PEG gradient setup, step2 transfer after centrifugation) with clear paper protocol; no LICENSE; may need aluminium-block labware definitions.", "est_tasks": 4, "source_agent": "amass", "amass_ids": ["AMBC_J9kXwo9tekw77p29y6R0RRYa3n"]} +{"id": "y1h-yeast-lap", "title": "Workflow to Select Functional Promoter DNA Baits and Screen Arrayed Gene Libraries in Yeast", "doi": "10.1002/cpz1.70059", "paper_url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC11580771/", "year": 2024, "venue": "Current protocols", "open_access_license": "cc-by (Current Protocols OA, verify)", "code_url": "https://github.com/BiocomputationLab/LAPrepository", "code_files": ["LAPEntries/LAP-PCR-OT2-2.0.0/ScriptPCR_v200.py", "LAPEntries/LAP-PCR-OT2-1.0.0/ScriptPCR.py", "LAPEntries/LAP-ColonyCounterSelection-OT2-2.0.0/CounterSelectionScript_v200.py", "LAPEntries/LAP-ColonyCounterSelection-OT2-1.0.0/CounterSelectionScript.py", "LAPEntries/LAP-ColonyCounterSelection-OT2-1.0.0/ScriptPlateGenerationAndIncubation_v200.py", "LAPEntries/LAP-CellMediaInoculation-OT2-1.0.0/ScriptPlateGenerationAndIncubation.py", "LAPEntries/LAP-MoCloAssembly-OT2-2.0.0/ScriptMoCloConstructAssembly_v200.py", "LAPEntries/LAP-MoCloAssembly-OT2-1.0.1/ScriptMoCloConstructAssembly_v101.py", "LAPEntries/LAP-CellMediaInoculation-OT2-2.0.0/ScriptPlateGenerationAndIncubation_v200.py", "LAPEntries/LAP-MoCloAssembly-OT2-1.0.0/ScriptMoCloConstructAssembly.py", "LAPEntries/LAP-CustomReagentMixingMultiSinglePip-OT2-1.0.0/ScriptMixingReagents_v100.py", "LAPEntries/LAP-ColonyCounterSelection-OT2-1.1.0/CounterSelectionScript_v110.py", "LAPEntries/LAP-NplateMerging-OT2-2.0.0/ScriptMergePlates_v200.py", "LAPEntries/LAP-NplateMerging-OT2-1.0.0/ScriptMergePlates.py", "SetFunctions/define_tiprack.py", "SetFunctions/check_tip_and_pick.py", "SetFunctions/setting_labware.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "yeast transformation / arrayed library inoculation (Y1H screening)", "results_evidence": "Robotized yeast one-hybrid workflow for screening arrayed Arabidopsis TF libraries against promoter fragment baits (interaction readouts reported).", "wet_lab_validated": true, "duplicate_of_existing": "lap-transposon-genotyping (same LAPrepository code repo; different paper)", "readiness": "partial", "readiness_reason": "Uses LAP-CellMediaInoculation-OT2 scripts (apiLevel) driven by Excel variables files; repo has no license file; repo already in corpus via lap-transposon-genotyping.", "est_tasks": 2, "source_agent": "amass", "amass_ids": ["AMBC_3uwG18vtShB9zqOfI0Cku0a0czs"]} +{"id": "ht-hcr-sea-urchin", "title": "Automated, high-throughput in situ hybridization of sea urchin (Lytechinus pictus) embryos", "doi": "10.1242/dev.204814", "paper_url": "https://pmc.ncbi.nlm.nih.gov/articles/PMC12516323/", "year": 2025, "venue": "Development (Cambridge, England)", "open_access_license": "cc-by (PMC OA, verify)", "code_url": "https://github.com/ylee-sio/HL_HTHCR", "code_files": ["HL_HTHCRv16.json"], "code_license": "none", "robot_platform": "flex", "api": "other", "protocol_category": "whole-mount in situ HCR on embryos in 96-well plates", "results_evidence": "Processed 192 probe sets in 32 h; produced localisation data for 101 genes across three developmental stages.", "wet_lab_validated": true, "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Protocol is an Opentrons Flex Protocol Designer JSON (schema v8), not Python; could be exported/converted; no license.", "est_tasks": 2, "source_agent": "amass", "amass_ids": ["AMBC_Wz78wSUCdhU6RWyec7626bqjRZZ"]} diff --git a/research/expansion/nonlh_candidates.jsonl b/research/expansion/nonlh_candidates.jsonl new file mode 100644 index 0000000..9055183 --- /dev/null +++ b/research/expansion/nonlh_candidates.jsonl @@ -0,0 +1,58 @@ +{"id": "wei-science-factory", "title": "Towards a modular architecture for science factories (WEI; color-picker + PCR workcells)", "doi": "10.1039/D3DD00142C", "paper_url": "https://pubs.rsc.org/en/content/articlehtml/2023/dd/d3dd00142c", "year": 2023, "venue": "Digital Discovery", "open_access_license": "CC BY 3.0", "code_url": "https://github.com/AD-SDL/rpl_wei", "code_files": ["src/wei/core/workflow.py", "src/wei/core/experiment.py", "src/wei/core/interfaces/simulate_interface.py", "src/wei/core/interfaces/ros2_interface.py"], "code_license": "MIT", "language": "Python", "hardware": ["Brooks PF400", "Hudson PlateCrane/Sciclops", "Opentrons OT-2", "A4S sealer", "Brooks peeler", "Bio-Rad thermocycler", "Camera"], "domain": "biology", "task_type": "scheduling", "results_evidence": "Executed closed-loop color-matching and PCR workflows on the ANL RPL workcell with reported timing/throughput and color-error convergence.", "wet_lab_validated": true, "simulatable": "true: built-in simulate_interface lets YAML workflows run with no hardware", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "Open paper, MIT code, YAML workflow + module specs run in simulate mode; tasks can be 'methods -> WEI workflow YAML' graded against module/action sequence.", "est_tasks": 6, "source_agent": "nonlh"} +{"id": "madsci-ad-sdl", "title": "MADSci: A modular Python-based framework to enable autonomous science", "doi": "10.21105/joss.09416", "paper_url": "https://doi.org/10.21105/joss.09416", "year": 2026, "venue": "Journal of Open Source Software", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/AD-SDL/MADSci", "code_files": ["examples/example_experiment.py", "examples/example_lab/compose.yaml", "examples/example_lab/example_modules/liquidhandler.py"], "code_license": "MIT", "language": "Python", "hardware": ["Brooks PF400", "OT-2/Flex", "plate readers", "sealers", "thermocyclers"], "domain": "other", "task_type": "scheduling", "results_evidence": "Framework; experiments reported via ANL RPL deployments but no single peer-reviewed results paper verified.", "wet_lab_validated": false, "simulatable": "true: example_lab ships virtual example modules via docker compose", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "JOSS software paper (no wet-lab results paper of its own); simulatable example lab makes it a good execution substrate for WEI/RPL-derived tasks.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "ad-sdl-pf400-module", "title": "AD-SDL PF400 / PlateCrane / Sciclops module drivers (WEI workcell modules)", "doi": "10.1039/D3DD00142C", "paper_url": "https://pubs.rsc.org/en/content/articlehtml/2023/dd/d3dd00142c", "year": 2023, "venue": "Digital Discovery", "open_access_license": "CC BY 3.0", "code_url": "https://github.com/AD-SDL/pf400_module", "code_files": ["src/pf400_interface/pf400.py", "src/pf400_rest_node.py", "(hudson_platecrane_module) src/platecrane_driver/platecrane_driver.py", "(sciclops_module) src/sciclops_interface.py"], "code_license": "MIT", "language": "Python", "hardware": ["Brooks PF400", "Hudson PlateCrane EX", "Hudson Sciclops"], "domain": "biology", "task_type": "plate_transport", "results_evidence": "Same experiments as WEI paper (plate moves between OT-2, sealer, thermocycler, camera).", "wet_lab_validated": true, "simulatable": "partial: TCP drivers need hardware; must be stubbed (WEI simulate mode bypasses them)", "duplicate_of_existing": "glas-preciseflex (related PF400 driver; different repo)", "readiness": "partial", "readiness_reason": "Overlaps glas-preciseflex style PF400 control; low-level TCP command strings need a mock server for grading.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "polybot-pedot", "title": "Autonomous platform for solution processing of electronic polymers (Polybot)", "doi": "10.1038/s41467-024-55655-3", "paper_url": "https://www.nature.com/articles/s41467-024-55655-3", "year": 2025, "venue": "Nature Communications", "open_access_license": "CC BY", "code_url": "https://github.com/polybot-nexus/PEDOT_PSS_supporting_data", "code_files": ["*.ipynb (analysis only)"], "code_license": "MIT", "language": "Python", "hardware": ["Chemspeed", "UR5e", "N9 robot", "film coater", "annealing", "probe station", "camera"], "domain": "materials", "task_type": "synthesis", "results_evidence": "Autonomously optimised PEDOT:PSS film conductivity/defects over closed-loop campaigns; conductivities reported.", "wet_lab_validated": true, "simulatable": "false: only analysis notebooks released; orchestration code not public", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Results + data public but robot orchestration (Polybot/WEI) not released for this paper.", "est_tasks": 1, "source_agent": "nonlh"} +{"id": "chemos-2020", "title": "ChemOS: An orchestration software to democratize autonomous discovery", "doi": "10.1371/journal.pone.0229862", "paper_url": "https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0229862", "year": 2020, "venue": "PLoS ONE", "open_access_license": "CC BY", "code_url": "https://github.com/aspuru-guzik-group/ChemOS", "code_files": ["Experiments/_dummy_dump/", "DatabaseManager/interfaces.py", "Communicator/"], "code_license": "Apache-2.0", "language": "Python", "hardware": ["robotic bartender (barmixvah)", "HPLC (in demos)"], "domain": "chemistry", "task_type": "scheduling", "results_evidence": "Demonstrates closed-loop optimisation on a cocktail-mixing robot and HPLC calibration, with reported optimisation traces.", "wet_lab_validated": true, "simulatable": "partial: dummy experiment folders; py2-era code, needs revival", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Old code (pyc, Python2-era); grading via dummy instrument possible but setup heavy.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "chemos2-atlas", "title": "Atlas: a brain for self-driving laboratories (BO library used in ChemOS 2.0 campaigns)", "doi": "10.1039/D4DD00115J", "paper_url": "https://pubs.rsc.org/en/content/articlehtml/2025/dd/d4dd00115j", "year": 2025, "venue": "Digital Discovery", "open_access_license": "CC BY", "code_url": "https://github.com/aspuru-guzik-group/atlas", "code_files": ["src/atlas/planners/", "examples/"], "code_license": "MIT", "language": "Python", "hardware": [], "domain": "chemistry", "task_type": "other", "results_evidence": "BO planners benchmarked on emulators and deployed on SDL campaigns (e.g., electrochemistry with ChemOS 2.0).", "wet_lab_validated": true, "simulatable": "true: pure software, Olympus emulators", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Planner library only; hardware-free but task would be optimisation config, not lab-automation code.", "est_tasks": 1, "source_agent": "nonlh"} +{"id": "baybe", "title": "BayBE: Bayesian Back End for design of experiments", "doi": "10.1039/D5DD00050E", "paper_url": "https://pubs.rsc.org/en/content/articlehtml/2025/dd/d5dd00050e", "year": 2025, "venue": "Digital Discovery", "open_access_license": "CC BY", "code_url": "https://github.com/emdgroup/baybe", "code_files": ["baybe/campaign.py", "examples/"], "code_license": "Apache-2.0", "language": "Python", "hardware": [], "domain": "chemistry", "task_type": "other", "results_evidence": "Campaign API with benchmarks; industrial case studies reported, few with released wet-lab data.", "wet_lab_validated": false, "simulatable": "true: pure software", "duplicate_of_existing": null, "readiness": "no", "readiness_reason": "Not hardware-automation code; only adjunct planner.", "est_tasks": 0, "source_agent": "nonlh"} +{"id": "coscientist", "title": "Autonomous chemical research with large language models (Coscientist)", "doi": "10.1038/s41586-023-06792-0", "paper_url": "https://www.nature.com/articles/s41586-023-06792-0", "year": 2023, "venue": "Nature", "open_access_license": "CC BY", "code_url": "https://github.com/gomesgroup/coscientist", "code_files": ["simple_implementation/coscientist.py", "simple_implementation/tools.py", "simple_implementation/run.py"], "code_license": "(LICENSE present, unrecognised text)", "language": "Python", "hardware": ["Opentrons OT-2", "Emerald Cloud Lab", "UV-Vis plate reader (via OT-2/heater-shaker)", "Heater-shaker"], "domain": "chemistry", "task_type": "protocol_language", "results_evidence": "Suzuki/Sonogashira couplings executed and confirmed by GC-MS; plate-reader colour tasks executed.", "wet_lab_validated": true, "simulatable": "partial: OT-2 simulate for LH parts; ECL SLL steps not simulatable", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Heavily overlaps LH (OT-2); non-LH element is ECL cloud-lab and plate-reader calls; released code is a reduced implementation.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "chemcrow", "title": "Augmenting large language models with chemistry tools (ChemCrow)", "doi": "10.1038/s42256-024-00832-8", "paper_url": "https://www.nature.com/articles/s42256-024-00832-8", "year": 2024, "venue": "Nature Machine Intelligence", "open_access_license": "CC BY", "code_url": "https://github.com/ur-whitelab/chemcrow-public", "code_files": ["chemcrow/agents/", "chemcrow/tools/rxn4chem.py", "(chemcrow-runs) notebooks"], "code_license": "MIT", "language": "Python", "hardware": ["IBM RoboRXN cloud synthesis platform"], "domain": "chemistry", "task_type": "synthesis", "results_evidence": "Executed syntheses of DEET and three thioureas plus a chromophore on RoboRXN, with characterisation.", "wet_lab_validated": true, "simulatable": "false: RoboRXN cloud API required (no simulator)", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Execution is via proprietary cloud API; could grade generated RXN action sequences offline.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "clairify-xdl", "title": "Large language models for chemistry robotics (CLAIRify: NL -> XDL)", "doi": "10.1007/s10514-023-10136-2", "paper_url": "https://link.springer.com/article/10.1007/s10514-023-10136-2", "year": 2023, "venue": "Autonomous Robots", "open_access_license": "CC BY", "code_url": "https://github.com/ac-rad/xdl-generation", "code_files": ["xdlgenerator/nlp2xdl.py", "web-interface/verify.py", "dataset/ (chem-eval .txt protocols)"], "code_license": "MIT", "language": "Python", "hardware": ["Franka Panda", "Chemputer (via XDL)"], "domain": "chemistry", "task_type": "protocol_language", "results_evidence": "Generated XDL executed on a Franka robot for solubility/recrystallisation; expert-evaluated XDL validity on 108 protocols.", "wet_lab_validated": true, "simulatable": "true: XDL verifier (syntax/static checks) runs offline; robot execution via simulation", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "Directly a 'methods text -> XDL' task with a bundled verifier and ~100 protocol texts; MIT.", "est_tasks": 10, "source_agent": "nonlh"} +{"id": "organa", "title": "ORGANA: a robotic assistant for automated chemistry experimentation and characterization", "doi": "10.1016/j.matt.2024.10.015", "paper_url": "https://arxiv.org/abs/2401.06949", "year": 2025, "venue": "Matter (arXiv 2401.06949)", "open_access_license": "arXiv non-exclusive / journal TBD", "code_url": "https://github.com/ac-rad/organa", "code_files": ["clairify/xdlgenerator/nlp2xdl.py", "moveit_pddlstream/xdl_parse.py", "output/plan_*.xdl"], "code_license": "none", "language": "Python", "hardware": ["Franka Panda", "pH meter", "electrochemistry potentiostat", "camera", "Isaac Sim digital twin"], "domain": "chemistry", "task_type": "synthesis", "results_evidence": "Solubility, pH, recrystallisation and electrochemistry (quinone) experiments executed with reported user-study times and measured values.", "wet_lab_validated": true, "simulatable": "partial: XDL plans + PDDLStream/MoveIt planning simulatable", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "No licence on repo; XDL plans gradeable, robot layer needs ROS/MoveIt.", "est_tasks": 4, "source_agent": "nonlh"} +{"id": "chemputer-acra", "title": "Verification and execution of the scientific literature via chemputation augmented by large language models", "doi": "10.1038/s42004-026-01993-w", "paper_url": "https://www.nature.com/articles/s42004-026-01993-w", "year": 2026, "venue": "Communications Chemistry", "open_access_license": "CC BY", "code_url": "https://github.com/croningp/acra", "code_files": ["acra/agents/agents/xdl_generator.py", "acra/agents/prompts/xdl_prompt.py", "acra/data/xdls/CHEMIFY-*.xdl"], "code_license": "(LICENSE present, unrecognised text)", "language": "Python / XDL", "hardware": ["Chemputer"], "domain": "chemistry", "task_type": "protocol_language", "results_evidence": "LLM-generated XDL from literature procedures executed on the Chemputer with yields reported; >100 reference XDLs released.", "wet_lab_validated": true, "simulatable": "true: chemputer XDL compiles/simulates against a graph (xdl dry-run)", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "Ready-made literature->XDL pairs with executed results; check licence text before vendoring.", "est_tasks": 15, "source_agent": "nonlh"} +{"id": "chemputer-blueprints", "title": "Reaction blueprints and logical control flow for parallelized chiral synthesis in the Chemputer", "doi": "10.1038/s41467-024-54238-6", "paper_url": "https://www.nature.com/articles/s41467-024-54238-6", "year": 2024, "venue": "Nature Communications", "open_access_license": "CC BY", "code_url": "https://gitlab.com/croningroup/chemputer/xdl", "code_files": ["xdl v2.0.0 (blueprints)", "SI XDL files"], "code_license": "see GitLab (unverified)", "language": "Python / XDL", "hardware": ["Chemputer"], "domain": "chemistry", "task_type": "protocol_language", "results_evidence": "Parallel chiral syntheses executed with reported yields/ee using XDL blueprints.", "wet_lab_validated": true, "simulatable": "true: XDL 2.0 compile + simulate mode", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "XDL procedures in SI map to methods text; xdl package supports simulation without hardware.", "est_tasks": 4, "source_agent": "nonlh"} +{"id": "chemputer-peptide", "title": "Universal peptide synthesis via solid-phase methods fused with chemputation", "doi": "10.1038/s41467-025-62344-2", "paper_url": "https://www.nature.com/articles/s41467-025-62344-2", "year": 2025, "venue": "Nature Communications", "open_access_license": "CC BY", "code_url": "https://doi.org/10.5281/zenodo.15948769", "code_files": ["Zenodo XDL archive"], "code_license": "Zenodo (check)", "language": "XDL", "hardware": ["Chemputer", "SPPS module"], "domain": "chemistry", "task_type": "synthesis", "results_evidence": "Synthesised multiple peptides (incl. semaglutide-type) with purity/yield reported.", "wet_lab_validated": true, "simulatable": "true: XDL simulation", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "XDL in Zenodo + methods text; good protocol_language tasks.", "est_tasks": 3, "source_agent": "nonlh"} +{"id": "chemputer-modules-acscs", "title": "Robotic Modules for the Programmable Chemputation of Molecules and Materials", "doi": "10.1021/acscentsci.3c00304", "paper_url": "https://pubs.acs.org/doi/10.1021/acscentsci.3c00304", "year": 2023, "venue": "ACS Central Science", "open_access_license": "CC BY", "code_url": "https://gitlab.com/croningroup/chemputer", "code_files": ["SI XDL/graph files"], "code_license": "unverified", "language": "XDL", "hardware": ["Chemputer modules"], "domain": "chemistry", "task_type": "synthesis", "results_evidence": "Several syntheses executed on new modules with yields reported.", "wet_lab_validated": true, "simulatable": "true: XDL simulation", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Code link not in full text; relies on SI.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "mobile-robots-dai-2024", "title": "Autonomous mobile robots for exploratory synthetic chemistry", "doi": "10.1038/s41586-024-08173-7", "paper_url": "https://www.nature.com/articles/s41586-024-08173-7", "year": 2024, "venue": "Nature", "open_access_license": "CC BY", "code_url": "https://doi.org/10.5281/zenodo.11174257", "code_files": ["Zenodo: workflow + decision-maker code, Chemspeed scripts, robot ROS code (several records)"], "code_license": "Zenodo (check per record)", "language": "Python", "hardware": ["KUKA KMR iiwa mobile robots", "Chemspeed ISynth", "UPLC-MS", "benchtop NMR"], "domain": "chemistry", "task_type": "plate_transport", "results_evidence": "Supramolecular/structural diversification chemistry run autonomously with UPLC-MS/NMR-based decisions; hits reported.", "wet_lab_validated": true, "simulatable": "partial: decision-maker runs on released data; robot/ROS code needs hardware or Gazebo stub", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Strong triple; Zenodo code bundle sizeable; grading via decision logic or workflow script structure.", "est_tasks": 3, "source_agent": "nonlh"} +{"id": "evolver-2018", "title": "Precise, automated control of conditions for high-throughput growth of yeast and bacteria with eVOLVER", "doi": "10.1038/nbt.4151", "paper_url": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6035058/", "year": 2018, "venue": "Nature Biotechnology", "open_access_license": "author manuscript (PMC); journal paywalled", "code_url": "https://github.com/FYNCH-BIO/dpu", "code_files": ["experiment/template/eVOLVER.py", "experiment/template/custom_script.py", "(FYNCH-BIO/evolver) evolver/evolver.py server"], "code_license": "MIT", "language": "Python", "hardware": ["eVOLVER continuous-culture array (16 vials)", "OD/temp sensors", "peristaltic pumps"], "domain": "biology", "task_type": "bioreactor", "results_evidence": "Turbidostat/chemostat growth curves and selection experiments across 16 vials reported with fitness measurements.", "wet_lab_validated": true, "simulatable": "partial: custom_script.py control loop is pure Python over OD arrays; can be driven by a fake socket server/replayed OD logs", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "MIT; turbidostat/chemostat control functions are small and gradeable by replaying OD traces to check pump commands; paper PDF is PMC author manuscript.", "est_tasks": 5, "source_agent": "nonlh"} +{"id": "evolver-ddr-elife", "title": "Environmental fluctuations reshape an unexpected diversity-disturbance relationship in a microbial community (eVOLVER)", "doi": "10.7554/eLife.67175", "paper_url": "https://elifesciences.org/articles/67175", "year": 2021, "venue": "eLife", "open_access_license": "CC BY", "code_url": "https://github.com/khalillab/DDR-eVOLVER-model", "code_files": ["*.ipynb (model)", "DPU custom_script variants in SI (unverified)"], "code_license": "MIT", "language": "Python", "hardware": ["eVOLVER"], "domain": "biology", "task_type": "bioreactor", "results_evidence": "Fluctuating dilution regimes run on eVOLVER with community composition measured by sequencing.", "wet_lab_validated": true, "simulatable": "partial: eVOLVER custom_script logic replayable", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Released repo is the model, not the eVOLVER control script; would need reconstructing the dilution program from methods.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "chibio-2020", "title": "In situ characterisation and manipulation of biological systems with Chi.Bio", "doi": "10.1371/journal.pbio.3000794", "paper_url": "https://journals.plos.org/plosbiology/article?id=10.1371/journal.pbio.3000794", "year": 2020, "venue": "PLoS Biology", "open_access_license": "CC BY", "code_url": "https://github.com/HarrisonSteel/ChiBio", "code_files": ["app.py (single-file Flask controller incl. turbidostat, optogenetics, custom programs)"], "code_license": "none (no LICENSE file)", "language": "Python", "hardware": ["Chi.Bio reactors (BeagleBone)", "LEDs", "spectrometer", "pumps"], "domain": "biology", "task_type": "bioreactor", "results_evidence": "Turbidostat growth, optogenetic feedback control and fluorescence measurements demonstrated with reported traces.", "wet_lab_validated": true, "simulatable": "partial: hardware I2C calls must be stubbed; control functions (Turbidostat, CustomProgram) are pure logic", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "No licence on code; single large app.py; otherwise excellent methods->control-program tasks.", "est_tasks": 3, "source_agent": "nonlh"} +{"id": "chibio-cocultures-evotron", "title": "Dynamic cybergenetic control of bacterial co-culture composition via optogenetic feedback", "doi": "10.1038/s41467-022-32392-z", "paper_url": "https://www.nature.com/articles/s41467-022-32392-z", "year": 2022, "venue": "Nature Communications", "open_access_license": "CC BY", "code_url": "https://github.com/santkumar/evotron", "code_files": ["arduino/mega/main/main.ino", "evolver/software/ (modified eVOLVER)", "controller Python in Zenodo 10.5281/zenodo.6908131"], "code_license": "none", "language": "C++/Python", "hardware": ["custom eVOLVER/Chi.Bio-like bioreactors", "optogenetic LEDs", "OD/fluorescence sensors"], "domain": "biology", "task_type": "bioreactor", "results_evidence": "Closed-loop optogenetic control held E. coli co-culture ratios at setpoints over days; measured composition reported.", "wet_lab_validated": true, "simulatable": "partial: controller logic simulatable with a growth model; firmware needs hardware", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "No licence; mixed Arduino/Python; controller logic good grading target.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "reacsight", "title": "Enhancing bioreactor arrays for automated measurements and reactive control with ReacSight", "doi": "10.1038/s41467-022-31033-9", "paper_url": "https://www.nature.com/articles/s41467-022-31033-9", "year": 2022, "venue": "Nature Communications", "open_access_license": "CC BY", "code_url": "https://doi.org/10.5281/zenodo.4776009", "code_files": ["Zenodo: ReacSight orchestration (Flask instrument servers, OT-2 sampling, cytometer driving)"], "code_license": "check Zenodo", "language": "Python", "hardware": ["Chi.Bio/eVOLVER bioreactors", "Opentrons OT-2 (sampling robot)", "Guava flow cytometer"], "domain": "biology", "task_type": "bioreactor", "results_evidence": "Automated cytometry-based optogenetic control of yeast populations and co-cultures with reported dynamics.", "wet_lab_validated": true, "simulatable": "partial: instrument servers are HTTP; mockable", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Combines bioreactor + cytometer scheduling; partial LH overlap (OT-2 sampler).", "est_tasks": 3, "source_agent": "nonlh"} +{"id": "pioreactor", "title": "Pioreactor open-source bioreactor software (used in published studies)", "doi": null, "paper_url": "https://docs.pioreactor.com", "year": 2025, "venue": "software (no primary paper; cited in e.g. Microb Cell Fact 2025, Nature 2026)", "open_access_license": null, "code_url": "https://github.com/pioreactor/pioreactor", "code_files": ["core/pioreactor/automations/dosing/turbidostat.py", "core/pioreactor/actions/leader/experiment_profile.py", "experiment profile YAMLs"], "code_license": "MIT", "language": "Python", "hardware": ["Pioreactor 20/40 mL bioreactor (Raspberry Pi)"], "domain": "biology", "task_type": "bioreactor", "results_evidence": "No first-party results paper; third-party papers (e.g., 10.1186/s12934-025-02670-8) use it for culture experiments.", "wet_lab_validated": false, "simulatable": "true: built-in testing/fake hardware mode (TESTING env var) runs automations without hardware", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Highly simulatable experiment-profile YAMLs, but no paper with its own released profile + results; could pair with a citing paper's methods.", "est_tasks": 3, "source_agent": "nonlh"} +{"id": "bio-spec-hardwarex", "title": "BIO-SPEC: An open-source bench-top parallel bioreactor system", "doi": "10.1016/j.ohx.2025.e00670", "paper_url": "https://www.sciencedirect.com/science/article/pii/S2468067225000690", "year": 2025, "venue": "HardwareX", "open_access_license": "CC BY", "code_url": "see paper repository (OSF/Zenodo, not verified)", "code_files": [], "code_license": "CC BY (hardware, per HardwareX)", "language": "Python/Arduino", "hardware": ["parallel bioreactors", "OD sensor"], "domain": "biology", "task_type": "bioreactor", "results_evidence": "Validation growth experiments reported in HardwareX.", "wet_lab_validated": true, "simulatable": "false: firmware", "duplicate_of_existing": null, "readiness": "no", "readiness_reason": "Code location not verified; hardware-centric.", "est_tasks": 1, "source_agent": "nonlh"} +{"id": "photobioreactor-fluorescence", "title": "Integration of Fluorescence Spectroscopy into a Photobioreactor for the Monitoring of Cyanobacteria", "doi": "10.3390/bios15030128", "paper_url": "https://www.mdpi.com/2079-6374/15/3/128", "year": 2025, "venue": "Biosensors", "open_access_license": "CC BY", "code_url": "https://github.com/borjaggarcia/fluorescence-monitoring", "code_files": ["(not probed)"], "code_license": "unverified", "language": "Python", "hardware": ["Pioreactor-based photobioreactor", "spectrometer"], "domain": "biology", "task_type": "bioreactor", "results_evidence": "Cyanobacterial growth monitored by fluorescence with reported correlation to OD.", "wet_lab_validated": true, "simulatable": "partial: Pioreactor plugin runs in testing mode", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Small repo; licence unverified.", "est_tasks": 1, "source_agent": "nonlh"} +{"id": "pycromanager-2021", "title": "Pycro-Manager: open-source software for customized and reproducible microscope control", "doi": "10.1038/s41592-021-01087-6", "paper_url": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8532176/", "year": 2021, "venue": "Nature Methods", "open_access_license": "author manuscript (PMC)", "code_url": "https://github.com/micro-manager/pycro-manager", "code_files": ["pycromanager/acquisition/", "misc/examples/", "docs/source/*.ipynb (application notebooks)"], "code_license": "BSD-3-Clause", "language": "Python", "hardware": ["Micro-Manager-controlled microscopes (cameras, stages, light sources)"], "domain": "biology", "task_type": "imaging", "results_evidence": "Applications in paper (adaptive illumination, light-sheet, high-throughput imaging) with acquired data.", "wet_lab_validated": true, "simulatable": "true: Micro-Manager Demo config (DemoCamera/DemoStage) via pymmcore / Java backend", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "Demo hardware lets acquisition events be executed and checked (axes, positions, exposures, hooks).", "est_tasks": 5, "source_agent": "nonlh"} +{"id": "pymmcore-plus-mda", "title": "pymmcore-plus + useq-schema (multi-dimensional acquisition engine)", "doi": null, "paper_url": "https://pymmcore-plus.github.io/pymmcore-plus/", "year": 2024, "venue": "software (used by Mantis/shrimPy and others)", "open_access_license": null, "code_url": "https://github.com/pymmcore-plus/pymmcore-plus", "code_files": ["examples/run_mda.py", "examples/event_driven_acquisition.py", "(useq-schema) src/useq/_mda_sequence.py"], "code_license": "BSD-3-Clause", "language": "Python", "hardware": ["Micro-Manager devices"], "domain": "biology", "task_type": "imaging", "results_evidence": "Software; validated through downstream papers (e.g., Mantis PNAS Nexus 2024).", "wet_lab_validated": false, "simulatable": "true: loadSystemConfiguration() demo config, fully headless", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "Best grading substrate for imaging tasks: MDASequence is declarative and comparable; pair with papers' imaging methods.", "est_tasks": 4, "source_agent": "nonlh"} +{"id": "mantis-shrimpy", "title": "Mantis: High-throughput 4D imaging and analysis of the molecular and physical architecture of cells", "doi": "10.1093/pnasnexus/pgae323", "paper_url": "https://academic.oup.com/pnasnexus/article/3/9/pgae323/7742297", "year": 2024, "venue": "PNAS Nexus", "open_access_license": "CC BY-NC", "code_url": "https://github.com/czbiohub-sf/shrimPy", "code_files": ["archive/pycromanager/acquisition_settings/*.yaml", "archive/pycromanager/cli/run_acquisition.py", "mantis acquisition engine"], "code_license": "BSD-3-Clause", "language": "Python", "hardware": ["custom light-sheet + label-free microscope", "Micro-Manager stages/cameras"], "domain": "biology", "task_type": "imaging", "results_evidence": "Multi-well 4D imaging of cell lines acquired and analysed with reported throughput.", "wet_lab_validated": true, "simulatable": "true: demo acquisition settings YAML + Micro-Manager demo config", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "Acquisition settings YAMLs map directly to methods text; demo config enables dry-run.", "est_tasks": 3, "source_agent": "nonlh"} +{"id": "navigate-2024", "title": "Navigate: an open-source platform for smart light-sheet microscopy", "doi": "10.1038/s41592-024-02413-4", "paper_url": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC11540721/", "year": 2024, "venue": "Nature Methods", "open_access_license": "author manuscript (PMC)", "code_url": "https://github.com/TheDeanLab/navigate", "code_files": ["src/navigate/controller/controller.py", "src/navigate/model/features/ (feature lists = smart acquisition programs)", "config/configuration.yaml (synthetic hardware)"], "code_license": "BSD-style (LICENSE.md)", "language": "Python", "hardware": ["light-sheet microscopes (ASLM, OPM)", "stages", "cameras", "galvos"], "domain": "biology", "task_type": "imaging", "results_evidence": "Smart acquisition (autofocus, tiling, decision-based imaging) demonstrated on multiple microscopes with images.", "wet_lab_validated": true, "simulatable": "true: ships 'synthetic' hardware devices for every device class", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "Feature-list programs are a compact DSL; synthetic hardware enables execution-based grading.", "est_tasks": 4, "source_agent": "nonlh"} +{"id": "eda-event-driven", "title": "Event-driven acquisition for content-enriched microscopy", "doi": "10.1038/s41592-022-01589-x", "paper_url": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7613693/", "year": 2022, "venue": "Nature Methods", "open_access_license": "author manuscript (PMC, CC BY)", "code_url": "https://github.com/wl-stepp/eda_plugin", "code_files": ["eda_plugin/examples/main.py", "eda_plugin/examples/actuators.py", "eda_plugin/examples/interpreters.py", "(LEB-EPFL/EDA) analysis"], "code_license": "BSD-3-Clause", "language": "Python", "hardware": ["iSIM microscope", "Micro-Manager"], "domain": "biology", "task_type": "imaging", "results_evidence": "Adaptive frame-rate imaging of mitochondrial and bacterial division events with reported photobleaching reduction.", "wet_lab_validated": true, "simulatable": "true: Micro-Manager demo config + recorded data replay", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "Feedback rule (interpreter thresholds -> frame rate) is checkable by replaying image streams.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "etsted", "title": "Event-triggered STED imaging", "doi": "10.1038/s41592-022-01588-y", "paper_url": "https://www.nature.com/articles/s41592-022-01588-y", "year": 2022, "venue": "Nature Methods", "open_access_license": "CC BY", "code_url": "https://github.com/jonatanalvelid/etSTED-widget", "code_files": ["EtSTEDController.py", "mockcamera.py", "analysis_pipelines/pipeline_fake.py"], "code_license": "GPL-3.0", "language": "Python", "hardware": ["STED microscope", "ImSwitch"], "domain": "biology", "task_type": "imaging", "results_evidence": "Event-triggered STED of vesicle/synaptic events with reported detection rates.", "wet_lab_validated": true, "simulatable": "true: mockcamera + fake pipeline included", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "Mock camera bundled; GPL limits vendoring but can be referenced.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "pysted", "title": "Development of AI-assisted microscopy frameworks through realistic simulation with pySTED", "doi": "10.1038/s42256-024-00903-w", "paper_url": "https://www.nature.com/articles/s42256-024-00903-w", "year": 2024, "venue": "Nature Machine Intelligence", "open_access_license": "CC BY-NC-ND", "code_url": "https://github.com/FLClab/pySTED", "code_files": ["pysted/base.py", "(gym-sted) gym_sted/envs/"], "code_license": "CC (Attribution, check NC)", "language": "Python", "hardware": ["STED microscope (real validation)", "simulator"], "domain": "biology", "task_type": "imaging", "results_evidence": "RL policies trained in simulation were deployed on a real STED microscope with image quality reported.", "wet_lab_validated": true, "simulatable": "true: the code is a simulator (gym environment)", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Simulator itself rather than lab-automation code; good as a grader for imaging-parameter tasks; NC licences.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "imswitch", "title": "ImSwitch: generalizing microscope control in Python", "doi": "10.21105/joss.03394", "paper_url": "https://joss.theoj.org/papers/10.21105/joss.03394", "year": 2021, "venue": "JOSS", "open_access_license": "CC BY", "code_url": "https://github.com/ImSwitch/ImSwitch", "code_files": ["imswitch/imcontrol/", "imswitch/_data/user_defaults/imcontrol_setups/example_virtual_microscope.json"], "code_license": "GPL-3.0", "language": "Python", "hardware": ["many microscope devices"], "domain": "biology", "task_type": "imaging", "results_evidence": "Software paper; underpins etSTED and UC2 experiments.", "wet_lab_validated": false, "simulatable": "true: virtual microscope setup", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Software paper; results via downstream papers.", "est_tasks": 1, "source_agent": "nonlh"} +{"id": "uc2-esp", "title": "UC2-ESP: A general-purpose framework for open-source microscopy control", "doi": "10.1111/jmi.70147", "paper_url": "https://onlinelibrary.wiley.com/doi/10.1111/jmi.70147", "year": 2026, "venue": "Journal of Microscopy", "open_access_license": "CC BY", "code_url": "https://github.com/openUC2/UC2-REST", "code_files": ["uc2rest/ (Python REST client)", "ESP32 firmware (youseetoo/uc2-esp32)"], "code_license": "(LICENSE present, unrecognised)", "language": "Python/C++", "hardware": ["UC2 modular microscope", "ESP32 motors/LEDs"], "domain": "biology", "task_type": "imaging", "results_evidence": "Firmware/REST control demonstrated across UC2 microscope builds.", "wet_lab_validated": true, "simulatable": "partial: REST client mockable; firmware needs ESP32", "duplicate_of_existing": "uc2-hi2 (same UC2 ecosystem, different paper)", "readiness": "partial", "readiness_reason": "Close to existing uc2-hi2 entry.", "est_tasks": 1, "source_agent": "nonlh"} +{"id": "openframe-openaf", "title": "openFrame: modular open microscopy platform with single-shot optical autofocus", "doi": "10.1111/jmi.13219", "paper_url": "https://onlinelibrary.wiley.com/doi/10.1111/jmi.13219", "year": 2023, "venue": "Journal of Microscopy", "open_access_license": "CC BY", "code_url": "https://github.com/ImperialCollegeLondon/openAF", "code_files": ["Java Micro-Manager plugin + Python scripts"], "code_license": "BSD", "language": "Java/Python", "hardware": ["openFrame microscope", "autofocus module"], "domain": "biology", "task_type": "imaging", "results_evidence": "Autofocus accuracy/stability characterised and used in HCA imaging.", "wet_lab_validated": true, "simulatable": "partial: Micro-Manager demo for plugin shell only", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Autofocus algorithm checkable on images; Java plugin.", "est_tasks": 1, "source_agent": "nonlh"} +{"id": "openflexure-autofocus", "title": "Fast, high-precision autofocus on a motorised microscope: Automating blood sample imaging on the OpenFlexure Microscope", "doi": "10.1111/jmi.13064", "paper_url": "https://onlinelibrary.wiley.com/doi/10.1111/jmi.13064", "year": 2022, "venue": "Journal of Microscopy", "open_access_license": "CC BY", "code_url": "https://gitlab.com/openflexure/openflexure-microscope-server", "code_files": ["openflexure_microscope/api/default_extensions/autofocus.py", "scan extension"], "code_license": "GPL-3.0", "language": "Python", "hardware": ["OpenFlexure Microscope", "Raspberry Pi camera", "Sangaboard stage"], "domain": "biology", "task_type": "imaging", "results_evidence": "Automated malaria blood-smear tiling scans with autofocus success rates reported.", "wet_lab_validated": true, "simulatable": "true: server has a simulation/mock camera+stage mode (dev)", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "GitLab server includes mock hardware; scan/autofocus parameters gradeable.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "alabos-alab", "title": "AlabOS: a Python-based reconfigurable workflow management framework for autonomous laboratories (A-Lab)", "doi": "10.1039/d4dd00129j", "paper_url": "https://pubs.rsc.org/en/content/articlehtml/2024/dd/d4dd00129j", "year": 2024, "venue": "Digital Discovery", "open_access_license": "CC BY", "code_url": "https://github.com/CederGroupHub/alab_management", "code_files": ["alab_management/builders/experimentbuilder.py", "examples/alab_example/alab_example/devices/box_furnace.py", "examples/alab_example/alab_example/tasks/", "tests/fake_lab/"], "code_license": "MIT", "language": "Python", "hardware": ["A-Lab: UR5e arms", "box/tube furnaces", "powder dosing (Labman)", "XRD", "ball mill", "capping grippers"], "domain": "materials", "task_type": "scheduling", "results_evidence": "AlabOS ran A-Lab for months (>3500 samples) of solid-state synthesis; A-Lab Nature 2023 reported 41 synthesized targets (later disputed).", "wet_lab_validated": true, "simulatable": "true: fake_lab devices + example device classes run without hardware (needs MongoDB)", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "MIT, fake devices, experiment builder API; tasks: 'synthesis recipe text -> ExperimentBuilder task graph (heating profile, dosing, XRD)'.", "est_tasks": 5, "source_agent": "nonlh"} +{"id": "a-lab-2023", "title": "An autonomous laboratory for the accelerated synthesis of novel materials (A-Lab)", "doi": "10.1038/s41586-023-06734-w", "paper_url": "https://www.nature.com/articles/s41586-023-06734-w", "year": 2023, "venue": "Nature", "open_access_license": "CC BY", "code_url": "https://github.com/njszym/ARROWS", "code_files": ["ARROWS (active-learning synthesis planner)", "XRD-AutoAnalyzer"], "code_license": "none (ARROWS); see repos", "language": "Python", "hardware": ["UR5e", "furnaces", "XRD", "powder dosing"], "domain": "materials", "task_type": "synthesis", "results_evidence": "Claimed 41/58 novel compounds synthesized in 17 days (phase claims later contested).", "wet_lab_validated": true, "simulatable": "partial: planning/XRD analysis code runs offline; robot control via AlabOS", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Robot code is AlabOS (separate entry); contested results lower ground-truth reliability.", "est_tasks": 1, "source_agent": "nonlh"} +{"id": "ada-thin-films", "title": "Self-driving laboratory for accelerated discovery of thin-film materials (Ada)", "doi": "10.1126/sciadv.aaz8867", "paper_url": "https://www.science.org/doi/10.1126/sciadv.aaz8867", "year": 2020, "venue": "Science Advances", "open_access_license": "CC BY-NC", "code_url": "https://github.com/berlinguette/ada", "code_files": ["per-paper folders: campaign data, user_config.py, transformations_config.py, analysis scripts"], "code_license": "MIT", "language": "Python", "hardware": ["N9 robot arm (North Robotics)", "spin coater", "annealing", "UV-Vis-NIR", "4-point probe", "camera"], "domain": "materials", "task_type": "synthesis", "results_evidence": "Optimised hole-transport-layer pseudomobility via closed-loop BO; data released per campaign.", "wet_lab_validated": true, "simulatable": "false: robot orchestration (ChemOS/N9) not released; only configs/data", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Campaign configs + data released but not hardware control code.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "ada-pareto-2022", "title": "A self-driving laboratory advances the Pareto front for material properties (Ada combustion synthesis)", "doi": "10.1038/s41467-022-28580-6", "paper_url": "https://www.nature.com/articles/s41467-022-28580-6", "year": 2022, "venue": "Nature Communications", "open_access_license": "CC BY", "code_url": "https://github.com/berlinguette/ada", "code_files": ["2022 folders (data + luigi pipeline configs)"], "code_license": "MIT", "language": "Python", "hardware": ["N9 arm", "spray coater", "XRF", "conductivity probe"], "domain": "materials", "task_type": "synthesis", "results_evidence": "Pareto fronts of conductivity vs annealing temperature for Pd films reported.", "wet_lab_validated": true, "simulatable": "false: data/config only", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Same as Ada: no control code.", "est_tasks": 1, "source_agent": "nonlh"} +{"id": "afion-plasmonic", "title": "Self-driving lab for the photochemical synthesis of plasmonic nanoparticles (AFION)", "doi": "10.1038/s41467-025-56788-9", "paper_url": "https://www.nature.com/articles/s41467-025-56788-9", "year": 2025, "venue": "Nature Communications", "open_access_license": "CC BY-NC-ND", "code_url": "https://github.com/Taylorwutianyi/AFION-LAB", "code_files": ["General_AFION_Platform_Control_Software_Code/PythonLab/microreactor_v12.py", "pylab/instruments/pumps/hamilton_pump.py", "pylab/instruments/thorlabs_spectrometer/ccs.py"], "code_license": "none", "language": "Python", "hardware": ["flow microreactors", "syringe pumps", "UV LEDs (Arduino stepper)", "Thorlabs spectrometer"], "domain": "materials", "task_type": "synthesis", "results_evidence": "Targeted Ag nanoparticle morphologies/spectra achieved autonomously with reported spectra.", "wet_lab_validated": true, "simulatable": "partial: instrument classes need serial stubs", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "No licence; instrument-level Python is clear; flow chemistry rig.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "bear-mechanics", "title": "Superlative mechanical energy absorbing efficiency discovered through self-driving lab-human partnership (BEAR)", "doi": "10.1038/s41467-024-48534-4", "paper_url": "https://www.nature.com/articles/s41467-024-48534-4", "year": 2024, "venue": "Nature Communications", "open_access_license": "CC BY", "code_url": "https://github.com/KelseyEng/BEAR_ADTS", "code_files": ["*.m MATLAB orchestration", "*.py printer control", "gcode"], "code_license": "(LICENSE present, unrecognised)", "language": "MATLAB/Python", "hardware": ["FDM 3D printers", "UR5e arm", "Instron compression tester", "scale"], "domain": "materials", "task_type": "characterisation", "results_evidence": "Record 75% energy-absorbing efficiency structures discovered; >25,000 experiments.", "wet_lab_validated": true, "simulatable": "partial: MATLAB orchestration with hardware calls; geometry generation simulatable", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "MATLAB; arm/printer sequencing could be stubbed.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "clio-electrolytes", "title": "Autonomous optimization of non-aqueous Li-ion battery electrolytes via robotic experimentation (Clio)", "doi": "10.1038/s41467-022-32938-1", "paper_url": "https://www.nature.com/articles/s41467-022-32938-1", "year": 2022, "venue": "Nature Communications", "open_access_license": "CC BY", "code_url": "https://github.com/BattModels/Clio-PythonAPI", "code_files": ["Experiment.py", "demo_electrolytecomp.py", "(Clio-LabViewControl) LabVIEW VIs"], "code_license": "none", "language": "Python/LabVIEW", "hardware": ["Clio: pumps, mixing, conductivity cell", "pouch cells"], "domain": "chemistry", "task_type": "characterisation", "results_evidence": "Found electrolyte with 13% higher conductivity in 42 experiments; pouch-cell validation.", "wet_lab_validated": true, "simulatable": "partial: Python API sends to LabVIEW; demo script mockable", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "No licence; LabVIEW backend.", "est_tasks": 1, "source_agent": "nonlh"} +{"id": "ahtech-electrochem", "title": "A high-throughput experimentation platform for data-driven discovery in electrochemistry (AHTech)", "doi": "10.1126/sciadv.adu4391", "paper_url": "https://www.science.org/doi/10.1126/sciadv.adu4391", "year": 2025, "venue": "Science Advances", "open_access_license": "CC BY-NC", "code_url": "https://github.com/Liu-Lab-JHU/AHTech", "code_files": ["Code/AHTech Operation/AHTech_run.py", "Code/AHTech Operation/OpentronsClient.py", "easy-biologic potentiostat driver"], "code_license": "MIT", "language": "Python", "hardware": ["Opentrons OT-2 (electrode carrier)", "BioLogic multichannel potentiostat"], "domain": "chemistry", "task_type": "characterisation", "results_evidence": "Thousands of CVs on redox mediators with discovered reactivity trends reported.", "wet_lab_validated": true, "simulatable": "partial: OT-2 HTTP client mockable; potentiostat via easy-biologic needs stub", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Electrochemistry is non-LH but OT-2 used as robot; MIT.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "panda-bear", "title": "PANDA: a self-driving lab for studying electrodeposited polymer films", "doi": "10.1039/d4mh00797b", "paper_url": "https://pubs.rsc.org/en/content/articlehtml/2024/mh/d4mh00797b", "year": 2024, "venue": "Materials Horizons", "open_access_license": "CC BY", "code_url": "https://github.com/BU-KABlab/PANDA-BEAR", "code_files": ["examples/run_experiment.py", "src/panda_lib/hardware/grbl_cnc_mill/mock.py", "src/panda_lib/hardware/gamry_potentiostat/gamry_control_mock.py", "src/panda_lib/hardware/emstat_potentiostat/emstat_control_mock.py"], "code_license": "GPL-3.0", "language": "Python", "hardware": ["CNC gantry (GRBL)", "syringe pump", "Gamry/EmStat potentiostat", "telecentric camera"], "domain": "materials", "task_type": "characterisation", "results_evidence": "BO campaign optimised PEDOT:PSS electrochromic switching; data reported.", "wet_lab_validated": true, "simulatable": "true: mock CNC, mock potentiostats, path simulation shipped", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "Mocks for every instrument; experiment definitions translate from methods (deposition potential/time, CV params).", "est_tasks": 4, "source_agent": "nonlh"} +{"id": "robochem", "title": "Automated self-optimization, intensification, and scale-up of photocatalysis in flow (RoboChem)", "doi": "10.1126/science.adj1817", "paper_url": "https://www.science.org/doi/10.1126/science.adj1817", "year": 2024, "venue": "Science", "open_access_license": "paywalled (UvA repository copy)", "code_url": "https://github.com/Noel-Research-Group/Robochem_v1.0", "code_files": ["ML_GUI/run_optimization.py", "ML_GUI/Dragonfly_BO.py", "Platform_/Eagle_Reactor/Eagle_control.py", "Platform_/Liquid_Handler/GX_241_Liquid_Handler.py"], "code_license": "MIT", "language": "Python", "hardware": ["Gilson GX-241 liquid handler", "Vapourtec/Eagle flow photoreactor", "benchtop NMR", "pumps"], "domain": "chemistry", "task_type": "synthesis", "results_evidence": "19 photocatalytic transformations self-optimised; yields often exceeded literature.", "wet_lab_validated": true, "simulatable": "partial: BO loop runnable; instrument classes need serial stubs", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Paper paywalled; code MIT; flow chemistry rig with no built-in mocks.", "est_tasks": 3, "source_agent": "nonlh"} +{"id": "llm-rdf", "title": "An automatic end-to-end chemical synthesis development platform powered by large language models (LLM-RDF)", "doi": "10.1038/s41467-024-54457-x", "paper_url": "https://www.nature.com/articles/s41467-024-54457-x", "year": 2024, "venue": "Nature Communications", "open_access_license": "CC BY-NC-ND", "code_url": "https://github.com/Ruan-Yixiang/LLM-RDF", "code_files": ["agent web app (JS/TS)", "hardware executor scripts"], "code_license": "none", "language": "JavaScript/Python", "hardware": ["HTE liquid handler", "GC", "robot arm"], "domain": "chemistry", "task_type": "synthesis", "results_evidence": "Cu/TEMPO aerobic oxidation developed end-to-end with HTE screening, kinetics and scale-up.", "wet_lab_validated": true, "simulatable": "false", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "No licence; huge vendored node_modules; partial LH.", "est_tasks": 1, "source_agent": "nonlh"} +{"id": "mxene-aerogel", "title": "Machine intelligence accelerated design of conductive MXene aerogels with programmable properties", "doi": "10.1038/s41467-024-49011-8", "paper_url": "https://www.nature.com/articles/s41467-024-49011-8", "year": 2024, "venue": "Nature Communications", "open_access_license": "CC BY", "code_url": "https://github.com/oshin71/Programmable-MXene-Aerogel", "code_files": ["*.py ML pipeline", "*.ipynb"], "code_license": "BSD", "language": "Python", "hardware": ["pipetting robot (OT-2)", "freeze-caster"], "domain": "materials", "task_type": "synthesis", "results_evidence": "Aerogels with predicted conductivity/EMI shielding fabricated and measured.", "wet_lab_validated": true, "simulatable": "false: ML only", "duplicate_of_existing": null, "readiness": "no", "readiness_reason": "Released code is ML, not automation.", "est_tasks": 0, "source_agent": "nonlh"} +{"id": "sdl-demo-clslab", "title": "What is a minimal working example for a self-driving laboratory? (SDL-Demo / CLSLab:Light)", "doi": "10.1016/j.matt.2022.11.007", "paper_url": "https://www.cell.com/matter/fulltext/S2590-2385(22)00651-1", "year": 2022, "venue": "Matter", "open_access_license": "author accepted (NSF PAR)", "code_url": "https://github.com/sparks-baird/self-driving-lab-demo", "code_files": ["src/self_driving_lab_demo/", "notebooks/2.2-sensor-simulator.ipynb", "scripts/bayesian_optimization_basic.py"], "code_license": "MIT", "language": "Python/MicroPython", "hardware": ["Raspberry Pi Pico W", "RGB LEDs", "AS7341 spectral sensor"], "domain": "other", "task_type": "characterisation", "results_evidence": "Optimisation of LED mixing to match target spectra; simulator vs hardware comparison reported.", "wet_lab_validated": true, "simulatable": "true: SensorSimulator class mirrors hardware", "duplicate_of_existing": null, "readiness": "ready", "readiness_reason": "Built-in simulator; tasks like 'set up BO campaign / MQTT commands per methods'; low biology relevance.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "ac-training-lab", "title": "Acceleration Consortium Training Lab (remote-access SDL modules incl. Hello-World, sample transfer)", "doi": null, "paper_url": "https://github.com/AccelerationConsortium/ac-training-lab", "year": 2025, "venue": "software (several Digital Discovery / ChemRxiv tutorials)", "open_access_license": null, "code_url": "https://github.com/AccelerationConsortium/ac-training-lab", "code_files": ["scripts/prefect_scripts/my_gh_sample_transfer_workflow.py", "src/ac_training_lab/"], "code_license": "MIT", "language": "Python", "hardware": ["xArm/MyCobot arms", "Cobra sample transfer", "Raspberry Pi devices", "3D-printer gantries"], "domain": "other", "task_type": "plate_transport", "results_evidence": "Educational SDL modules; no single results paper verified.", "wet_lab_validated": false, "simulatable": "partial: Prefect workflows run with MQTT mocks", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "No canonical results paper.", "est_tasks": 1, "source_agent": "nonlh"} +{"id": "helao-async", "title": "HELAO-async: autonomous electrochemistry/high-throughput experimentation orchestration (Caltech/TRI)", "doi": "10.1039/d3dd00193h", "paper_url": "https://pubs.rsc.org/en/content/articlehtml/2023/dd/d3dd00193h", "year": 2023, "venue": "Digital Discovery (DOI unverified)", "open_access_license": "CC BY", "code_url": "https://github.com/High-Throughput-Experimentation/helao-async", "code_files": ["helao/deploy/hexagon/servers/action/ws_simulator.py", "helao/deploy/hexagon/servers/action/sim_db_server.py", "sequences/ & experiments/ libraries"], "code_license": "MIT", "language": "Python", "hardware": ["scanning droplet cell", "potentiostats", "PAL autosampler", "XY stages"], "domain": "materials", "task_type": "characterisation", "results_evidence": "Used for autonomous electrocatalyst/OER composition screening with reported datasets.", "wet_lab_validated": true, "simulatable": "true: simulator action servers in repo", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "DOI not verified here; complex multi-server deployment; experiment/sequence functions are gradeable.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "enzyme-sdl", "title": "Optimized Machine Learning for Autonomous Enzymatic Reaction Intensification in a Self-Driving Lab", "doi": "10.1002/bit.70038", "paper_url": "https://onlinelibrary.wiley.com/doi/10.1002/bit.70038", "year": 2025, "venue": "Biotechnology and Bioengineering", "open_access_license": "CC BY", "code_url": "https://github.com/putzsebastian/sdl-enzymes-optimization", "code_files": ["*.py optimisation", "csv campaign data"], "code_license": "MIT", "language": "Python", "hardware": ["liquid handler", "plate reader", "robotic arm (SDL)"], "domain": "biology", "task_type": "other", "results_evidence": "Enzymatic reaction conditions optimised autonomously; campaign data released.", "wet_lab_validated": true, "simulatable": "partial: optimiser only", "duplicate_of_existing": null, "readiness": "no", "readiness_reason": "Code is ML/optimiser only.", "est_tasks": 0, "source_agent": "nonlh"} +{"id": "memplex-printing", "title": "Designer artificial environments for membrane protein synthesis", "doi": "10.1038/s41467-025-59471-1", "paper_url": "https://www.nature.com/articles/s41467-025-59471-1", "year": 2025, "venue": "Nature Communications", "open_access_license": "CC BY", "code_url": "https://github.com/ccmeyer/printing-platform", "code_files": ["Scripts/control_platform.py", "Scripts/Dobot/DobotControl.py", "Scripts/Precigenome/PGMFC/control_c.py"], "code_license": "MIT", "language": "Python", "hardware": ["Dobot arm", "piezo droplet printer", "pressure controller", "plate reader"], "domain": "biology", "task_type": "other", "results_evidence": "Thousands of cell-free membrane-protein reactions printed and measured; formulations identified.", "wet_lab_validated": true, "simulatable": "partial: Dobot/pressure DLL calls need stubs", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Nanolitre droplet printing = liquid dispensing (overlap); arm control is non-LH.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "polymer-protein-hybrids", "title": "Machine Learning on a Robotic Platform for the Design of Polymer-Protein Hybrids", "doi": "10.1002/adma.202201809", "paper_url": "https://onlinelibrary.wiley.com/doi/10.1002/adma.202201809", "year": 2022, "venue": "Advanced Materials", "open_access_license": "CC BY-NC-ND", "code_url": "https://github.com/webbtheosim/PPH_public", "code_files": ["csv data only"], "code_license": "none", "language": "-", "hardware": ["Hamilton liquid handler", "plate reader", "robotic arm"], "domain": "biology", "task_type": "other", "results_evidence": "Enzyme-stabilising copolymers designed and assayed.", "wet_lab_validated": true, "simulatable": "false", "duplicate_of_existing": null, "readiness": "no", "readiness_reason": "Data only.", "est_tasks": 0, "source_agent": "nonlh"} +{"id": "raft-polymerization-platform", "title": "A fully automated platform for photoinitiated RAFT polymerization", "doi": "10.1039/d2dd00100d", "paper_url": "https://pubs.rsc.org/en/content/articlehtml/2023/dd/d2dd00100d", "year": 2023, "venue": "Digital Discovery", "open_access_license": "CC BY", "code_url": "https://doi.org/10.5281/zenodo.7379060", "code_files": ["Zenodo: Chemspeed/robot scripts + data"], "code_license": "check Zenodo", "language": "Python", "hardware": ["Chemspeed SWING", "UV photoreactor", "GPC/NMR"], "domain": "chemistry", "task_type": "synthesis", "results_evidence": "Automated photo-RAFT polymerisations with Mn/\u0110 characterisation reported.", "wet_lab_validated": true, "simulatable": "partial", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "Zenodo contents unverified.", "est_tasks": 1, "source_agent": "nonlh"} +{"id": "solubility-hein", "title": "Automated solubility screening platform using computer vision", "doi": "10.1016/j.isci.2021.102176", "paper_url": "https://www.cell.com/iscience/fulltext/S2589-0042(21)00144-0", "year": 2021, "venue": "iScience", "open_access_license": "CC BY-NC-ND", "code_url": "https://gitlab.com/heingroup/automated_solubility_h1", "code_files": ["N9 robot scripts", "HeinSight turbidity CV"], "code_license": "unverified", "language": "Python", "hardware": ["North Robotics N9 arm", "camera", "dosing", "hotplate"], "domain": "chemistry", "task_type": "characterisation", "results_evidence": "Solubility of compounds determined by CV turbidity with comparison to HPLC.", "wet_lab_validated": true, "simulatable": "partial: N9 'north' package has a simulation mode (unverified)", "duplicate_of_existing": null, "readiness": "partial", "readiness_reason": "GitLab licence unverified.", "est_tasks": 2, "source_agent": "nonlh"} +{"id": "mobile-robot-burger-2020", "title": "A mobile robotic chemist (Burger et al.)", "doi": "10.1038/s41586-020-2442-2", "paper_url": "https://www.nature.com/articles/s41586-020-2442-2", "year": 2020, "venue": "Nature", "open_access_license": "paywalled", "code_url": "none public (ROS code not released)", "code_files": [], "code_license": "n/a", "language": "Python/ROS", "hardware": ["KUKA KMR iiwa", "GC", "photolysis station"], "domain": "chemistry", "task_type": "plate_transport", "results_evidence": "688 experiments over 8 days found photocatalyst mixtures 6x more active.", "wet_lab_validated": true, "simulatable": "false", "duplicate_of_existing": null, "readiness": "no", "readiness_reason": "No public code.", "est_tasks": 0, "source_agent": "nonlh"} +{"id": "archemist", "title": "ARChemist: Autonomous Robotic Chemistry System Architecture (Fakhruldeen et al.)", "doi": "10.1109/ICRA46639.2022.9811996", "paper_url": "https://arxiv.org/abs/2204.13571", "year": 2022, "venue": "ICRA 2022", "open_access_license": "arXiv", "code_url": "https://github.com/ARChemist (unverified)", "code_files": [], "code_license": "unverified", "language": "Python/ROS", "hardware": ["KUKA KMR", "Franka", "solubility/crystallisation stations"], "domain": "chemistry", "task_type": "plate_transport", "results_evidence": "Solubility screening and crystallisation workflows demonstrated.", "wet_lab_validated": true, "simulatable": "partial: ROS", "duplicate_of_existing": null, "readiness": "no", "readiness_reason": "Code location not verified.", "est_tasks": 0, "source_agent": "nonlh"} +{"id": "summit-flow", "title": "Summit: benchmarking machine learning methods for reaction optimisation", "doi": "10.1002/cmtd.202000051", "paper_url": "https://chemistry-europe.onlinelibrary.wiley.com/doi/10.1002/cmtd.202000051", "year": 2021, "venue": "Chemistry-Methods", "open_access_license": "CC BY", "code_url": "https://github.com/sustainable-processes/summit", "code_files": ["summit/benchmarks/", "summit/strategies/"], "code_license": "MIT", "language": "Python", "hardware": ["(benchmarks/emulators of flow reactors)"], "domain": "chemistry", "task_type": "other", "results_evidence": "Emulators trained on literature flow-chemistry data; no new wet-lab experiments.", "wet_lab_validated": false, "simulatable": "true", "duplicate_of_existing": null, "readiness": "no", "readiness_reason": "Benchmark software, no lab automation.", "est_tasks": 0, "source_agent": "nonlh"} diff --git a/research/expansion/web_candidates.jsonl b/research/expansion/web_candidates.jsonl new file mode 100644 index 0000000..143a121 --- /dev/null +++ b/research/expansion/web_candidates.jsonl @@ -0,0 +1,60 @@ +{"id": "tidytron", "title": "TidyTron: Reducing lab waste using validated wash-and-reuse protocols for common plasticware in Opentrons OT-2 robots", "doi": "10.1016/j.slast.2023.08.007", "paper_url": "https://doi.org/10.1016/j.slast.2023.08.007", "year": 2024, "venue": "SLAS Technology", "open_access_license": "CC BY-NC-ND 4.0", "code_url": "https://github.com/PlantSynBioLab/TidyTron", "code_files": ["scripts/optimization_scripts/DNAcleaning.py", "scripts/optimization_scripts/fig1C_10ul_tip_cleaning_optimization.py", "scripts/*.py (37 OT-2 scripts total)"], "code_license": "Apache-2.0", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "plasticware wash-and-reuse / tip and plate cleaning", "results_evidence": "Carryover after wash validated by qPCR/transformation and fluorescence assays showing no detectable cross-contamination vs fresh plasticware.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "Open paper text (CC BY-NC-ND), Apache-2.0 repo with 37 standalone OT-2 API v2 scripts that should simulate as-is; wash/reuse figures give measured outcomes.", "est_tasks": 6, "source_agent": "web", "duplicate_of_existing": null} +{"id": "beckham-enzyme-pipeline", "title": "Enabling high-throughput enzyme discovery and engineering with a low-cost, robot-assisted pipeline", "doi": "10.1038/s41598-024-64938-0", "paper_url": "https://www.nature.com/articles/s41598-024-64938-0", "year": 2024, "venue": "Scientific Reports", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/beckham-lab/opentrons", "code_files": ["1-Transformation/Transformation_cherrypicking/2024-03-18_Transformation_cherrypicking_OT2.py", "1-Transformation/Transformation_platetoplate/transformation_platetoplate_OT2.py", "2-Inoculation/*.py", "(21 OT-2 scripts total)"], "code_license": "none (no LICENSE file)", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "E. coli transformation, inoculation, expression, lysis, enzyme assay", "results_evidence": "Robot-assisted pipeline screened enzyme variant libraries; activity/expression measured and compared with manual handling.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "CC BY paper plus modular per-step OT-2 v2 scripts; only blocker is the unlicensed repo (cannot vendor, can still reference).", "est_tasks": 8, "source_agent": "web", "duplicate_of_existing": null} +{"id": "jubiotech-ot2-autoclone", "title": "Accelerated strain construction and characterization of C. glutamicum protein secretion by laboratory automation", "doi": "10.1007/s00253-022-12017-7", "paper_url": "https://doi.org/10.1007/s00253-022-12017-7", "year": 2022, "venue": "Applied Microbiology and Biotechnology", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/JuBiotech/OT-2-autoclone", "code_files": ["scripts/golden_gate_assembly.py", "scripts/heat-shock_transformation.py", "scripts/restriction_digestion.py", "scripts/plasmid_purification.py", "scripts/distributing_cells_on_agar_plates.py"], "code_license": "AGPL-3.0", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "Golden Gate assembly, heat-shock transformation, plasmid prep, plating", "results_evidence": "Automated strain construction produced verified C. glutamicum secretion strains characterised in microbioreactor cultivations.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "Open paper, one script per protocol step, each self-contained; AGPL-3.0 means reference-only (same constraint as APEX).", "est_tasks": 8, "source_agent": "web", "duplicate_of_existing": null} +{"id": "roboctab", "title": "High-Throughput DNA Extraction Using Robotic Automation (RoboCTAB) for Large-Scale Genotyping", "doi": "10.3390/plants14152263", "paper_url": "https://www.mdpi.com/2223-7747/14/15/2263", "year": 2025, "venue": "Plants (MDPI)", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/tomstamour/RoboCTAB", "code_files": ["RoboCTAB_OT2.py", "RoboCTAB_Flex.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "CTAB plant DNA extraction", "results_evidence": "DNA yield/purity and genotyping call rates from robot-extracted samples compared with manual CTAB extraction.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "CC BY paper; two complete protocols (OT-2 and Flex variants) give a natural easy/hard pair; repo unlicensed.", "est_tasks": 4, "source_agent": "web", "duplicate_of_existing": null} +{"id": "blots-ot2", "title": "Bacterial Lysis Observation Over Time Assay (BLOTS) for High-Throughput Isolation and Screening", "doi": "10.1002/cpz1.70454", "paper_url": "https://doi.org/10.1002/cpz1.70454", "year": 2026, "venue": "Current Protocols", "open_access_license": "CC BY-NC 4.0", "code_url": "https://github.com/eyaplab/BLOTS-OT2", "code_files": ["BLOTS-OT2_code.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "384-well assay plate assembly / lysis kinetics screening", "results_evidence": "Assay plates assembled by the robot yielded time-resolved lysis curves used to recover and sequence isolates.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "Current Protocols article is a step-by-step protocol (ideal NL input) with a single matching OT-2 script; licence of code unstated.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "hyrad-adna-capture", "title": "Performance and automation of ancient DNA capture with RNA hyRAD probes", "doi": "10.1111/1755-0998.13518", "paper_url": "https://doi.org/10.1111/1755-0998.13518", "year": 2022, "venue": "Molecular Ecology Resources", "open_access_license": "CC BY-NC-ND 4.0", "code_url": "https://github.com/TomaszSuchan/opentrons-hyRAD", "code_files": ["hyRAD.ot2.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "hybridization capture + magnetic bead washes (magnetic module, thermocycler)", "results_evidence": "Capture efficiency and on-target read fractions for automated vs manual hybridization reported for ancient DNA libraries.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "Single self-contained module-driven script; good hard task (magnetic module + temperature steps). Paper is ND-licensed so text can be linked not redistributed.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "massspecpreppy", "title": "MassSpecPreppy - an end-to-end solution for automated protein concentration determination and flexible sample digestion for proteomics", "doi": "10.1002/pmic.202300294", "paper_url": "https://doi.org/10.1002/pmic.202300294", "year": 2023, "venue": "PROTEOMICS", "open_access_license": "CC BY-NC-ND 4.0", "code_url": "https://github.com/stemicha/MassSpecPreppy", "code_files": ["OT2_protocols_template/Mass_Spec_Preppy__OT2_BCAassay.py", "OT2_protocols_template/Mass_Spec_Preppy__OT2_part1_sample_preparation_in_96well.py", "OT2_protocols_template/Mass_Spec_Preppy__OT2_part2_SP3_in_96well_enzyme_mix.py", "OT2_protocols_template/Mass_Spec_Preppy__OT2_part3_Ev*.py"], "code_license": "GPL-3.0", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "BCA assay, reduction/alkylation, SP3 digestion, Evotip loading", "results_evidence": "BCA recovery 101.3% (SD 7.8) for the automated workflow vs 96.3% manual; 94.5% of protein groups passed thresholds for OT-2 digestion.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "GPL-3.0 templates, one file per workflow stage, quantitative wet-lab comparison in the paper; templates are parameterised by the Shiny app so some placeholder filling is needed.", "est_tasks": 8, "source_agent": "web", "duplicate_of_existing": null} +{"id": "lucks-cellfree-biosensor", "title": "Semi-automated production of cell-free biosensors", "doi": "10.1101/2024.10.13.618078", "paper_url": "https://www.biorxiv.org/content/10.1101/2024.10.13.618078v1", "year": 2024, "venue": "bioRxiv", "open_access_license": "bioRxiv (CC licence per preprint page)", "code_url": "https://github.com/LucksLab/Brown_Phillips_Semi-Automated_Biosensor_Manufacturing_2024", "code_files": ["Opentrons_Code/Figure_2_Sensor_Build.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "cell-free reaction assembly (384-well biosensor build)", "results_evidence": "A full 384-well plate of fluoride-sensing cell-free reactions assembled robotically matched expected colorimetric/fluorescent detection performance.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "One script maps to one figure, open preprint text, viscous cell-free liquid class makes it a good hard task; repo unlicensed.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "greenaway-halogenation", "title": "An automated platform for tailored late-stage halogenation of pharmaceuticals", "doi": "10.26434/chemrxiv.15000393", "paper_url": "https://chemrxiv.org/engage/chemrxiv/article-details/15000393", "year": 2025, "venue": "ChemRxiv (preprint)", "open_access_license": "ChemRxiv CC BY (per posting)", "code_url": "https://github.com/GreenawayLab/automated_halogenation_of_pharmaceuticals", "code_files": ["opentrons_dispense_code/reaction_setup/protocol_1(stage1_screening).py", "opentrons_dispense_code/reaction_setup/protocol_2(stage2_0to6_chlor).py", "opentrons_dispense_code/nmr_sample_prep/nmr_sample_preparation.py", "(9 OT-2 scripts total)"], "code_license": "BSD-3-Clause", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "reaction array setup, quench, NMR/LC-MS sample prep", "results_evidence": "Screening arrays dispensed by OT-2 gave halogenation conversions/selectivities measured by NMR and LC-MS across substrate panels.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "BSD-3 code, several independent stage scripts, chemistry (non-bio) diversity for the benchmark; must confirm final journal version.", "est_tasks": 6, "source_agent": "web", "duplicate_of_existing": null} +{"id": "greenaway-mocs", "title": "Development of an Automated Workflow for Screening the Assembly and Host-Guest Behavior of Metal-Organic Cages", "doi": "10.1002/anie.202424270", "paper_url": "https://doi.org/10.1002/anie.202424270", "year": 2025, "venue": "Angewandte Chemie Int. Ed.", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/GreenawayLab/development-automated-workflow-mocs", "code_files": ["Opentrons_Protocols/automated_synthesis_opentron_script.py", "Opentrons_Protocols/automated_screen_refined_opentron_script.py", "Opentrons_Protocols/automated_host_guest_assay_opentron_script.py", "Opentrons_Protocols/Solvent_benchmark_acetonitrile_automated_screen.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "solution-phase screening array + host-guest assay", "results_evidence": "Automated screen identified assembled cages confirmed by MS/NMR and host-guest binding measured across the array.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "CC BY paper, five discrete OT-2 scripts; repo carries no licence so reference-only.", "est_tasks": 6, "source_agent": "web", "duplicate_of_existing": null} +{"id": "greenaway-pocs", "title": "Streamlining the automated discovery of porous organic cages", "doi": "10.1039/d3sc06133g", "paper_url": "https://pubs.rsc.org/en/content/articlehtml/2024/sc/d3sc06133g", "year": 2024, "venue": "Chemical Science", "open_access_license": "CC BY 3.0", "code_url": "https://github.com/GreenawayLab/Streamlining-Automated-Discovery-POCs", "code_files": ["Opentrons_Protocols/Plate_example/opentron_script.py", "Opentrons_Protocols/NMR_transfer/opentron_script.py", "Opentrons_Protocols/HRMS_transfer/opentron_script.py", "Opentrons_Protocols/simulate.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "cage synthesis plate + analytical transfer protocols", "results_evidence": "Automated workflow produced porous organic cages characterised by HRMS/NMR, with hit rates reported vs manual discovery.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "CC BY paper and a repo that even ships simulate.py (so scripts are known to run in opentrons_simulate); unlicensed repo.", "est_tasks": 4, "source_agent": "web", "duplicate_of_existing": null} +{"id": "ester-library-synthesis", "title": "Repurposing amine and carboxylic acid building blocks with an automatable esterification reaction", "doi": "10.1039/d2cc05670d", "paper_url": "https://doi.org/10.1039/d2cc05670d", "year": 2023, "venue": "Chemical Communications", "open_access_license": "unclear (preprint CC BY-NC-ND on ChemRxiv 10.26434/chemrxiv-2022-9grb8)", "code_url": "https://github.com/rz-flask/concise-ester-library-synthesis", "code_files": ["substrate_screen_acids.py", "substrate_screen_quench.py", "substrate_screen_solvent_katsalt_KI.py"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "96-well library synthesis, quench, solvent/salt screen", "results_evidence": "96-well esterification library synthesised on OT-2 with yields/conversions measured by LC-MS.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "MIT code with custom labware JSON included; journal text may be paywalled but the ChemRxiv version is open.", "est_tasks": 4, "source_agent": "web", "duplicate_of_existing": null} +{"id": "culturomics-isolation", "title": "Modular automated high-throughput isolation and phylogenetic identification of bacteria from complex communities", "doi": "10.1002/imo2.70037", "paper_url": "https://doi.org/10.1002/imo2.70037", "year": 2025, "venue": "iMetaOmics", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/microenvgen/Culturomics", "code_files": ["Library preparation/First_PCR.py", "Library preparation/Second_PCR.py", "Library preparation/MicrovolumeDNAextraction.py", "Library preparation/OmegaMagBindPCRpurificationMultichannel.py", "Library preparation/pool_plate_to_screw_cap_by_volume.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "microvolume DNA extraction, two-step amplicon PCR, bead purification, pooling", "results_evidence": "Isolates recovered and phylogenetically identified from automated plates; sequencing success rates reported vs manual pipeline.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "CC BY paper with 11 modular OT-2 scripts, each a clean single-step task; repo has no licence.", "est_tasks": 8, "source_agent": "web", "duplicate_of_existing": null} +{"id": "damplab-moclo-transformation", "title": "A linear programming-based strategy to save pipette tips in automated DNA assembly (with DAMP Lab MoClo/transformation workflow)", "doi": "10.1093/synbio/ysac004", "paper_url": "https://academic.oup.com/synbio/article/7/1/ysac004/6542944", "year": 2022, "venue": "Synthetic Biology (OUP)", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/DAMPLAB/OT2-MoClo-Transformation-Ecoli", "code_files": ["moclo_transformation/data/moclo_template.py", "moclo_transformation/data/moclo_transform_template.py", "moclo_transformation/data/transform_template.py"], "code_license": "BSD-3-Clause", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "MoClo Golden Gate assembly + E. coli transformation + plating", "results_evidence": "Tip-saving assembly strategy evaluated on OT-2 runs; assembly/transformation success measured against standard tip usage.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "BSD-3 templates, open paper; templates are parameterised so labware/volume filling is needed before simulation.", "est_tasks": 4, "source_agent": "web", "duplicate_of_existing": null} +{"id": "lap-format-repository", "title": "The Laboratory Automation Protocol (LAP) Format and Repository: A Platform for Enhancing Workflow Efficiency in Synthetic Biology", "doi": "10.1021/acssynbio.3c00397", "paper_url": "https://pubs.acs.org/doi/10.1021/acssynbio.3c00397", "year": 2023, "venue": "ACS Synthetic Biology", "open_access_license": "CC BY-NC-ND 4.0", "code_url": "https://github.com/Biocomputation-CBGP/LAPrepository", "code_files": ["LAPEntries/**/ScriptsFinal/*.py (37 OT-2 entry scripts)"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "library of standardised protocols (colony selection, PCR setup, media distribution, plate merging)", "results_evidence": "Each LAP entry documents wet-lab execution/validation records on OT-2 at the host biofoundry.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Large multi-protocol repo (same code base as the existing lap-transposon-genotyping source) with no licence; the LAP format paper itself is new to the corpus and each entry could become a task after per-entry validation.", "duplicate_of_existing": "lap-transposon-genotyping", "est_tasks": 10, "source_agent": "web"} +{"id": "agentex-genetic-codes", "title": "Automated prototyping of genetic codes", "doi": "10.1038/s41586-026-10949-y", "paper_url": "https://doi.org/10.1038/s41586-026-10949-y", "year": 2026, "venue": "Nature", "open_access_license": "CC BY-NC-ND 4.0", "code_url": "https://github.com/FelixRadford/AGENTEX", "code_files": ["AGENTEX reactions/Reactions/mixing.py", "Nucleic_acid_purifications/RNA/Step 1/Purification.py", "Nucleic_acid_purifications/RNA/Step 2/mixing.py", "Nucleic_acid_purifications/RNA/Step 3/Purification.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "in vitro translation reaction assembly, RNA purification", "results_evidence": "Automated prototyping produced and characterised reassigned genetic codes with mass-spec/translation readouts.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Repo states Opentrons API 2.13 and has stage scripts, but the paper is ND-licensed and the repo unlicensed; scripts are tied to bespoke labware.", "est_tasks": 4, "source_agent": "web", "duplicate_of_existing": null} +{"id": "sapp-dmx-protein-design", "title": "Accelerating protein design by scaling experimental characterization", "doi": "10.1038/s41467-026-76740-9", "paper_url": "https://doi.org/10.1038/s41467-026-76740-9", "year": 2026, "venue": "Nature Communications", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/bwicky/SAPP_DMX", "code_files": ["SAPP/SEC_pool_and_norm_v3.py"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "SEC fraction pooling and normalisation for protein characterisation", "results_evidence": "High-throughput expression/characterisation of designed proteins; thousands of designs assayed with the automated pipeline.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "CC BY paper, MIT single-purpose script (pool and normalise) \u2014 a clean medium task.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "openblend-media", "title": "Modular development enables rapid design of media for alternative hosts", "doi": "10.1002/bit.27947", "paper_url": "https://doi.org/10.1002/bit.27947", "year": 2022, "venue": "Biotechnology and Bioengineering", "open_access_license": "unclear (likely subscription)", "code_url": "https://github.com/abiedermann/openblend_public", "code_files": ["run_plate_prep.py", "openblend_plates.py", "plate_builder.py", "cal_protocol.py"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "combinatorial media blending into microplates", "results_evidence": "Blended media designs were tested in growth experiments for alternative microbial hosts, with growth rates reported per formulation.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "MIT code with a calibration protocol and plate-prep generator, but the paper text is probably not open, and the protocol is generated from an Excel template.", "est_tasks": 3, "source_agent": "web", "duplicate_of_existing": null} +{"id": "evotron-evolver-sampling", "title": "Dynamic cybergenetic control of bacterial co-culture composition via optogenetic feedback", "doi": "10.1038/s41467-022-32392-z", "paper_url": "https://www.nature.com/articles/s41467-022-32392-z", "year": 2022, "venue": "Nature Communications", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/santkumar/evotron", "code_files": ["ot2/protocol_code/main_protocol.py", "ot2/calibration/get_xyz_location.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "automated sampling from eVOLVER bioreactors into plates", "results_evidence": "Closed-loop optogenetic control held co-culture ratios at setpoints, measured by cytometry/OD from robot-sampled timepoints.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "CC BY paper and a real sampling protocol, but hardware-coupled (custom needle, eVOLVER) and unlicensed, so simulation needs labware stubs.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "formulations-prep-shampoo", "title": "Accelerating Formulation Design via Machine Learning: Generating a High-throughput Shampoo Formulations Dataset", "doi": "10.1038/s41597-024-03573-w", "paper_url": "https://www.nature.com/articles/s41597-024-03573-w", "year": 2024, "venue": "Scientific Data", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/sustainable-processes/formulations-prep", "code_files": ["OpentronsProtocol_FormulationSamples.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "viscous liquid formulation preparation with gravimetric verification", "results_evidence": "Gravimetric analysis of robot-prepared formulations and downstream property measurements form the published dataset.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "CC BY data descriptor plus one OT-2 script; viscous-liquid handling parameters make a good hard variant. Repo unlicensed.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "tape-organoid-barcoding", "title": "Cell-type-specific signaling networks in heterocellular organoids (TOBis barcoding / robotic organoid extraction)", "doi": "10.1038/s41592-020-0737-8", "paper_url": "https://doi.org/10.1038/s41592-020-0737-8", "year": 2020, "venue": "Nature Methods", "open_access_license": "unclear (subscription)", "code_url": "https://github.com/TAPE-Lab/OT-2_Code", "code_files": ["TOBis_Barcoding/Barcode_Production/126_Plex_Production_Protocol.py", "TOBis_Barcoding/Barcode_Aliquoting/126_Plex_Aliquoting/126_Plex_Aliquoting_Barcodes_1_to_96_using_PCR_plates.py", "REPO/REPO_126_plex.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "mass-cytometry barcode production/aliquoting, organoid extraction", "results_evidence": "TOBis barcoded organoids profiled by mass cytometry; signalling networks resolved per cell type.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Seven complete OT-2 protocols, but the paper is subscription-only and the repo has no licence, so paper text must be sourced elsewhere.", "est_tasks": 4, "source_agent": "web", "duplicate_of_existing": null} +{"id": "exposomics-384-flex", "title": "Opentrons Flex 384-well protein-precipitation sample preparation for nontargeted exposomics", "doi": null, "paper_url": "https://github.com/apat594/384wellplate-Exposomics-Opentrons-Protocols", "year": 2025, "venue": "repository only (associated manuscript not located)", "open_access_license": null, "code_url": "https://github.com/apat594/384wellplate-Exposomics-Opentrons-Protocols", "code_files": ["protocols/step1_solvent_addition_and_sample_aliquoting.py", "protocols/step2_dilution_and_supernatant_transfer.py"], "code_license": "MIT", "robot_platform": "flex", "api": "opentrons_v2", "protocol_category": "protein precipitation / dilution in 384-well format for LC-HRMS", "results_evidence": "README reports up to 288 biological samples plus QC per plate feeding multiple LC-HRMS assays, but no peer-reviewed results found.", "wet_lab_validated": false, "readiness": "partial", "readiness_reason": "MIT Flex protocols with custom labware (rare and valuable), but no paper located yet, so the paper->code triple is incomplete.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "exfab-qiaseq-flex", "title": "Automated QIAseq FX DNA Library Preparation on the Opentrons Flex", "doi": "10.17504/protocols.io.n2bvjer3pgk5", "paper_url": "https://dx.doi.org/10.17504/protocols.io.n2bvjer3pgk5", "year": 2025, "venue": "protocols.io (ExFAB Biofoundry)", "open_access_license": "CC BY 4.0 (protocols.io)", "code_url": "https://github.com/exfab/Opentrons_Flex_ExFAB", "code_files": ["QIASeq FX 48x 6_24_25.py"], "code_license": "GPL-3.0", "robot_platform": "flex", "api": "opentrons_v2", "protocol_category": "NGS library preparation (fragmentation, adapter ligation, bead cleanup, PCR)", "results_evidence": "Protocol entry reports libraries prepared for Illumina short-read sequencing of bee gut samples (sequencing-ready yields).", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "A protocols.io DOI with CC BY text is an ideal NL input, GPL-3.0 Flex script matches it one-to-one; Flex coverage is thin in the corpus.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "cayman-his-elisa", "title": "An Opentrons OT-2 workflow for the Cayman His-tag detection ELISA kit", "doi": "10.17504/protocols.io.n92ld4x3nl5b", "paper_url": "https://dx.doi.org/10.17504/protocols.io.n92ld4x3nl5b", "year": 2026, "venue": "protocols.io (Arcadia Science)", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/Arcadia-Science/cayman-his-elisa-opentrons-workflow", "code_files": ["scripts/ot2_p1000single_elisa_sample_loading_final.py", "scripts/ot2_p300multi_elisa_wash_substrate.py", "scripts/ot2_p1000single_elisa_sample_loading_waste_chute.py", "tests/ot2_tip_drop_waste_chute_test.py"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "ELISA sample/standard loading, plate washing, substrate addition", "results_evidence": "Standard curves and His-tag quantification generated from the automated ELISA runs in the Arcadia protocol record.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "CC BY protocols.io text, MIT scripts including a hardware test; a clean easy/hard pair (loading vs wash+substrate).", "est_tasks": 4, "source_agent": "web", "duplicate_of_existing": null} +{"id": "cfrna-pipeline", "title": "An inexpensive semi-automated sample processing pipeline for cell-free RNA (extraction)", "doi": "10.1038/s41596-023-00855-2", "paper_url": "https://doi.org/10.1038/s41596-023-00855-2", "year": 2023, "venue": "Nature Protocols (preprint: 10.1101/2020.08.18.256545)", "open_access_license": "preprint CC BY-NC-ND 4.0; journal version subscription", "code_url": "https://github.com/miramou/cfRNA_pipeline_automation", "code_files": ["Opentrons/scripts/48_format/1_add_slurry_lysis_to_plate.py", "Opentrons/scripts/48_format/3_transfer_etoh_centrifuge_remove_sup_add_etoh.py", "Opentrons/scripts/48_format/5_norgen_add_wash_buffer_elute.py", "Opentrons/scripts/48_format/6_zymo_clean_conc.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "cell-free RNA extraction and cleanup", "results_evidence": "RNA yields and sequencing library quality from the semi-automated pipeline compared with manual extraction.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Six numbered OT-2 steps (good task series) but code is unlicensed and the open text is the earlier preprint, not the Nature Protocols version.", "est_tasks": 5, "source_agent": "web", "duplicate_of_existing": null} +{"id": "plant-phenotyping-ot2", "title": "Automated Discovery of Multicellular Behavior for Optimized Plant Growth and Climate Resilience", "doi": "10.1002/aisy.202500624", "paper_url": "https://doi.org/10.1002/aisy.202500624", "year": 2026, "venue": "Advanced Intelligent Systems", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/Synthetic-Automated-Systems/automated_phenotyping_system", "code_files": ["Code/OT2Code.py", "Code/OT2Code-FillPlates.py"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "plate filling and treatment dosing for plant phenotyping", "results_evidence": "Automated phenotyping screen measured growth responses used to select stress-resilient conditions.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "CC BY paper and MIT scripts; two scripts give an easy (fill plates) and harder (full protocol) pair.", "est_tasks": 3, "source_agent": "web", "duplicate_of_existing": null} +{"id": "imperial-colony-picker", "title": "Automated colony picker add-on for the OT-2 (Imperial SSB MRes; cited by Slowpoke)", "doi": null, "paper_url": "https://github.com/Imperial-Opentrons-Users/automated-colony-picker", "year": 2022, "venue": "project report / cited in ACS Synth Biol 2026", "open_access_license": null, "code_url": "https://github.com/Imperial-Opentrons-Users/automated-colony-picker", "code_files": ["Client/colony_pcr_reagent_prep_protocol.py", "Client/colony_pcr_resuspension_protocol.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "colony PCR reagent prep and colony resuspension", "results_evidence": "Vision-guided colony picking demonstrated on OT-2; results reported only in the project write-up and via the Slowpoke citation.", "wet_lab_validated": false, "readiness": "partial", "readiness_reason": "Two clean OT-2 scripts closely related to the existing colony-PCR tasks, but no standalone peer-reviewed paper and no licence.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "spot-assay-ot2", "title": "Automated yeast spot assay on Opentrons OT-2 (bioinfo-tsukuba)", "doi": null, "paper_url": "https://github.com/bioinfo-tsukuba/ot2_spot_assay", "year": 2024, "venue": "repository (paper referenced in README, not yet identified)", "open_access_license": null, "code_url": "https://github.com/bioinfo-tsukuba/ot2_spot_assay", "code_files": ["ot2_execute/compiler/compile_predispense.py", "ot2_execute/compiler/compile_after_plate_reader.py", "ot2_execute/compiler/compile_after_plate_reader_for_paper.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "serial dilution and spotting with plate-reader feedback", "results_evidence": "README states the workflow executes automatic spot assays with Byonoy absorbance readings feeding the dispensing plan.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Protocols are generated by compilers rather than being standalone .py, and the paper is unidentified; same lab as the existing pipetting-speed-ot2 source.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "msd-biochemical-assays", "title": "Opentrons OT-2 biochemical assay scripts (Merck/MSD, Bradford and PicoGreen standard curves)", "doi": null, "paper_url": "https://github.com/MSDLLCpapers/Opentrons-OT2-BioChemical-Assays", "year": 2023, "venue": "company \"papers\" repo (associated publication not located)", "open_access_license": null, "code_url": "https://github.com/MSDLLCpapers/Opentrons-OT2-BioChemical-Assays", "code_files": ["Bradford_standard_curve.py", "PicoGreen_standard_curve_YW_validated.py"], "code_license": "Apache-2.0", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "standard-curve assays (Bradford protein, PicoGreen dsDNA)", "results_evidence": "Filename and README indicate a validated PicoGreen standard curve run on the OT-2; no published figures located.", "wet_lab_validated": false, "readiness": "partial", "readiness_reason": "Apache-2.0 and simple enough to simulate immediately, but no linked paper or reported results, so it fails the triple requirement.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "llm-rdf-synthesis", "title": "An automatic end-to-end chemical synthesis development platform powered by large language models", "doi": "10.1038/s41467-024-54457-x", "paper_url": "https://www.nature.com/articles/s41467-024-54457-x", "year": 2024, "venue": "Nature Communications", "open_access_license": "CC BY-NC-ND 4.0", "code_url": "https://github.com/Ruan-Yixiang/LLM-RDF", "code_files": ["Backend Files/backend/input_screen.py"], "code_license": "MIT (per README badge)", "robot_platform": "other", "api": "other", "protocol_category": "LLM-driven reaction development and robotic execution", "results_evidence": "End-to-end synthesis campaigns executed with reported yields and optimised conditions.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Strong paper+code pairing but the robot layer is not Opentrons/PLR, so it is more a comparison system than a task source.", "est_tasks": 1, "source_agent": "web", "duplicate_of_existing": null} +{"id": "icfree-cfps", "title": "An AI-driven workflow for the accelerated optimization of cell-free protein synthesis", "doi": "10.1016/j.isci.2025.113599", "paper_url": "https://doi.org/10.1016/j.isci.2025.113599", "year": 2025, "venue": "iScience", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/brsynth/icfree-ml", "code_files": ["(no Opentrons protocol .py; generates Echo/liquid-handler instruction CSVs)"], "code_license": "MIT", "robot_platform": "other", "api": "other", "protocol_category": "cell-free reaction composition DoE and instruction generation", "results_evidence": "Iterative ML rounds improved cell-free protein yields measured on plate reader across generated compositions.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Open paper and MIT code, but the output is an instruction CSV for an acoustic dispenser, so a task would need a translation layer rather than an Opentrons script.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "myra-cfe-platform", "title": "A liquid handling platform for standardized quantification of cell-free enzymatic activity", "doi": "10.1093/synbio/ysag010", "paper_url": "https://academic.oup.com/synbio/article/doi/10.1093/synbio/ysag010", "year": 2026, "venue": "Synthetic Biology (OUP)", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/Mo42-mb/Myra_automation", "code_files": ["(R script generates python for BMS Myra; no Opentrons protocol)"], "code_license": "none", "robot_platform": "other", "api": "other", "protocol_category": "cell-free enzymatic activity assay setup", "results_evidence": "Standardised enzymatic activity quantification reproducible across operators/platforms reported in the paper.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "CC BY paper with generated-protocol code for a BMS Myra; useful for cross-platform generalisation tasks but not directly simulatable.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "duckbot-jubilee", "title": "The Duckbot: A system for automated imaging and manipulation of duckweed", "doi": "10.1371/journal.pone.0296717", "paper_url": "https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0296717", "year": 2024, "venue": "PLOS ONE", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/machineagency/duckbot", "code_files": ["(Jupyter notebooks driving science_jubilee; no Opentrons .py)"], "code_license": "MIT", "robot_platform": "other", "api": "other", "protocol_category": "duckweed plate manipulation, media exchange, imaging", "results_evidence": "Automated growth assays measured duckweed area/growth across treatments.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Open paper and MIT code, but the Jubilee/science_jubilee API is a third platform; valuable for platform breadth, needs a new runner.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "helleckes-catib-screening", "title": "High-throughput screening of catalytically active inclusion bodies using laboratory automation and Bayesian optimization", "doi": "10.1186/s12934-024-02319-y", "paper_url": "https://doi.org/10.1186/s12934-024-02319-y", "year": 2024, "venue": "Microbial Cell Factories", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/JuBiotech/Supplement-to-Helleckes-Kuesters-et-al.-2023", "code_files": ["(analysis-only python: catibts/models.py, catibts/parsing.py; robot methods not in repo)"], "code_license": "GPL-3.0", "robot_platform": "other", "api": "other", "protocol_category": "automated CatIB expression screening with Bayesian optimisation", "results_evidence": "Screening campaign identified improved CatIB variants with activity measurements across rounds.", "wet_lab_validated": true, "readiness": "no", "readiness_reason": "Repo holds analysis code and raw data only; the liquid-handler methods (Tecan/Hamilton) are not published as Python.", "est_tasks": 0, "source_agent": "web", "duplicate_of_existing": null} +{"id": "proteoautonet", "title": "ProteoAutoNet: high-throughput co-eluted protein analysis with robotics and machine learning", "doi": "10.1038/s41467-026-68484-3", "paper_url": "https://doi.org/10.1038/s41467-026-68484-3", "year": 2026, "venue": "Nature Communications", "open_access_license": "CC BY 4.0 (to confirm)", "code_url": "https://github.com/guomics-lab/ProteoAutoNet", "code_files": ["(11 analysis python files; no liquid-handler protocol script found)"], "code_license": "none", "robot_platform": "other", "api": "other", "protocol_category": "automated proteomics sample handling + ML analysis", "results_evidence": "Co-elution networks derived from robot-processed samples validated against known complexes.", "wet_lab_validated": true, "readiness": "no", "readiness_reason": "Only ML/analysis code is released; no robot protocol code.", "est_tasks": 0, "source_agent": "web", "duplicate_of_existing": null} +{"id": "polymerization-planner", "title": "Automation-Assisted Photoinduced Atom Transfer Radical Polymerization", "doi": "10.1021/acspolymersau.5c00067", "paper_url": "https://doi.org/10.1021/acspolymersau.5c00067", "year": 2026, "venue": "ACS Polymers Au", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/GormleyLab/polymerization_planner", "code_files": ["polymerization_planner/runner.py", "polymerization_planner/atrp/calculator.py", "polymerization_planner/pet_raft/calculator.py"], "code_license": "MIT", "robot_platform": "other", "api": "other", "protocol_category": "polymerisation recipe planning for automated dispensing", "results_evidence": "Polymerisations run from planner recipes characterised by GPC (conversion, dispersity).", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Open paper and MIT code, but the package only computes recipes; the dispensing layer (custom handler) is separate.", "est_tasks": 1, "source_agent": "web", "duplicate_of_existing": null} +{"id": "sdl-guide-gormley", "title": "A user's guide to your first self-driving liquid handling lab", "doi": "10.1039/d5dd00525f", "paper_url": "https://pubs.rsc.org/en/content/articlehtml/2026/dd/d5dd00525f", "year": 2026, "venue": "Digital Discovery", "open_access_license": "CC BY 3.0", "code_url": "https://github.com/GormleyLab/SDLGuide", "code_files": ["(GUI/driver python for ACRO + Integra pipette; no Opentrons protocol)"], "code_license": "MIT", "robot_platform": "other", "api": "other", "protocol_category": "self-driving lab enzyme assay optimisation", "results_evidence": "Closed-loop campaign optimised enzyme assay conditions with plate-reader readouts.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Great tutorial-style open text and MIT code, but a bespoke handler API; useful as a non-Opentrons generalisation target.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "pipette-show", "title": "Pipette Show: An Open Source Web Application to Support Pipetting into Microplates", "doi": "10.1021/acssynbio.1c00494", "paper_url": "https://pubs.acs.org/doi/10.1021/acssynbio.1c00494", "year": 2022, "venue": "ACS Synthetic Biology", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/Global-Biofoundries-Alliance/pipette-show", "code_files": ["(web app; no robot protocol .py)"], "code_license": "MIT", "robot_platform": "other", "api": "other", "protocol_category": "manual pipetting guidance", "results_evidence": "Error rates for manual plate filling with vs without the app.", "wet_lab_validated": true, "readiness": "no", "readiness_reason": "No robot code; manual-pipetting aid only.", "est_tasks": 0, "source_agent": "web", "duplicate_of_existing": null} +{"id": "opentrons-accs-dup", "title": "Open-source cell culture automation system with integrated cell counting for passaging microplate cultures", "doi": "10.1093/pnasnexus/pgaf385", "paper_url": "https://doi.org/10.1093/pnasnexus/pgaf385", "year": 2025, "venue": "PNAS Nexus", "open_access_license": "CC BY-NC-ND 4.0", "code_url": "https://github.com/czbiohub-sf/accs-protocol-software-pub", "code_files": ["cal_dummy_scripts/cal_cell_splitting.py", "cal_dummy_scripts/cal_96to8x12.py", "accs-protocols/accs_npf/resources/sim_proxy_script/run.py"], "code_license": "BSD-3-Clause", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "cell culture passaging / cell counting", "results_evidence": "Automated passaging maintained cell cultures over weeks with counting accuracy benchmarked against manual counts.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Already in the corpus as opencell-automation, but this second BSD-3 repo (protocol framework, calibration scripts, simulation proxy) was not ingested and could yield runnable tasks.", "duplicate_of_existing": "opencell-automation", "est_tasks": 3, "source_agent": "web"} +{"id": "moeller-library-dup", "title": "Moeller Lab Opentrons protocol library (Zymo magbead extraction, Hackflex, Quantifluor)", "doi": "10.1186/s13059-022-02777-w", "paper_url": "https://doi.org/10.1186/s13059-022-02777-w", "year": 2022, "venue": "Genome Biology", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/tanaes/Moeller_Opentrons_protocol_library", "code_files": ["Extraction/Zymo_fecal-soil_magbead/Zymo_fecal-soil_magbead_B-extraction.py", "Library_Prep/Hackflex/hackflex.py", "Quantification/Quantifluor_DNA_quant/Quantifluor_DNA_four-plates.py", "Transfers/tubes_to_96well.py"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "magnetic-bead DNA extraction, Hackflex library prep, DNA quantification", "results_evidence": "Hackflex libraries and extractions benchmarked by sequencing yield/quality in the companion paper.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "MIT library with nine OT-2 scripts beyond the Hackflex one already tracked; extraction and quantification protocols are new task material.", "duplicate_of_existing": "moeller-hackflex", "est_tasks": 5, "source_agent": "web"} +{"id": "maggielam-digestion-dup", "title": "Shotgun proteomics sample processing automated by an open-source lab robot (standard digestion scripts)", "doi": "10.3791/63092", "paper_url": "https://www.jove.com/t/63092", "year": 2021, "venue": "JoVE", "open_access_license": "unclear (JoVE subscription)", "code_url": "https://github.com/MaggieLam-Lab/StandardDigestion-Opentrons", "code_files": ["digestion_scripts/SP3_digestion.py", "digestion_scripts/NoSP3_digestion.py", "digestion_scripts/SP3_peptide_cleanup.py", "misc_scripts/BCA_protocol.py"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "proteomics digestion, SP3 cleanup, BCA assay", "results_evidence": "Peptide identifications/CVs for automated vs manual digestion reported in the JoVE article.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Already represented by shotgun-proteomics-jove; MIT scripts are usable but the JoVE text is not open.", "duplicate_of_existing": "shotgun-proteomics-jove", "est_tasks": 3, "source_agent": "web"} +{"id": "apex-guide-dup", "title": "Opentrons OT-2 Automated Protein Expression and Purification Guide (APEX companion repo)", "doi": "10.1021/acssynbio.5c00189", "paper_url": "https://pubs.acs.org/doi/10.1021/acssynbio.5c00189", "year": 2025, "venue": "ACS Synthetic Biology", "open_access_license": "unclear (journal version)", "code_url": "https://github.com/btx11/opentrons-apex-protein-guide", "code_files": ["(guide/reimplementation of APEX OT-2 steps)"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "protein expression and purification", "results_evidence": "APEX validated by expressing and purifying proteins with yields reported in the paper.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Duplicate of the existing apex source; note that the journal version (ACS Synth Biol 2025) is newer than the bioRxiv entry on file.", "duplicate_of_existing": "apex", "est_tasks": 0, "source_agent": "web"} +{"id": "opensampler-dup", "title": "Modification of a low-cost pipetting robot for nanoliter liquid handling and autosampling for LC-MS", "doi": "10.1002/jssc.70379", "paper_url": "https://doi.org/10.1002/jssc.70379", "year": 2026, "venue": "Journal of Separation Science", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/RTKlab-BYU/OpenSampler", "code_files": ["(OpenSampler/OpenLC control python)"], "code_license": "none", "robot_platform": "other", "api": "other", "protocol_category": "nanoliter autosampling for LC-MS", "results_evidence": "Injection precision and chromatographic performance measured for the modified robot.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Already tracked as pipetting-robot-nanoliter; control software is not an Opentrons protocol.", "duplicate_of_existing": "pipetting-robot-nanoliter", "est_tasks": 0, "source_agent": "web"} +{"id": "proxy-viscometer-dup", "title": "Opentrons for automated and high-throughput viscometry (supplementary protocol files)", "doi": "10.1039/d2dd00126h", "paper_url": "https://doi.org/10.1039/d2dd00126h", "year": 2023, "venue": "Digital Discovery", "open_access_license": "CC BY 4.0", "code_url": "https://github.com/Kedar-Materials-by-Design-Lab/Opentrons-ProxyViscometer", "code_files": ["(protocol files for proxy viscometer; see also beatricesoh/OTProxyViscometer)"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "viscosity measurement by timed aspiration", "results_evidence": "Measured viscosities correlated with reference rheometer values.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Duplicate of proxy-viscometer; a second mirror repo (beatricesoh/OTProxyViscometer) exists with the same content.", "duplicate_of_existing": "proxy-viscometer", "est_tasks": 0, "source_agent": "web"} +{"id": "uc2-platereader-dup", "title": "UC2 Opentrons imaging unit / automated immunostaining (OT-2 + UC2 microscope)", "doi": null, "paper_url": "https://www.protocols.io/view/uc2-automated-immunostaining-protocol-using-the-op-bw8dphs6", "year": 2022, "venue": "protocols.io + openUC2 docs", "open_access_license": "CC BY 4.0 (protocols.io)", "code_url": "https://github.com/beniroquai/Opentrons-Microscope-Platereader", "code_files": ["IMJOY/main_opentrons.py"], "code_license": "NOASSERTION", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "automated immunostaining with in-situ imaging", "results_evidence": "Immunostained plates imaged on the UC2 microscope with staining quality shown in the protocol record.", "wet_lab_validated": true, "readiness": "partial", "readiness_reason": "Already covered by uc2-hi2; the protocols.io immunostaining entry is a CC BY NL source that could still be paired with the control script.", "duplicate_of_existing": "uc2-hi2", "est_tasks": 2, "source_agent": "web"} +{"id": "biomationscripter", "title": "BiomationScripter: Python library for scripting bio-automation protocols", "doi": null, "paper_url": "https://biomationscripterlib.readthedocs.io", "year": 2022, "venue": "software (associated paper not located)", "open_access_license": null, "code_url": "https://github.com/intbio-ncl/BiomationScripterLib", "code_files": ["BiomationScripter/OTProto/*.py (20 Opentrons-aware files incl. labware test protocols)"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "protocol-generation library (templates for PCR, dilution, transformation)", "results_evidence": "No wet-lab results tied to a publication found.", "wet_lab_validated": false, "readiness": "partial", "readiness_reason": "MIT library whose OTProto templates could seed tasks, but no paper and protocols are generated rather than literal scripts.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "dtu-synbio-automation", "title": "DTU Synbio lab automation protocol collection", "doi": null, "paper_url": "https://github.com/DALSA-Lab/dtu_synbio_lab_automation", "year": 2025, "venue": "repository only", "open_access_license": null, "code_url": "https://github.com/DALSA-Lab/dtu_synbio_lab_automation", "code_files": ["protocols/opentrons/library_examples/*.py", "protocols/opentrons/Course_Introduction_to_automation/*.py"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "teaching/library protocols (agar plating, liquid-class optimisation, parameterised transfers)", "results_evidence": "No published results; teaching and internal-use repository.", "wet_lab_validated": false, "readiness": "partial", "readiness_reason": "MIT and clean enough to simulate, and useful as extra solution exemplars, but no paper so it is not a triple.", "est_tasks": 0, "source_agent": "web", "duplicate_of_existing": null} +{"id": "damplab-sars-assay", "title": "DAMP Lab OT-2 diagnostic assay scripts (bead-based RNA extraction + multiplex RT-qPCR setup)", "doi": null, "paper_url": "https://github.com/DAMPLAB/OT2-SARS-CoV2", "year": 2020, "venue": "repository only", "open_access_license": null, "code_url": "https://github.com/DAMPLAB/OT2-SARS-CoV2", "code_files": ["rna_extraction_magmax/rna_extraction_magmax.py", "qPCR_taqpath_multiplex/qPCR_taqpath_multiplex.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "magnetic-bead nucleic acid extraction, qPCR plate setup", "results_evidence": "No peer-reviewed results in the repo; kit instructions are the reference.", "wet_lab_validated": false, "readiness": "partial", "readiness_reason": "Two complete scripts in a protocol family already represented by covid19clinic/hulp sources, but no paper and no licence.", "est_tasks": 0, "source_agent": "web", "duplicate_of_existing": null} +{"id": "newcastle-neg-opentrons", "title": "Newcastle Network Ecology Group OT-2 protocol and labware collection", "doi": null, "paper_url": "https://github.com/NewcastleUni-NetworkEcologyGroup/Opentrons", "year": 2022, "venue": "repository only", "open_access_license": null, "code_url": "https://github.com/NewcastleUni-NetworkEcologyGroup/Opentrons", "code_files": ["Labware/api_v2/test_*.py", "Protocols/*.py (51 Opentrons-aware files; mix of API v1 and v2)"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v1", "protocol_category": "mixed lab protocols and custom labware definitions", "results_evidence": "No linked publication found.", "wet_lab_validated": false, "readiness": "no", "readiness_reason": "No paper, unlicensed, and many scripts are API v1 labware tests.", "est_tasks": 0, "source_agent": "web", "duplicate_of_existing": null} +{"id": "endylab-opentrons", "title": "Endy Lab Opentrons protocol collection", "doi": null, "paper_url": "https://github.com/EndyLab/opentrons", "year": 2018, "venue": "repository only", "open_access_license": null, "code_url": "https://github.com/EndyLab/opentrons", "code_files": ["protocols/OT2/pcr.py", "protocols/OT2/primer-dilute.py", "protocols/dilution-series.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v1", "protocol_category": "PCR setup, dilution series, calibration", "results_evidence": "No linked publication.", "wet_lab_validated": false, "readiness": "no", "readiness_reason": "Mostly legacy API v1, no paper, no licence.", "est_tasks": 0, "source_agent": "web", "duplicate_of_existing": null} +{"id": "xchem-opentrons", "title": "XChem Opentrons reaction liquid-handling toolkit", "doi": null, "paper_url": "https://github.com/xchem/opentrons", "year": 2019, "venue": "repository only (XChem crystallography pipeline papers do not release these scripts)", "open_access_license": null, "code_url": "https://github.com/xchem/opentrons", "code_files": ["examples/**/*.py (60 Opentrons-aware files, API v1 era)"], "code_license": "Apache-2.0", "robot_platform": "ot2", "api": "opentrons_v1", "protocol_category": "reaction dispensing arrays for crystallographic screening", "results_evidence": "No single paper ties these scripts to reported results.", "wet_lab_validated": false, "readiness": "no", "readiness_reason": "Apache-2.0 but API v1 generated scripts and no paper pairing.", "est_tasks": 0, "source_agent": "web", "duplicate_of_existing": null} +{"id": "pozzo-ot2-doe", "title": "Pozzo group OT-2 design-of-experiments protocols", "doi": null, "paper_url": "https://github.com/pozzo-research-group/OT2Protocols", "year": 2021, "venue": "repository only (group has related SDL papers)", "open_access_license": null, "code_url": "https://github.com/pozzo-research-group/OT2Protocols", "code_files": ["ot2protocol/app_protocols/DES_combined_protocol.py", "PlanPrepareProcess_OT2/Modules/OT2Commands.py"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "formulation DoE sample preparation", "results_evidence": "Results appear in separate group publications, not this repo.", "wet_lab_validated": false, "readiness": "partial", "readiness_reason": "MIT and simulatable, but the paper pairing must be established before it is a triple.", "est_tasks": 1, "source_agent": "web", "duplicate_of_existing": null} +{"id": "myrplate-flex-casting", "title": "myrPlate engineered connective tissue casting on Opentrons Flex", "doi": null, "paper_url": "https://github.com/Hosseinat11502/MyrplateTissueCasting-8channel1mltip-Version-15", "year": 2025, "venue": "repository only", "open_access_license": null, "code_url": "https://github.com/Hosseinat11502/MyrplateTissueCasting-8channel1mltip-Version-15", "code_files": ["myrPlate_tissue_casting_8Ch1ml_Fast_V15-ECTsFinal.py", "myrPlate-V15(aspiration).py", "myrPlate-V15(dispensing).py"], "code_license": "MIT", "robot_platform": "flex", "api": "opentrons_v2", "protocol_category": "collagen/cell suspension casting into 48-well tissue plates", "results_evidence": "README describes casting engineered connective tissues; no publication located.", "wet_lab_validated": false, "readiness": "partial", "readiness_reason": "MIT Flex scripts with viscous cell-laden gel handling (valuable hard task) but no paper yet.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "flex-genomics-di-omics", "title": "Opentrons Flex whole-genome / methylation / TIP-seq workflows (di-omics)", "doi": null, "paper_url": "https://github.com/di-omics/ot-flex-automation", "year": 2026, "venue": "repository only", "open_access_license": null, "code_url": "https://github.com/di-omics/ot-flex-automation", "code_files": ["protocols/whole_genome_seq_flex.py", "protocols/methylation_sequencing_flex.py", "protocols/tipseq_epigenome_flex.py", "bench/wgs_preparation_water_test_flex.py"], "code_license": "none", "robot_platform": "flex", "api": "opentrons_v2", "protocol_category": "NGS library prep on Flex with off-deck handoffs", "results_evidence": "README tracks validation status per protocol but no publication.", "wet_lab_validated": false, "readiness": "partial", "readiness_reason": "Rich Flex protocol set with explicit validation status, but unlicensed and unpublished.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "kedar-balance-integration", "title": "Opentrons OT-2 mass-balance integration (application note supplement)", "doi": null, "paper_url": "https://github.com/Kedar-Materials-by-Design-Lab/opentrons-balance", "year": 2022, "venue": "Opentrons application note", "open_access_license": null, "code_url": "https://github.com/Kedar-Materials-by-Design-Lab/opentrons-balance", "code_files": ["OT-2_BalanceAutomation.ipynb (notebook, no .py)"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "gravimetric calibration with external balance", "results_evidence": "Gravimetric accuracy of dispensed volumes reported in the application note.", "wet_lab_validated": true, "readiness": "no", "readiness_reason": "Notebook-only, external-hardware dependent, no peer-reviewed paper.", "est_tasks": 0, "source_agent": "web", "duplicate_of_existing": null} +{"id": "retro-10x-scrnaseq", "title": "OT-2 10x scRNA-seq library prep with multiplexing (Retro Biosciences)", "doi": null, "paper_url": "https://github.com/retrobiosciences/opentrons-10x", "year": 2023, "venue": "repository only", "open_access_license": null, "code_url": "https://github.com/retrobiosciences/opentrons-10x", "code_files": ["multi_8sample.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "single-cell library prep with magnetic bead steps", "results_evidence": "README warns the protocol is difficult to run reliably; no published results.", "wet_lab_validated": false, "readiness": "no", "readiness_reason": "No paper, no licence, and the authors flag reliability problems.", "est_tasks": 0, "source_agent": "web", "duplicate_of_existing": null} +{"id": "sp3-magbead-protocol-repo", "title": "Automated magnetic bead-based digestion protocols for Opentrons OT-2 (proteomics CNB-CBM)", "doi": null, "paper_url": "https://github.com/proteomicscnbcbm/SP3-Magnetic-Beads-Digestion-Protocol", "year": 2025, "venue": "repository only", "open_access_license": null, "code_url": "https://github.com/proteomicscnbcbm/SP3-Magnetic-Beads-Digestion-Protocol", "code_files": ["(no .py in repo; protocol documentation only)"], "code_license": "MIT", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "SP3 bead digestion", "results_evidence": "None published.", "wet_lab_validated": false, "readiness": "no", "readiness_reason": "No Python protocol files present despite the MIT licence and OT-2 framing.", "est_tasks": 0, "source_agent": "web", "duplicate_of_existing": null} +{"id": "worm-food-preference", "title": "C. elegans food preference protocol (bacteria and worm spotting on OT-2)", "doi": "10.1242/jeb.01955", "paper_url": "https://github.com/slhogle/c_elegans_food_preference_protocol", "year": 2023, "venue": "repository (protocol adapted from J Exp Biol 2006)", "open_access_license": "source paper subscription", "code_url": "https://github.com/slhogle/c_elegans_food_preference_protocol", "code_files": ["02_spot_bacteria.py", "03_spot_worms.py"], "code_license": "GPL-3.0", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "spotting bacteria and worms onto agar plates", "results_evidence": "Protocol reproduces a published behavioural assay; no new results in the repo.", "wet_lab_validated": false, "readiness": "partial", "readiness_reason": "GPL-3.0 and two tidy scripts; the referenced paper predates the automation, so the triple is weak.", "est_tasks": 2, "source_agent": "web", "duplicate_of_existing": null} +{"id": "ant-cloning", "title": "Automated cloning by natural transformation (ANT) OT-2 workflow", "doi": "10.1021/acssynbio.0c00240", "paper_url": "https://pubs.acs.org/doi/10.1021/acssynbio.0c00240", "year": 2020, "venue": "ACS Synthetic Biology", "open_access_license": "unclear (journal)", "code_url": "https://github.com/ljm176/ANTCloning", "code_files": ["Step 1_PCRSetup.py", "Step 2_Dilution and Digestion.py", "Step 3_OEPCR.py", "Step 4_Transformation.py", "Step 5_Plating.py"], "code_license": "none", "robot_platform": "ot2", "api": "opentrons_v2", "protocol_category": "PCR, digestion, overlap-extension PCR, natural transformation, plating", "results_evidence": "Cloning efficiency and correct-assembly rates for automated natural transformation reported in the paper.", "wet_lab_validated": true, "readiness": "ready", "readiness_reason": "Five numbered end-to-end scripts explicitly tied to a named publication; repo unlicensed and the ACS text may need an author copy.", "est_tasks": 6, "source_agent": "web", "duplicate_of_existing": null} +{"id": "opentrons-physicalai-hf", "title": "Opentrons/PhysicalAI (Hugging Face dataset of Flex teleoperation episodes)", "doi": null, "paper_url": "https://huggingface.co/datasets/Opentrons/PhysicalAI", "year": 2026, "venue": "Hugging Face dataset (Opentrons)", "open_access_license": "unstated on dataset card", "code_url": "https://huggingface.co/datasets/Opentrons/PhysicalAI", "code_files": ["(HDF5 episodes + GIFs, e.g. flex_to_biotek/inference/*.hdf5; no protocol .py)"], "code_license": "unstated", "robot_platform": "flex", "api": "other", "protocol_category": "Flex plate-handoff manipulation episodes (imitation learning data)", "results_evidence": "Inference session summaries record on-robot execution of plate handoffs to a BioTek reader.", "wet_lab_validated": true, "readiness": "no", "readiness_reason": "No protocol code or paper; relevant as embodiment data rather than a paper->code task, and the licence is unstated.", "est_tasks": 0, "source_agent": "web", "duplicate_of_existing": null} diff --git a/research/expansion/web_notes.md b/research/expansion/web_notes.md new file mode 100644 index 0000000..ff02778 --- /dev/null +++ b/research/expansion/web_notes.md @@ -0,0 +1,107 @@ +# Web expansion sweep — notes (source_agent: web, 2026-10-11/12) + +Goal: find new (paper, public robot code, reported wet-lab results) triples for Text2WetLab, deduplicated +against the 48 papers in `docs/task-sources.md` and the folders under `sources/`. + +## Searches run + +Literature indexes +- Europe PMC REST search: `("opentrons" OR "pylabrobot" OR "pyhamilton") AND ("github.com" OR "zenodo")` + → 251 records (2016–2026); full-text XML pulled for 204 of them, then GitHub/Zenodo links and + Opentrons-mention counts extracted per paper (ranked table in the scratch run; top ~120 inspected by hand). +- Crossref `query.bibliographic` lookups to resolve DOIs, venues and licences for 15 titles found only + via repo READMEs (halogenation platform, MassSpecPreppy, C. glutamicum autoclone, Culturomics, + esterification library, plant phenotyping, LAP format, enzyme-discovery pipeline, ELISA protocols.io entry, …). +- Targeted web searches: Opentrons/Flex protocol papers 2023–2026; PyLabRobot/Hamilton validated protocols; + SLAS Technology / HardwareX / ACS Synth Biol / PLOS ONE Opentrons code-availability statements; + self-driving-lab + OT-2 + Bayesian optimisation; protocol-to-code benchmarks and datasets. + (Web-search quota was exhausted late in the run; Crossref + Europe PMC + GitHub APIs covered the rest.) + +Code indexes +- GitHub code search (`search/code`) for `apiLevel` co-occurring with doi / biorxiv / "et al" / + publication / cite, plus `opentrons doi.org`, `pylabrobot doi`, `protocol_api zenodo` → 245 hits, mostly noise, + ~15 usable repos. +- GitHub repo search: `topic:opentrons`, `topic:opentrons-ot2`, `topic:liquid-handling`, `topic:opentrons-flex`, + name/readme searches for opentrons+paper/manuscript/biorxiv/zenodo → 398 + 469 rows, filtered to ~70 relevant repos. +- Hugging Face dataset API searches: opentrons, protocol-code, lab automation, pylabrobot, bioprot, + protocolqa, labbench, bioplanner, "wet lab protocol". + +Verification (per candidate repo): `gh api repos/OWNER/REPO` for existence/licence/default branch, +`git/trees/?recursive=1` for the full file list, and raw content checks on up to 60 `.py` files for +`from opentrons` / `import opentrons` / `apiLevel` / `protocol_api` / `pylabrobot`. ~45 repos were verified this +way (a GitHub secondary rate limit forced the last five to be checked via the unauthenticated API). + +## Counts + +| | | +|---|---| +| Candidates screened and recorded | 60 | +| Repos verified to exist (API) | 45 (all 45 existed; 0 dead links) | +| Repos with confirmed Opentrons/PLR `.py` (import or `apiLevel`) | 31 | +| readiness = ready | 21 | +| readiness = partial | 29 | +| readiness = no | 10 | +| New (not in the 48-paper corpus) | 52 | +| Marked `duplicate_of_existing` | 8 (opencell-automation, moeller-hackflex, shotgun-proteomics-jove, apex, pipetting-robot-nanoliter, proxy-viscometer, uc2-hi2, lap-transposon-genotyping) | +| Sum of `est_tasks` | 159 (≈118 from the `ready` + strong `partial` rows) | +| Platform mix | ot2 40, flex 4, other 16 (Jubilee, ACRO/Integra, BMS Myra, acoustic dispenser, analysis-only) | + +Licence notes: 13 candidate repos carry a permissive licence (MIT/Apache-2.0/BSD-3), 4 are copyleft +(GPL-3.0, AGPL-3.0), and 21 have no licence file at all (reference-only, cannot be vendored — same constraint +the corpus already applies to APEX and HULP). Paper licences: 24 of the new candidates are CC BY or CC BY-NC, +8 are CC BY-NC-ND (link-only), and 6 are subscription/unclear. + +## Existing datasets/benchmarks we could absorb or compare against + +| Dataset / benchmark | Content & size | Robot code? | Licence | +|---|---|---|---| +| **BioProBench** (arXiv 2505.07889, ICML 2026; `github.com/YuyangSunshine/bioprobench`, HF `BioProBench`) | 22,413 human-written protocols → 523,784 task instances across 5 tasks (QA, step ordering, error correction, generation, reasoning) | No — natural-language protocol reasoning only | CC BY-NC 4.0 (repo shows NOASSERTION) | +| **BioProt / BioPlanner** (EMNLP 2023, arXiv 2310.10632; `github.com/bioplanner/bioplanner`) | 100 protocols.io protocols with pseudocode + function-library annotations; 5 python eval/prompt files | Pseudocode, not robot API code | no LICENSE file in repo | +| **LAB-Bench** (`futurehouse/lab-bench`) | 1,967 items total; relevant subsets ProtocolQA 108, CloningScenarios 33 | No | CC BY-SA 4.0 | +| **LAB-Bench 2** (`EdisonScientific/labbench2`, arXiv 2604.09554) | successor set incl. `protocolqa2` config (size endpoint unavailable at time of check) | No | CC BY-SA 4.0 | +| **AEGIS** (arXiv 2607.15620) | 24 OT-2 protocols across 5 assay families, plus validation benchmark and monitoring model weights; live OT-2 demo | Yes — OT-2 Python protocols, stated MIT | MIT (per paper; repo URL not given in the abstract page) | +| **ProtoPilot** (arXiv 2606.31763) | 294 tasks derived from 98 gold-standard protocols; reports Opentrons code-gate pass rates (88.2% vs 32.4% baseline) and wet-lab checks | Generated Opentrons code; release not stated | not stated | +| **ProtoAct / BioP2E** (arXiv 2608.01690) | 22 cell-culture protocols → 258 monitoring conditions, 910 executable subtasks, 962 grounded action calls | Embodied action calls (manipulator), not liquid-handler Python | not stated | +| **ProtoCode** (SLAS Technology 29(3), 2024) | LLM pipeline turning published PCR protocols into machine-readable thermocycler files; web server only, no dataset dump | Thermocycler files, not Opentrons | web service, licence unstated | +| **BioCoder** (arXiv 2308.16458) | 2,269 bioinformatics coding problems | No robot code | open (repo) | +| **Opentrons/PhysicalAI** (HF) | Flex teleoperation/inference episodes (HDF5 + GIFs) for plate handoffs to a plate reader | Embodiment data, no protocol `.py` | unstated | +| **Opentrons/Protocols** (`github.com/Opentrons/Protocols`) | Public protocol library source; large, but entries are vendor/kit protocols and rarely cite a paper — low triple yield, useful as solution-style exemplars | Yes, OT-2/Flex Python | no LICENSE file | + +Take-away: nothing in this list pairs a *published paper* with *runnable liquid-handler code* and *wet-lab results* +the way Text2WetLab does. AEGIS (24 OT-2 protocols, MIT) is the closest and the best absorb/compare target; +BioProBench and LAB-Bench ProtocolQA are text-only and belong in a related-work comparison, not an absorb. + +## Top 15 candidates + +1. **tidytron** — SLAS Technol 2024, Apache-2.0 repo, 37 OT-2 scripts, wash-and-reuse validated by carryover assays. Highest ready-to-task density found. +2. **beckham-enzyme-pipeline** — Sci Rep 2024 (CC BY), 21 modular OT-2 scripts covering transformation → inoculation → assay; repo unlicensed. +3. **massspecpreppy** — Proteomics 2023, GPL-3.0, one script per stage (BCA, digestion, SP3, Evotip) with quantitative manual-vs-robot comparison (101.3% vs 96.3% BCA recovery). +4. **jubiotech-ot2-autoclone** — Appl Microbiol Biotechnol 2022 (CC BY), AGPL-3.0, seven one-protocol-per-file scripts (Golden Gate, heat-shock, digest, plasmid prep, plating). +5. **culturomics-isolation** — iMetaOmics 2025 (CC BY), 11 single-step OT-2 scripts (microvolume extraction, two-step PCR, bead purification, pooling). +6. **ant-cloning** — ACS Synth Biol 2020, five numbered end-to-end scripts (PCR → digestion → OE-PCR → transformation → plating) explicitly tied to the paper. +7. **roboctab** — Plants 2025 (CC BY) with *both* OT-2 and Flex versions of one CTAB extraction: a natural easy/hard pair and rare Flex coverage. +8. **cayman-his-elisa** — protocols.io CC BY text + MIT repo with loading, wash/substrate and a hardware test script (Arcadia Science). +9. **greenaway-halogenation** — BSD-3-Clause, nine OT-2 scripts across screening stages plus NMR prep; chemistry breadth for the benchmark. +10. **greenaway-pocs** — Chem Sci 2024 (CC BY), repo even ships `simulate.py`, so the scripts are known to pass `opentrons_simulate`. +11. **exfab-qiaseq-flex** — protocols.io CC BY NGS protocol with a matching GPL-3.0 Flex script, one-to-one. +12. **lucks-cellfree-biosensor** — open preprint, script maps to a single figure (384-well cell-free build); good viscous-liquid hard task. +13. **hyrad-adna-capture** — Mol Ecol Resour 2022, one self-contained script driving magnetic + temperature modules. +14. **damplab-moclo-transformation** — Synth Biol 2022 (CC BY) + BSD-3 MoClo/transformation templates; closest licence-clean analogue to the existing APEX tasks. +15. **lap-format-repository** — ACS Synth Biol 2023 LAP paper (new to the corpus) over the already-known LAPrepository code: ~37 validated entry scripts, each a candidate task once licence is clarified. + +Runners-up worth a second look: `sapp-dmx-protein-design` (Nat Commun 2026, MIT, SEC pooling), +`blots-ot2` (Current Protocols 2026 — protocol-journal text is ideal NL input), `greenaway-mocs`, +`formulations-prep-shampoo` (viscous handling), `plant-phenotyping-ot2`, `moeller-library-dup` +(9 MIT scripts beyond the Hackflex one already tracked), `opentrons-accs-dup` (BSD-3 framework repo not yet ingested). + +## Gaps / follow-ups + +- Flex and PyLabRobot coverage is still thin: only 4 Flex candidates (roboctab, exfab-qiaseq-flex, + exposomics-384-flex, flex-genomics-di-omics) and no new PyLabRobot paper+code+results triple beyond the + PyLabRobot paper itself (already in corpus via chory/olh forks). +- Hamilton/Tecan papers mostly release analysis code only (helleckes-catib-screening, proteoautonet) — + the robot methods stay in vendor formats. +- Three repos need a paper identified before they count as triples: `exposomics-384-flex`, + `spot-assay-ot2`, `biomationscripter`. +- AEGIS's own OT-2 protocol set (MIT) should be located and screened next; its repo URL was not in the + abstract page. From 451b229e95ee3c2859c2d6605e71469acbc9587a Mon Sep 17 00:00:00 2001 From: nialloleary Date: Mon, 12 Oct 2026 09:34:29 +0100 Subject: [PATCH 02/12] research: add fault detector, 3D replay tools and model-vs-oracle fault report Co-Authored-By: Claude Opus 5.5 --- research/expansion/fault_report.md | 41 +++ research/expansion/tools/fault_detect.py | 144 ++++++++++ research/expansion/tools/mylog.py | 13 + research/expansion/tools/replay3d.py | 327 +++++++++++++++++++++++ research/expansion/tools/replay_fault.py | 102 +++++++ research/expansion/tools/replay_log.py | 211 +++++++++++++++ 6 files changed, 838 insertions(+) create mode 100644 research/expansion/fault_report.md create mode 100644 research/expansion/tools/fault_detect.py create mode 100644 research/expansion/tools/mylog.py create mode 100644 research/expansion/tools/replay3d.py create mode 100644 research/expansion/tools/replay_fault.py create mode 100644 research/expansion/tools/replay_log.py diff --git a/research/expansion/fault_report.md b/research/expansion/fault_report.md new file mode 100644 index 0000000..f5d065c --- /dev/null +++ b/research/expansion/fault_report.md @@ -0,0 +1,41 @@ +### ecoli-heat-shock-transformation +- **Opus 5.5**: + - FAULT `mix` pipette-mixes tubes_1_5ml_1 A1 (oracle never mixes here) +- **Sonnet 5.5**: no faults vs oracle +- **Fable 5.1**: + - FAULT `mix` pipette-mixes tubes_1_5ml_1 A1 (oracle never mixes here) +### opentrons-rna-extraction +- **Opus 5.5**: + - FAULT `volume` 100 uL Extraction plate (slot 4) -> Elution plate per well; oracle 80 uL + - note `timing` total waits 15 min vs oracle 28 min + - note `magnet` magnet engaged 2x vs oracle 7x +- **Sonnet 5.5**: + - FAULT `order` adds samples 1-24 (slot 10) to sample plate before NEST 12 Well Reservoir 15 mL A2 (slot 5) (oracle order differs) + - FAULT `volume` 79,680 uL total sample plate (slot 4) -> waste plate; oracle 75,600 uL (+5%) + - FAULT `volume` 100 uL sample plate (slot 4) -> elution plate per well; oracle 80 uL + - note `timing` total waits 15 min vs oracle 28 min + - note `magnet` magnet engaged 2x vs oracle 7x +- **Fable 5.1**: + - FAULT `volume` 100 uL extraction plate (slot 4) -> elution plate per well; oracle 80 uL + - note `timing` total waits 15 min vs oracle 28 min + - note `magnet` magnet engaged 2x vs oracle 7x +### split-200ul-two-wells +- **Opus 5.5**: no faults vs oracle +- **Sonnet 5.5**: no faults vs oracle +- **Fable 5.1**: no faults vs oracle +### a1-a12-100ul +- **Opus 5.5**: no faults vs oracle +- **Sonnet 5.5**: no faults vs oracle +- **Fable 5.1**: no faults vs oracle +### colony-pcr-screening +- **Opus 5.5**: no faults vs oracle +- **Sonnet 5.5**: no faults vs oracle +- **Fable 5.1**: no faults vs oracle +### golden-gate-assembly +- **Opus 5.5**: no faults vs oracle +- **Sonnet 5.5**: no faults vs oracle +- **Fable 5.1**: no faults vs oracle +### ampure-bead-cleanup +- **Opus 5.5**: no faults vs oracle +- **Sonnet 5.5**: no faults vs oracle +- **Fable 5.1**: no faults vs oracle diff --git a/research/expansion/tools/fault_detect.py b/research/expansion/tools/fault_detect.py new file mode 100644 index 0000000..57bd65e --- /dev/null +++ b/research/expansion/tools/fault_detect.py @@ -0,0 +1,144 @@ +"""Align a model's Opentrons run log against the oracle's and list faults, deterministically. + +usage: fault_detect.py [--md] +Fault kinds (each tied to the model event index where it first shows, and the wells it touches): + volume same source -> destination well, total volume off by >5% from the oracle + missing a source -> destination flow the oracle has and the model never does + extra a source -> destination flow the model does and the oracle never does + order reagents reach a destination in a different first-addition order + mix pipette-mixing in a well the oracle never mixes + timing total protocol delays < 60% of the oracle's + magnet fewer magnet engage cycles than the oracle +""" +import collections, json, re, sys + +ROWS = "ABCDEFGH" + + +def slot(key): + return int(re.findall(r"on (\d+)$", key)[0]) + + +def short(key): + return re.sub(r" on .*$", "", key) + + +def parse(path): + log = json.load(open(path)) + ev, loads = log["events"], {slot(k): v for k, v in log["labware"].items()} + plate96 = lambda key: "96" in loads.get(slot(key), "") and "tiprack" not in loads.get(slot(key), "") + transfers, mixes, delay, engages, sources = [], [], 0.0, 0, set() + pending = None + for i, e in enumerate(ev): + k = e["kind"] + if k == "delay": + delay += e["seconds"] + elif k == "engage": + engages += 1 + elif k == "aspirate": + pending = e + elif k == "dispense" and pending is not None: + a, ch = pending, e["channels"] + cols = lambda w, key: [f"{r}{re.findall(r'\d+', w)[0]}" for r in ROWS] if ch == 8 and plate96(key) else [w] + if slot(a["labware"]) == slot(e["labware"]) and a["well"] == e["well"]: + mixes.append(dict(i=i, slot=slot(e["labware"]), wells=cols(e["well"], e["labware"]), name=short(e["labware"]))) + else: + src = (slot(a["labware"]), "*" if plate96(a["labware"]) or "tuberack" in loads.get(slot(a["labware"]), "") else a["well"]) + sources.add((slot(a["labware"]), a["well"])) + for w in cols(e["well"], e["labware"]): + transfers.append(dict(i=i, src=src, src_name=short(a["labware"]), dst=slot(e["labware"]), + dst_well=w, dst_name=short(e["labware"]), vol=e["volume"])) + pending = None + return dict(n=len(ev), transfers=transfers, mixes=mixes, delay=delay, engages=engages, sources=sources) + + +def src_label(t): + s, w = t["src"] + return f"{t['src_name']}" + (f" {w}" if w != "*" else "") + f" (slot {s})" + + +def faults(oracle, model): + out = [] + # total volume and well count per (source, destination slot): well layouts may legitimately differ + def agg(run): + tot, wells, first = collections.Counter(), collections.defaultdict(set), {} + for t in run["transfers"]: + k = (t["src"], t["dst"]) + tot[k] += t["vol"]; wells[k].add(t["dst_well"]); first.setdefault(k, t) + return tot, wells, first + vo, wo, fo = agg(oracle) + vm, wm, first = agg(model) + groups = {} + for k in set(vo) | set(vm): + a, b = vo.get(k, 0), vm.get(k, 0) + if a and b and abs(a - b) > 0.05 * a: + groups[k] = ("volume", a / len(wo[k]), b / len(wm[k]), sorted(wm[k])) + elif a and not b: + groups[k] = ("missing", a / len(wo[k]), 0, []) + elif b and not a: + groups[k] = ("extra", 0, b / len(wm[k]), sorted(wm[k])) + o_src_names = {t["src"]: src_label(t) for t in oracle["transfers"]} + for (src, dst), (kind, a, b, wells) in groups.items(): + t0 = first.get((src, dst)) or fo.get((src, dst)) + i = first[(src, dst)]["i"] if (src, dst) in first else None + name, dname = src_label(t0), t0["dst_name"] + if kind == "volume": + tm, to = vm[(src, dst)], vo[(src, dst)] + msg = (f"{b:g} uL {name} -> {dname} per well; oracle {a:g} uL" if len(wm[(src, dst)]) == len(wo[(src, dst)]) + else f"{tm:,.0f} uL total {name} -> {dname}; oracle {to:,.0f} uL ({(tm - to) / to:+.0%})") + elif kind == "missing": + msg = f"never moves {name} -> {dname} (oracle {a:g} uL into each of {len(wo[(src, dst)])} wells)" + else: + msg = f"extra transfer {name} -> {dname} ({b:g} uL x {len(wells)} wells; oracle none)" + out.append(dict(kind=kind, i=i, slot=dst, wells=wells, msg=msg)) + # first-addition order into each destination slot + def order(run): + seen = collections.defaultdict(list) + for t in run["transfers"]: + if t["src"] not in [s for s, _ in seen[t["dst"]]]: + seen[t["dst"]].append((t["src"], t)) + return seen + oo, mo = order(oracle), order(model) + for dst in mo: + common = [s for s, _ in oo.get(dst, []) if s in [x for x, _ in mo[dst]]] + mseq = [(s, t) for s, t in mo[dst] if s in common] + for pos, (s, t) in enumerate(mseq): + if s != common[pos]: + expected = next(t2 for s2, t2 in oo[dst] if s2 == common[pos]) + out.append(dict(kind="order", i=t["i"], slot=dst, wells=[t["dst_well"]], + msg=f"adds {src_label(t)} to {t['dst_name']} before {src_label(expected)} (oracle order differs)")) + break + # mixing where the oracle never mixes + omix = {(m["slot"], w) for m in oracle["mixes"] for w in m["wells"]} + flagged = set() + for m in model["mixes"]: + new = [w for w in m["wells"] if (m["slot"], w) not in omix and (m["slot"], w) not in flagged + and (m["slot"], w) not in model["sources"]] + if new: + flagged |= {(m["slot"], w) for w in new} + out.append(dict(kind="mix", i=m["i"], slot=m["slot"], wells=new, + msg=f"pipette-mixes {m['name']} {','.join(new[:4])} (oracle never mixes here)")) + if oracle["delay"] and model["delay"] < 0.6 * oracle["delay"]: + out.append(dict(kind="timing", i=None, slot=None, wells=[], + msg=f"total waits {model['delay']/60:.0f} min vs oracle {oracle['delay']/60:.0f} min", severity="note")) + if model["engages"] < oracle["engages"]: + out.append(dict(kind="magnet", i=None, slot=None, wells=[], + msg=f"magnet engaged {model['engages']}x vs oracle {oracle['engages']}x", severity="note")) + # collapse repeated per-well mix faults into one entry per slot + return sorted(out, key=lambda f: (f["i"] is None, f["i"] or 0)) + + +MODELS = {"claude-opus-5-5": "Opus 5.5", "claude-sonnet-5-5": "Sonnet 5.5", "claude-fable-5-1": "Fable 5.1"} + +if __name__ == "__main__": + logs, task = sys.argv[1], sys.argv[2] + o = parse(f"{logs}/{task}.oracle.json") + result = {} + for m, name in MODELS.items(): + fs = faults(o, parse(f"{logs}/{task}.{m}.json")) + result[m] = fs + json.dump(fs, open(f"{logs}/{task}.{m}.faults.json", "w"), indent=1) + if "--md" in sys.argv: + print(f"- **{name}**: " + ("no faults vs oracle" if not fs else "")) + for f in fs: + print(f" - {'note' if f.get('severity') == 'note' else 'FAULT'} `{f['kind']}` {f['msg']}") diff --git a/research/expansion/tools/mylog.py b/research/expansion/tools/mylog.py new file mode 100644 index 0000000..3f6f6db --- /dev/null +++ b/research/expansion/tools/mylog.py @@ -0,0 +1,13 @@ +"""eval/runlog.py, but keeping protocol comments as caption events.""" +import json, sys +sys.path.insert(0, sys.argv[4]) +import runlog +_parse = runlog.parse +def parse(text, payload): + if text.startswith("COMMENT: "): + return {"kind": "comment", "text": text[9:], "instrument": "", "channels": 1} + return _parse(text, payload) +runlog.parse = parse +out = runlog.main(sys.argv[1], sys.argv[2]) +open(sys.argv[3], "w").write(json.dumps(out)) +print(sys.argv[1].split("results/")[-1], "ok" if out["ok"] else out["error"][:200], len(out.get("events", []))) diff --git a/research/expansion/tools/replay3d.py b/research/expansion/tools/replay3d.py new file mode 100644 index 0000000..d1677b1 --- /dev/null +++ b/research/expansion/tools/replay3d.py @@ -0,0 +1,327 @@ +"""Replay a Text2WetLab task in PyLabRobot's 3D viewer and record it to a video. + +usage: replay3d.py [--live] +Builds the task's OT-2 deck from tests/deck.json, fills it from tests/ir.json, then walks the IR +steps: a pipette marker moves tip rack -> source -> destination while the volume and tip trackers +update, which the viewer draws. Manual (non-pipetting) steps are shown as captions. +""" +import asyncio, json, os, re, sys, string, shutil + +from pylabrobot.resources import set_volume_tracking, set_tip_tracking, Coordinate, Resource, Tube +from pylabrobot.resources.opentrons import ( + OTDeck, opentrons_96_tiprack_20ul, opentrons_96_tiprack_300ul, opentrons_96_filtertiprack_200ul, + opentrons_96_filtertiprack_1000ul) +from pylabrobot.resources.opentrons.tube_racks import ( + opentrons_24_tuberack_eppendorf_1_5ml_safelock_snapcap, + opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap, opentrons_6_tuberack_falcon_50ml_conical, + opentrons_15_tuberack_falcon_15ml_conical) +from pylabrobot.resources.corning import cor_96_wellplate_360uL_Fb +from pylabrobot.resources.biorad import biorad_96_wellplate_200uL_Vb +from pylabrobot.resources.nest import ( + nest_1_troughplate_195000uL_Vb, nest_12_troughplate_15000uL_Vb, NEST_96_wellplate_2200uL_Ub) +from pylabrobot.visualizer3D.server import Viewer3D +from pylabrobot.visualizer3D.facility import Facility + +LABWARE = { + "corning_96_wellplate_360ul_flat": cor_96_wellplate_360uL_Fb, + "biorad_96_wellplate_200ul_pcr": biorad_96_wellplate_200uL_Vb, + "nest_1_reservoir_195ml": nest_1_troughplate_195000uL_Vb, + "nest_12_reservoir_15ml": nest_12_troughplate_15000uL_Vb, + "opentrons_96_tiprack_20ul": opentrons_96_tiprack_20ul, + "opentrons_96_tiprack_300ul": opentrons_96_tiprack_300ul, + "opentrons_96_filtertiprack_200ul": opentrons_96_filtertiprack_200ul, + "opentrons_96_filtertiprack_1000ul": opentrons_96_filtertiprack_1000ul, + "opentrons_24_tuberack_eppendorf_1.5ml_safelock_snapcap": opentrons_24_tuberack_eppendorf_1_5ml_safelock_snapcap, + "opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap": opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap, + "opentrons_6_tuberack_falcon_50ml_conical": opentrons_6_tuberack_falcon_50ml_conical, + "opentrons_15_tuberack_falcon_15ml_conical": opentrons_15_tuberack_falcon_15ml_conical, + # stand-ins (no exact PyLabRobot definition) + "usascientific_96_wellplate_2.4ml_deep": NEST_96_wellplate_2200uL_Ub, + "thermo_96_wellplate_200ul": biorad_96_wellplate_200uL_Vb, +} + +ROWS = string.ascii_uppercase + + +def expand(spec): + """['A1:H12'] -> column-major well names; plain names pass through.""" + out = [] + for s in spec: + m = re.fullmatch(r"([A-P])(\d+):([A-P])(\d+)", s) + if not m: + out.append(s) + continue + r0, c0, r1, c1 = ROWS.index(m[1]), int(m[2]), ROWS.index(m[3]), int(m[4]) + for c in range(c0, c1 + 1): + for r in range(r0, r1 + 1): + out.append(f"{ROWS[r]}{c}") + return out + + +class Replay: + def __init__(self, deck_spec, ir): + set_volume_tracking(True) + set_tip_tracking(True) + self.ir = ir + self.facility = Facility(name="lab", size_x=800, size_y=700, size_z=400) + self.deck = OTDeck(with_trash=True) + self.facility.assign_child_resource(self.deck, location=Coordinate(0, 0, 0)) + self.labware, self.containers, self.tipracks = {}, {}, {} + for slot, s in sorted(deck_spec["slots"].items(), key=lambda kv: int(kv[0])): + lw = LABWARE[s["load_name"]](name=s["label"]) + self.deck.assign_child_at_slot(lw, int(slot)) + self.labware[s["label"]] = lw + for key, t in deck_spec["tips"].items(): + rack = LABWARE[t["load_name"]](name=f"tips_{key}ul") + self.deck.assign_child_at_slot(rack, int(t["slot"])) + self.tipracks[key] = rack + for name, c in deck_spec.get("containers", {}).items(): + self.containers[name] = (c["label"], c.get("well")) + self.head = Resource(name="pipette", size_x=14, size_y=14, size_z=90, category="pipette") + self.facility.assign_child_resource(self.head, location=Coordinate(300, 300, 160)) + self.caption = lambda text: None + self.delay = 0.1 + + def wells(self, container, spec): + label, default_well = self.containers.get(container, (container, None)) + lw = self.labware[label] + names = expand(spec) if spec else [default_well or "A1"] + return [self._vessel(lw, n) for n in names] + + @staticmethod + def _vessel(lw, well): + item = lw.get_item(well) + if hasattr(item, "tracker"): + return item + if item.children: # a tube already sits in this rack position + return item.children[0] + cap = 50000 if "50ml" in lw.name or "50" in str(lw.model) else ( + 15000 if "15ml" in str(lw.model) else 2000 if "2ml" in str(lw.model) else 1500) + tube = Tube(name=f"{lw.name}_{well}_tube", size_x=item.get_size_x() * 0.8, + size_y=item.get_size_y() * 0.8, size_z=max(20.0, lw.get_size_z() * 0.9), max_volume=cap) + item.assign_child_resource(tube) + return tube + + def fill(self): + for c in self.ir["initial_contents"]: + for w in self.wells(c["container"], c["wells"]): + cap = w.max_volume + vol = c["volume_ul"] if c["volume_ul"] is not None else cap * 0.8 + w.tracker.set_volume(min(vol, cap)) + + async def move_to(self, resource, dz=30.0): + loc = resource.get_absolute_location() + Coordinate( + resource.get_size_x() / 2 - 7, resource.get_size_y() / 2 - 7, resource.get_size_z() + dz) + self.facility.unassign_child_resource(self.head) + self.facility.assign_child_resource(self.head, location=loc) + await asyncio.sleep(self.delay) + + def rack_for(self, vol): + keys = sorted(self.tipracks, key=float) + for k in keys: + if vol <= float(k): + return self.tipracks[k] + return self.tipracks[keys[-1]] + + async def pick_tip(self, vol): + rack = self.rack_for(vol) + spots = [s for s in rack.get_all_items() if s.tracker.has_tip] + if not spots: # reset_tipracks(): the operator refills the rack + for s in rack.get_all_items(): + s.tracker.add_tip(s.make_tip()) + spots = rack.get_all_items() + await self.move_to(spots[0]) + spots[0].tracker.remove_tip() + + async def drop_tip(self): + trash = self.deck.get_trash_area() if hasattr(self.deck, "get_trash_area") else None + if trash is not None: + await self.move_to(trash) + + @staticmethod + def move_liquid(src, dst, vol): + have = src.tracker.get_used_volume() + if have < vol: # "plenty" sources: top up rather than fail + src.tracker.set_volume(min(src.max_volume, have + vol)) + src.tracker.remove_liquid(vol) + room = dst.tracker.get_free_volume() + dst.tracker.add_liquid(min(vol, room)) + + def count_ops(self): + n = 0 + for s in self.ir["steps"]: + if s["kind"] == "transfer": + n += max(len(expand(s["source_wells"]) or [1]), len(expand(s["dest_wells"]) or [1])) + elif s["kind"] == "mix": + n += len(expand(s["dest_wells"]) or [1]) + return n + + async def run(self, seconds=50.0): + ops = max(1, self.count_ops()) + self.delay = min(0.5, max(0.025, seconds / ops / 3)) + self.fill() + self.caption(self.ir.get("title", "")) + await asyncio.sleep(2.0) + for i, s in enumerate(self.ir["steps"], 1): + if s["kind"] == "manual": + self.caption(f"Step {i} (manual, not pipetted): {s['action']}") + await asyncio.sleep(1.8) + continue + if s["kind"] == "mix": + self.caption(f"Step {i}: mix {s['dest']} {', '.join(s['dest_wells']) or ''} x{s['mix_cycles']}") + await self.pick_tip(s["volume_ul"] or 20) + for w in self.wells(s["dest"], s["dest_wells"]): + await self.move_to(w, dz=5) + await self.move_to(w, dz=25) + await self.drop_tip() + continue + vol = float(s["volume_ul"]) + src = self.wells(s["source"], s["source_wells"]) + dst = self.wells(s["dest"], s["dest_wells"]) + mix = f", mix x{s['mix_cycles']}" if s.get("mix_cycles") else "" + self.caption(f"Step {i}: {vol:g} uL {s.get('reagent') or ''} {s['source']} -> {s['dest']} " + f"({max(len(src), len(dst))} wells{mix})") + if len(src) == 1: + pairs = [(src[0], d) for d in dst] + elif len(dst) == 1: + pairs = [(sw, dst[0]) for sw in src] + else: + pairs = list(zip(src, dst)) + one_tip = len(src) == 1 # shared reagent: one tip for the step + if one_tip: + await self.pick_tip(vol) + for sw, dw in pairs: + if not one_tip: + await self.pick_tip(vol) + await self.move_to(sw, dz=5) + await self.move_to(dw, dz=5) + self.move_liquid(sw, dw, vol) + if not one_tip: + await self.drop_tip() + if one_tip: + await self.drop_tip() + self.caption("Done: final volumes shown on the deck") + await asyncio.sleep(3.0) + + +RNA_DECK = { + "slots": { + "1": {"load_name": "usascientific_96_wellplate_2.4ml_deep", "label": "waste_plate"}, + "4": {"load_name": "usascientific_96_wellplate_2.4ml_deep", "label": "mag_plate"}, + "5": {"load_name": "nest_12_reservoir_15ml", "label": "reservoir"}, + "6": {"load_name": "thermo_96_wellplate_200ul", "label": "elution_plate"}, + "10": {"load_name": "opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap", "label": "samples_1_24"}, + "7": {"load_name": "opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap", "label": "samples_25_48"}, + }, + "tips": {"200": {"load_name": "opentrons_96_filtertiprack_200ul", "slot": 2}, + "1000": {"load_name": "opentrons_96_filtertiprack_1000ul", "slot": 11}}, + "containers": {}, +} +ODD = [f"{r}{c}" for c in (1, 3, 5, 7, 9, 11) for r in "ABCDEFGH"] +TUBES = [f"{r}{c}" for c in range(1, 7) for r in "ABCD"] + + +def rna_ir(): + t = lambda src, sw, dst, dw, v, reagent, mix=None: { + "kind": "transfer", "source": src, "source_wells": sw, "dest": dst, "dest_wells": dw, + "volume_ul": v, "reagent": reagent, "mix_cycles": mix} + m = lambda a: {"kind": "manual", "action": a} + return { + "title": "Magnetic-bead SARS-CoV-2 RNA extraction, 48 samples (PLOS ONE 2021)", + "initial_contents": [ + {"container": "reservoir", "wells": ["A2", "A4", "A6", "A7", "A9", "A10", "A11", "A12"], + "volume_ul": None}, + {"container": "samples_1_24", "wells": TUBES, "volume_ul": 300}, + {"container": "samples_25_48", "wells": TUBES, "volume_ul": 300}, + ], + "steps": [ + m("Magnet disengaged; temperature module to 4 C"), + t("reservoir", ["A2"], "mag_plate", ODD, 40, "magnetic beads"), + t("reservoir", ["A6"], "mag_plate", ODD[:24], 250, "isopropanol"), + t("reservoir", ["A7"], "mag_plate", ODD[24:], 250, "isopropanol"), + t("samples_1_24", TUBES, "mag_plate", ODD[:24], 250, "sample", 5), + t("samples_25_48", TUBES, "mag_plate", ODD[24:], 250, "sample", 5), + m("Incubate 5 min at room temperature"), + m("Engage magnet, wait 4 min"), + t("mag_plate", ODD, "waste_plate", ODD, 540, "supernatant"), + t("reservoir", ["A9"], "mag_plate", ODD[:24], 500, "70% ethanol"), + t("reservoir", ["A10"], "mag_plate", ODD[24:], 500, "70% ethanol"), + t("mag_plate", ODD, "waste_plate", ODD, 500, "ethanol wash 1"), + t("reservoir", ["A11"], "mag_plate", ODD[:24], 500, "70% ethanol"), + t("reservoir", ["A12"], "mag_plate", ODD[24:], 500, "70% ethanol"), + t("mag_plate", ODD, "waste_plate", ODD, 500, "ethanol wash 2"), + m("Air-dry beads 4 min, magnet engaged"), + m("Disengage magnet"), + t("reservoir", ["A4"], "mag_plate", ODD, 100, "elution buffer", 5), + m("Wait 30 s, engage magnet 90 s"), + t("mag_plate", ODD, "elution_plate", ODD, 80, "eluate (RNA)"), + m("Disengage magnet; eluate held at 4 C"), + ], + } + + +async def main(task_dir, out_dir, live): + name = os.path.basename(task_dir.rstrip("/")) + if name.startswith("opentrons-rna-extraction"): + deck_spec, ir = RNA_DECK, rna_ir() + else: + deck_spec = json.load(open(os.path.join(task_dir, "tests", "deck.json"))) + ir = json.load(open(os.path.join(task_dir, "tests", "ir.json"))) + rp = Replay(deck_spec, ir) + viewer = Viewer3D(rp.facility, open_browser=live, name=name) + await viewer.start() + if live: + await viewer.wait_for_browser() + await rp.run() + await viewer.stop() + return + + from playwright.async_api import async_playwright + tmp = os.path.join(out_dir, f".rec_{name}") + shutil.rmtree(tmp, ignore_errors=True) + async with async_playwright() as p: + browser = await p.chromium.launch(headless=True, args=["--use-angle=metal", "--enable-gpu", "--ignore-gpu-blocklist"]) + ctx = await browser.new_context(viewport={"width": 1280, "height": 720}, + record_video_dir=tmp, record_video_size={"width": 1280, "height": 720}) + page = await ctx.new_page() + page.on("console", lambda msg: msg.type == "error" and print(" console:", msg.text[:200])) + url = viewer.url.replace("/#", "/?view=iso#") + await page.goto(url) + await viewer.wait_for_browser(timeout=60) + for _ in range(120): # until the scene has actually arrived and been drawn + if await page.evaluate("() => (window.plrViewer?.resources() || []).length > 0"): + break + await asyncio.sleep(0.25) + for btn in ("#toolbar-right-toggle", "#toolbar-left-toggle"): + try: + await page.click(btn, timeout=2000) + except Exception: + pass + await page.add_style_tag(content="#stats-panel,#scale-bar,#zoom-controls,#home-button{display:none!important}") + await asyncio.sleep(1.0) + await page.evaluate("() => plrViewer.focus('ot2_deck', 'iso')") + await asyncio.sleep(0.5) + await page.keyboard.press("Escape") # close the inspector the focus opened + await asyncio.sleep(1.0) + await page.evaluate("""() => { const d = document.createElement('div'); d.id = 'cap'; + d.style.cssText = 'position:fixed;left:16px;right:16px;bottom:16px;padding:10px 14px;' + + 'background:rgba(0,0,0,.7);color:#fff;font:600 18px system-ui;border-radius:8px;z-index:99999'; + document.body.appendChild(d); }""") + loop = asyncio.get_running_loop() + rp.caption = lambda text: loop.create_task( + page.evaluate("t => { document.getElementById('cap').textContent = t; }", text)) + await rp.run() + video = page.video + await ctx.close() + await browser.close() + src = await video.path() + os.makedirs(out_dir, exist_ok=True) + dst = os.path.join(out_dir, f"{name}.mp4") + os.system(f'ffmpeg -loglevel error -y -i "{src}" -c:v libx264 -pix_fmt yuv420p -crf 23 "{dst}"') + shutil.rmtree(tmp, ignore_errors=True) + await viewer.stop() + print("wrote", dst) + + +if __name__ == "__main__": + asyncio.run(main(sys.argv[1], sys.argv[2], "--live" in sys.argv)) diff --git a/research/expansion/tools/replay_fault.py b/research/expansion/tools/replay_fault.py new file mode 100644 index 0000000..9be1eea --- /dev/null +++ b/research/expansion/tools/replay_fault.py @@ -0,0 +1,102 @@ +"""replay_log.py plus fault annotation: red caption at the faulty event, red pins on affected wells. + +usage: replay_fault.py