From 31e1e7857945eaf4cae5b6fe134297fa98755a7c Mon Sep 17 00:00:00 2001 From: "marcin p. joachimiak" <4625870+realmarcin@users.noreply.github.com> Date: Thu, 10 Sep 2026 21:30:33 -0700 Subject: [PATCH 1/2] Order heatmap columns by how widely each vocabulary is shared The 22 columns were in the order they were first written down, so the table said nothing by its shape: a vocabulary every Mech uses sat next to one only ProteinTraitsMech has. They now sort left to right by the number of Mechs that ground anything in the vocabulary, ties broken by the total records citing it across the fleet, then by name so the order is stable when a vocabulary appears in no records at all. PMID and DOI are pinned to the right end instead of sorted. Every Mech cites literature, so both would rank first on Mech count and crowd out the vocabularies that actually say what the fleet shares; they also have no record counts to rank by, since build_subsets.py skips citation prefixes. The result runs NCBITaxon and ChEBI at nine Mechs each, through GO at six and a five-Mech tier of UniProt, ENVO and UBERON, down to RHEA, MIBiG, NPAtlas and GTDB at one. The order is computed in build_data.py, so a corpus refresh re-derives it rather than leaving the columns stale. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01BXHrBTSU8fU4Zg7HfaMKs9 --- _fleet/data/fleet_data.json | 2 +- _fleet/mechs_template.md | 4 ++-- mechs.md | 6 +++--- scripts/fleet/build_data.py | 17 ++++++++++++++++- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/_fleet/data/fleet_data.json b/_fleet/data/fleet_data.json index 16591a2..bb5bb22 100644 --- a/_fleet/data/fleet_data.json +++ b/_fleet/data/fleet_data.json @@ -1 +1 @@ -{"order":["HabitatMech","CommunityMech","TraitMech","CellStructureMech","ProteinTraitsMech","NaturalProductMech","AntibioticMech","MediaIngredientMech","CultureMech"],"voc":["CHEBI","NCBITaxon","GO","ENVO","METPO","ARO","UniProt","InterPro","Pfam","RHEA","PDB","PATO","UBERON","FOODON","BTO","GTDB","KEGG","CAS","MIBiG","NPAtlas","PMID","DOI"],"heat":{"HabitatMech":{"CHEBI":18,"NCBITaxon":13222,"GO":2,"ENVO":3183,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":4,"UBERON":1089,"FOODON":194,"BTO":1353,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":513,"DOI":112},"CommunityMech":{"CHEBI":2221,"NCBITaxon":3060,"GO":862,"ENVO":366,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":9,"FOODON":0,"BTO":0,"GTDB":1674,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":4812,"DOI":1123},"TraitMech":{"CHEBI":666,"NCBITaxon":844,"GO":809,"ENVO":22,"METPO":3195,"ARO":0,"UniProt":389,"InterPro":113,"Pfam":0,"RHEA":0,"PDB":0,"PATO":97,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":412,"DOI":5319},"CellStructureMech":{"CHEBI":18,"NCBITaxon":351,"GO":398,"ENVO":0,"METPO":14,"ARO":0,"UniProt":238,"InterPro":38,"Pfam":17,"RHEA":0,"PDB":4,"PATO":0,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":205,"DOI":1343},"ProteinTraitsMech":{"CHEBI":373461,"NCBITaxon":357752,"GO":417184,"ENVO":0,"METPO":244,"ARO":194924,"UniProt":656717,"InterPro":1477316,"Pfam":520297,"RHEA":613318,"PDB":235943,"PATO":110,"UBERON":43,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":245,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":654089,"DOI":187928},"NaturalProductMech":{"CHEBI":1587,"NCBITaxon":13718,"GO":0,"ENVO":0,"METPO":0,"ARO":0,"UniProt":1116,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":10175,"NPAtlas":1756,"PMID":5734,"DOI":8320},"AntibioticMech":{"CHEBI":22066,"NCBITaxon":611,"GO":3,"ENVO":0,"METPO":0,"ARO":16653,"UniProt":278,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":6,"PATO":0,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":1835,"MIBiG":0,"NPAtlas":0,"PMID":1207,"DOI":126},"MediaIngredientMech":{"CHEBI":7681,"NCBITaxon":1,"GO":0,"ENVO":110,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":22,"FOODON":270,"BTO":3,"GTDB":0,"KEGG":53,"CAS":661,"MIBiG":0,"NPAtlas":0,"PMID":29,"DOI":5},"CultureMech":{"CHEBI":160660,"NCBITaxon":63,"GO":0,"ENVO":13,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":138,"FOODON":214,"BTO":0,"GTDB":0,"KEGG":1406,"CAS":1,"MIBiG":0,"NPAtlas":0,"PMID":68,"DOI":76}},"cells":{"HabitatMech--NCBITaxon":895,"HabitatMech--ENVO":1263,"HabitatMech--CHEBI":9,"HabitatMech--UBERON":702,"HabitatMech--PATO":3,"HabitatMech--FOODON":85,"HabitatMech--BTO":581,"HabitatMech--GO":1,"CommunityMech--CHEBI":279,"CommunityMech--NCBITaxon":330,"CommunityMech--ENVO":319,"CommunityMech--GO":205,"CommunityMech--GTDB":313,"CommunityMech--UBERON":9,"TraitMech--NCBITaxon":344,"TraitMech--GO":232,"TraitMech--METPO":471,"TraitMech--CHEBI":180,"TraitMech--InterPro":59,"TraitMech--UniProt":176,"TraitMech--ENVO":14,"TraitMech--PATO":47,"CellStructureMech--NCBITaxon":57,"CellStructureMech--UniProt":37,"CellStructureMech--GO":57,"CellStructureMech--InterPro":13,"CellStructureMech--METPO":5,"CellStructureMech--PDB":1,"CellStructureMech--CHEBI":8,"CellStructureMech--Pfam":6,"ProteinTraitsMech--GO":110801,"ProteinTraitsMech--CHEBI":29847,"ProteinTraitsMech--METPO":119,"ProteinTraitsMech--UniProt":159304,"ProteinTraitsMech--RHEA":29506,"ProteinTraitsMech--KEGG":231,"ProteinTraitsMech--NCBITaxon":98152,"ProteinTraitsMech--Pfam":107564,"ProteinTraitsMech--InterPro":120094,"ProteinTraitsMech--UBERON":43,"ProteinTraitsMech--PATO":69,"ProteinTraitsMech--ARO":7452,"ProteinTraitsMech--PDB":51717,"NaturalProductMech--NCBITaxon":3115,"NaturalProductMech--MIBiG":3115,"NaturalProductMech--NPAtlas":1740,"NaturalProductMech--CHEBI":371,"NaturalProductMech--UniProt":142,"AntibioticMech--CAS":1804,"AntibioticMech--CHEBI":2795,"AntibioticMech--ARO":568,"AntibioticMech--NCBITaxon":134,"AntibioticMech--UniProt":47,"AntibioticMech--PDB":5,"AntibioticMech--GO":3,"MediaIngredientMech--CHEBI":2224,"MediaIngredientMech--CAS":267,"MediaIngredientMech--KEGG":53,"MediaIngredientMech--FOODON":99,"MediaIngredientMech--ENVO":26,"MediaIngredientMech--UBERON":9,"MediaIngredientMech--BTO":1,"MediaIngredientMech--NCBITaxon":1,"CultureMech--CHEBI":6123,"CultureMech--FOODON":200,"CultureMech--UBERON":72,"CultureMech--NCBITaxon":30,"CultureMech--ENVO":12,"CultureMech--KEGG":329,"CultureMech--CAS":1},"vocab_edges":[{"a":"HabitatMech","b":"CommunityMech","n":258,"by":{"NCBITaxon":213,"ENVO":40,"UBERON":4,"CHEBI":1},"ex":[{"id":"NCBITaxon:2","label":"Bacteria"},{"id":"ENVO:00002123","label":"bioreactor"},{"id":"NCBITaxon:306","label":"Pseudomonas sp."}]},{"a":"HabitatMech","b":"TraitMech","n":103,"by":{"NCBITaxon":95,"ENVO":4,"PATO":2,"DOI":2},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"HabitatMech","b":"CellStructureMech","n":26,"by":{"NCBITaxon":26},"ex":[{"id":"NCBITaxon:2","label":"Bacteria"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"HabitatMech","b":"ProteinTraitsMech","n":1244,"by":{"NCBITaxon":1230,"UBERON":12,"CHEBI":1,"GO":1},"ex":[{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1869227","label":"bacterium"}]},{"a":"HabitatMech","b":"NaturalProductMech","n":311,"by":{"NCBITaxon":311},"ex":[{"id":"NCBITaxon:56","label":"Sorangium cellulosum"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1931","label":"Streptomyces sp."}]},{"a":"HabitatMech","b":"AntibioticMech","n":23,"by":{"NCBITaxon":23},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"HabitatMech","b":"MediaIngredientMech","n":20,"by":{"ENVO":15,"UBERON":4,"CHEBI":1},"ex":[{"id":"ENVO:00002149","label":"sea water"},{"id":"ENVO:00001998","label":"soil"},{"id":"ENVO:00002263","label":"garden soil"}]},{"a":"HabitatMech","b":"CultureMech","n":25,"by":{"NCBITaxon":13,"ENVO":7,"UBERON":4,"FOODON":1},"ex":[{"id":"UBERON:0000948","label":"heart"},{"id":"UBERON:0000955","label":"brain"},{"id":"UBERON:0000178","label":"blood"}]},{"a":"CommunityMech","b":"TraitMech","n":135,"by":{"CHEBI":58,"NCBITaxon":47,"GO":30},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:15379","label":"dioxygen"},{"id":"GO:0015977","label":"carbon fixation"}]},{"a":"CommunityMech","b":"CellStructureMech","n":35,"by":{"NCBITaxon":22,"CHEBI":7,"GO":6},"ex":[{"id":"NCBITaxon:2","label":"Bacteria"},{"id":"NCBITaxon:2157","label":"Archaea"},{"id":"NCBITaxon:562","label":"Escherichia coli"}]},{"a":"CommunityMech","b":"ProteinTraitsMech","n":635,"by":{"CHEBI":266,"NCBITaxon":187,"GO":181,"UBERON":1},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:30089","label":"acetate"},{"id":"CHEBI:18276","label":"dihydrogen"}]},{"a":"CommunityMech","b":"NaturalProductMech","n":98,"by":{"NCBITaxon":92,"CHEBI":6},"ex":[{"id":"NCBITaxon:306","label":"Pseudomonas sp."},{"id":"NCBITaxon:286","label":"Pseudomonas"},{"id":"NCBITaxon:562","label":"Escherichia coli"}]},{"a":"CommunityMech","b":"AntibioticMech","n":51,"by":{"CHEBI":38,"NCBITaxon":13},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"CHEBI:33709","label":"amino acid"},{"id":"NCBITaxon:4932","label":"Saccharomyces cerevisiae"}]},{"a":"CommunityMech","b":"MediaIngredientMech","n":234,"by":{"CHEBI":232,"ENVO":2},"ex":[{"id":"CHEBI:17234","label":"glucose"},{"id":"CHEBI:33709","label":"amino acid"},{"id":"CHEBI:18276","label":"dihydrogen"}]},{"a":"CommunityMech","b":"CultureMech","n":153,"by":{"CHEBI":140,"NCBITaxon":6,"ENVO":5,"DOI":2},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:18276","label":"dihydrogen"},{"id":"CHEBI:30089","label":"acetate"}]},{"a":"TraitMech","b":"CellStructureMech","n":95,"by":{"GO":31,"NCBITaxon":27,"DOI":17,"CHEBI":6,"UniProt":6,"METPO":5,"InterPro":3},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:83333","label":"Escherichia coli (strain K12)"},{"id":"GO:0009288","label":"bacterial-type flagellum"}]},{"a":"TraitMech","b":"ProteinTraitsMech","n":679,"by":{"GO":212,"NCBITaxon":115,"CHEBI":109,"METPO":90,"DOI":58,"UniProt":49,"InterPro":46},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"METPO:1000631","label":"trophic type"}]},{"a":"TraitMech","b":"NaturalProductMech","n":45,"by":{"NCBITaxon":40,"CHEBI":4,"DOI":1},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"},{"id":"NCBITaxon:287","label":"Pseudomonas aeruginosa"}]},{"a":"TraitMech","b":"AntibioticMech","n":24,"by":{"NCBITaxon":14,"CHEBI":10},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"TraitMech","b":"MediaIngredientMech","n":57,"by":{"CHEBI":57},"ex":[{"id":"CHEBI:17234","label":"glucose"},{"id":"CHEBI:18276","label":"dihydrogen"},{"id":"CHEBI:16526","label":"carbon dioxide"}]},{"a":"TraitMech","b":"CultureMech","n":36,"by":{"CHEBI":26,"NCBITaxon":10},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:18276","label":"dihydrogen"},{"id":"CHEBI:17234","label":"glucose"}]},{"a":"CellStructureMech","b":"ProteinTraitsMech","n":374,"by":{"UniProt":137,"GO":109,"DOI":57,"NCBITaxon":36,"InterPro":20,"Pfam":8,"CHEBI":7},"ex":[{"id":"NCBITaxon:99287","label":"Salmonella typhimurium (strain LT2 / SGSC1412 / ATCC 700720)"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:90371","label":"Salmonella enterica subsp. enterica serovar Typhimurium"}]},{"a":"CellStructureMech","b":"NaturalProductMech","n":10,"by":{"NCBITaxon":10},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"},{"id":"NCBITaxon:224308","label":"Bacillus subtilis (strain 168)"}]},{"a":"CellStructureMech","b":"AntibioticMech","n":6,"by":{"NCBITaxon":6},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"},{"id":"NCBITaxon:274","label":"Thermus thermophilus"}]},{"a":"CellStructureMech","b":"MediaIngredientMech","n":5,"by":{"CHEBI":5},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:17544","label":"hydrogencarbonate"},{"id":"CHEBI:18248","label":"iron atom"}]},{"a":"CellStructureMech","b":"CultureMech","n":4,"by":{"NCBITaxon":2,"CHEBI":2},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"NCBITaxon:1148","label":"Synechocystis sp. PCC 6803"},{"id":"CHEBI:18248","label":"iron atom"}]},{"a":"ProteinTraitsMech","b":"NaturalProductMech","n":830,"by":{"NCBITaxon":469,"CHEBI":140,"UniProt":133,"DOI":88},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:100226","label":"Streptomyces coelicolor A3(2)"},{"id":"NCBITaxon:227321","label":"Emericella nidulans (strain FGSC A4 / ATCC 38163 / CBS 112.46 / NRRL 194 / M139)"}]},{"a":"ProteinTraitsMech","b":"AntibioticMech","n":2442,"by":{"ARO":1753,"CHEBI":595,"NCBITaxon":70,"UniProt":20,"DOI":2,"GO":2},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"CHEBI:35681","label":"secondary alcohol"},{"id":"NCBITaxon:2697049","label":"Severe acute respiratory syndrome coronavirus 2"}]},{"a":"ProteinTraitsMech","b":"MediaIngredientMech","n":790,"by":{"CHEBI":789,"UBERON":1},"ex":[{"id":"CHEBI:15377","label":"water"},{"id":"CHEBI:15740","label":"formate"},{"id":"CHEBI:33709","label":"amino acid"}]},{"a":"ProteinTraitsMech","b":"CultureMech","n":233,"by":{"CHEBI":221,"NCBITaxon":10,"UBERON":2},"ex":[{"id":"CHEBI:15377","label":"water"},{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:17754","label":"glycerol"}]},{"a":"NaturalProductMech","b":"AntibioticMech","n":272,"by":{"CHEBI":176,"NCBITaxon":85,"DOI":10,"UniProt":1},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:330879","label":"Aspergillus fumigatus (strain ATCC MYA-4609 / CBS 101355 / FGSC A1100 / Af293)"},{"id":"NCBITaxon:5518","label":"Fusarium graminearum"}]},{"a":"NaturalProductMech","b":"MediaIngredientMech","n":48,"by":{"CHEBI":48},"ex":[{"id":"CHEBI:15956","label":"biotin"},{"id":"CHEBI:16349","label":"L-citrulline"},{"id":"CHEBI:27592","label":"ectoine"}]},{"a":"NaturalProductMech","b":"CultureMech","n":5,"by":{"CHEBI":3,"NCBITaxon":2},"ex":[{"id":"CHEBI:15956","label":"biotin"},{"id":"CHEBI:16349","label":"L-citrulline"},{"id":"CHEBI:27592","label":"ectoine"}]},{"a":"AntibioticMech","b":"MediaIngredientMech","n":322,"by":{"CHEBI":322},"ex":[{"id":"CHEBI:33709","label":"amino acid"},{"id":"CHEBI:30746","label":"benzoic acid"},{"id":"CHEBI:17334","label":"penicillin"}]},{"a":"AntibioticMech","b":"CultureMech","n":29,"by":{"CHEBI":29},"ex":[{"id":"CHEBI:17334","label":"penicillin"},{"id":"CHEBI:48923","label":"erythromycin"},{"id":"CHEBI:30746","label":"benzoic acid"}]},{"a":"MediaIngredientMech","b":"CultureMech","n":607,"by":{"CHEBI":543,"KEGG":53,"FOODON":6,"UBERON":3,"ENVO":1,"CAS":1},"ex":[{"id":"FOODON:03315426","label":"yeast extract"},{"id":"CHEBI:17234","label":"glucose"},{"id":"CHEBI:2509","label":"agar"}]}]} \ No newline at end of file +{"order":["HabitatMech","CommunityMech","TraitMech","CellStructureMech","ProteinTraitsMech","NaturalProductMech","AntibioticMech","MediaIngredientMech","CultureMech"],"voc":["NCBITaxon","CHEBI","GO","UniProt","ENVO","UBERON","InterPro","PDB","CAS","KEGG","METPO","FOODON","PATO","Pfam","ARO","BTO","RHEA","MIBiG","NPAtlas","GTDB","PMID","DOI"],"heat":{"HabitatMech":{"CHEBI":18,"NCBITaxon":13222,"GO":2,"ENVO":3183,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":4,"UBERON":1089,"FOODON":194,"BTO":1353,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":513,"DOI":112},"CommunityMech":{"CHEBI":2221,"NCBITaxon":3060,"GO":862,"ENVO":366,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":9,"FOODON":0,"BTO":0,"GTDB":1674,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":4812,"DOI":1123},"TraitMech":{"CHEBI":666,"NCBITaxon":844,"GO":809,"ENVO":22,"METPO":3195,"ARO":0,"UniProt":389,"InterPro":113,"Pfam":0,"RHEA":0,"PDB":0,"PATO":97,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":412,"DOI":5319},"CellStructureMech":{"CHEBI":18,"NCBITaxon":351,"GO":398,"ENVO":0,"METPO":14,"ARO":0,"UniProt":238,"InterPro":38,"Pfam":17,"RHEA":0,"PDB":4,"PATO":0,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":205,"DOI":1343},"ProteinTraitsMech":{"CHEBI":373461,"NCBITaxon":357752,"GO":417184,"ENVO":0,"METPO":244,"ARO":194924,"UniProt":656717,"InterPro":1477316,"Pfam":520297,"RHEA":613318,"PDB":235943,"PATO":110,"UBERON":43,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":245,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":654089,"DOI":187928},"NaturalProductMech":{"CHEBI":1587,"NCBITaxon":13718,"GO":0,"ENVO":0,"METPO":0,"ARO":0,"UniProt":1116,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":10175,"NPAtlas":1756,"PMID":5734,"DOI":8320},"AntibioticMech":{"CHEBI":22066,"NCBITaxon":611,"GO":3,"ENVO":0,"METPO":0,"ARO":16653,"UniProt":278,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":6,"PATO":0,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":1835,"MIBiG":0,"NPAtlas":0,"PMID":1207,"DOI":126},"MediaIngredientMech":{"CHEBI":7681,"NCBITaxon":1,"GO":0,"ENVO":110,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":22,"FOODON":270,"BTO":3,"GTDB":0,"KEGG":53,"CAS":661,"MIBiG":0,"NPAtlas":0,"PMID":29,"DOI":5},"CultureMech":{"CHEBI":160660,"NCBITaxon":63,"GO":0,"ENVO":13,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":138,"FOODON":214,"BTO":0,"GTDB":0,"KEGG":1406,"CAS":1,"MIBiG":0,"NPAtlas":0,"PMID":68,"DOI":76}},"cells":{"HabitatMech--NCBITaxon":895,"HabitatMech--ENVO":1263,"HabitatMech--CHEBI":9,"HabitatMech--UBERON":702,"HabitatMech--PATO":3,"HabitatMech--FOODON":85,"HabitatMech--BTO":581,"HabitatMech--GO":1,"CommunityMech--CHEBI":279,"CommunityMech--NCBITaxon":330,"CommunityMech--ENVO":319,"CommunityMech--GO":205,"CommunityMech--GTDB":313,"CommunityMech--UBERON":9,"TraitMech--NCBITaxon":344,"TraitMech--GO":232,"TraitMech--METPO":471,"TraitMech--CHEBI":180,"TraitMech--InterPro":59,"TraitMech--UniProt":176,"TraitMech--ENVO":14,"TraitMech--PATO":47,"CellStructureMech--NCBITaxon":57,"CellStructureMech--UniProt":37,"CellStructureMech--GO":57,"CellStructureMech--InterPro":13,"CellStructureMech--METPO":5,"CellStructureMech--PDB":1,"CellStructureMech--CHEBI":8,"CellStructureMech--Pfam":6,"ProteinTraitsMech--GO":110801,"ProteinTraitsMech--CHEBI":29847,"ProteinTraitsMech--METPO":119,"ProteinTraitsMech--UniProt":159304,"ProteinTraitsMech--RHEA":29506,"ProteinTraitsMech--KEGG":231,"ProteinTraitsMech--NCBITaxon":98152,"ProteinTraitsMech--Pfam":107564,"ProteinTraitsMech--InterPro":120094,"ProteinTraitsMech--UBERON":43,"ProteinTraitsMech--PATO":69,"ProteinTraitsMech--ARO":7452,"ProteinTraitsMech--PDB":51717,"NaturalProductMech--NCBITaxon":3115,"NaturalProductMech--MIBiG":3115,"NaturalProductMech--NPAtlas":1740,"NaturalProductMech--CHEBI":371,"NaturalProductMech--UniProt":142,"AntibioticMech--CAS":1804,"AntibioticMech--CHEBI":2795,"AntibioticMech--ARO":568,"AntibioticMech--NCBITaxon":134,"AntibioticMech--UniProt":47,"AntibioticMech--PDB":5,"AntibioticMech--GO":3,"MediaIngredientMech--CHEBI":2224,"MediaIngredientMech--CAS":267,"MediaIngredientMech--KEGG":53,"MediaIngredientMech--FOODON":99,"MediaIngredientMech--ENVO":26,"MediaIngredientMech--UBERON":9,"MediaIngredientMech--BTO":1,"MediaIngredientMech--NCBITaxon":1,"CultureMech--CHEBI":6123,"CultureMech--FOODON":200,"CultureMech--UBERON":72,"CultureMech--NCBITaxon":30,"CultureMech--ENVO":12,"CultureMech--KEGG":329,"CultureMech--CAS":1},"vocab_edges":[{"a":"HabitatMech","b":"CommunityMech","n":258,"by":{"NCBITaxon":213,"ENVO":40,"UBERON":4,"CHEBI":1},"ex":[{"id":"NCBITaxon:2","label":"Bacteria"},{"id":"ENVO:00002123","label":"bioreactor"},{"id":"NCBITaxon:306","label":"Pseudomonas sp."}]},{"a":"HabitatMech","b":"TraitMech","n":103,"by":{"NCBITaxon":95,"ENVO":4,"PATO":2,"DOI":2},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"HabitatMech","b":"CellStructureMech","n":26,"by":{"NCBITaxon":26},"ex":[{"id":"NCBITaxon:2","label":"Bacteria"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"HabitatMech","b":"ProteinTraitsMech","n":1244,"by":{"NCBITaxon":1230,"UBERON":12,"CHEBI":1,"GO":1},"ex":[{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1869227","label":"bacterium"}]},{"a":"HabitatMech","b":"NaturalProductMech","n":311,"by":{"NCBITaxon":311},"ex":[{"id":"NCBITaxon:56","label":"Sorangium cellulosum"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1931","label":"Streptomyces sp."}]},{"a":"HabitatMech","b":"AntibioticMech","n":23,"by":{"NCBITaxon":23},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"HabitatMech","b":"MediaIngredientMech","n":20,"by":{"ENVO":15,"UBERON":4,"CHEBI":1},"ex":[{"id":"ENVO:00002149","label":"sea water"},{"id":"ENVO:00001998","label":"soil"},{"id":"ENVO:00002263","label":"garden soil"}]},{"a":"HabitatMech","b":"CultureMech","n":25,"by":{"NCBITaxon":13,"ENVO":7,"UBERON":4,"FOODON":1},"ex":[{"id":"UBERON:0000948","label":"heart"},{"id":"UBERON:0000955","label":"brain"},{"id":"UBERON:0000178","label":"blood"}]},{"a":"CommunityMech","b":"TraitMech","n":135,"by":{"CHEBI":58,"NCBITaxon":47,"GO":30},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:15379","label":"dioxygen"},{"id":"GO:0015977","label":"carbon fixation"}]},{"a":"CommunityMech","b":"CellStructureMech","n":35,"by":{"NCBITaxon":22,"CHEBI":7,"GO":6},"ex":[{"id":"NCBITaxon:2","label":"Bacteria"},{"id":"NCBITaxon:2157","label":"Archaea"},{"id":"NCBITaxon:562","label":"Escherichia coli"}]},{"a":"CommunityMech","b":"ProteinTraitsMech","n":635,"by":{"CHEBI":266,"NCBITaxon":187,"GO":181,"UBERON":1},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:30089","label":"acetate"},{"id":"CHEBI:18276","label":"dihydrogen"}]},{"a":"CommunityMech","b":"NaturalProductMech","n":98,"by":{"NCBITaxon":92,"CHEBI":6},"ex":[{"id":"NCBITaxon:306","label":"Pseudomonas sp."},{"id":"NCBITaxon:286","label":"Pseudomonas"},{"id":"NCBITaxon:562","label":"Escherichia coli"}]},{"a":"CommunityMech","b":"AntibioticMech","n":51,"by":{"CHEBI":38,"NCBITaxon":13},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"CHEBI:33709","label":"amino acid"},{"id":"NCBITaxon:4932","label":"Saccharomyces cerevisiae"}]},{"a":"CommunityMech","b":"MediaIngredientMech","n":234,"by":{"CHEBI":232,"ENVO":2},"ex":[{"id":"CHEBI:17234","label":"glucose"},{"id":"CHEBI:33709","label":"amino acid"},{"id":"CHEBI:18276","label":"dihydrogen"}]},{"a":"CommunityMech","b":"CultureMech","n":153,"by":{"CHEBI":140,"NCBITaxon":6,"ENVO":5,"DOI":2},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:18276","label":"dihydrogen"},{"id":"CHEBI:30089","label":"acetate"}]},{"a":"TraitMech","b":"CellStructureMech","n":95,"by":{"GO":31,"NCBITaxon":27,"DOI":17,"CHEBI":6,"UniProt":6,"METPO":5,"InterPro":3},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:83333","label":"Escherichia coli (strain K12)"},{"id":"GO:0009288","label":"bacterial-type flagellum"}]},{"a":"TraitMech","b":"ProteinTraitsMech","n":679,"by":{"GO":212,"NCBITaxon":115,"CHEBI":109,"METPO":90,"DOI":58,"UniProt":49,"InterPro":46},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"METPO:1000631","label":"trophic type"}]},{"a":"TraitMech","b":"NaturalProductMech","n":45,"by":{"NCBITaxon":40,"CHEBI":4,"DOI":1},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"},{"id":"NCBITaxon:287","label":"Pseudomonas aeruginosa"}]},{"a":"TraitMech","b":"AntibioticMech","n":24,"by":{"NCBITaxon":14,"CHEBI":10},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"TraitMech","b":"MediaIngredientMech","n":57,"by":{"CHEBI":57},"ex":[{"id":"CHEBI:17234","label":"glucose"},{"id":"CHEBI:18276","label":"dihydrogen"},{"id":"CHEBI:16526","label":"carbon dioxide"}]},{"a":"TraitMech","b":"CultureMech","n":36,"by":{"CHEBI":26,"NCBITaxon":10},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:18276","label":"dihydrogen"},{"id":"CHEBI:17234","label":"glucose"}]},{"a":"CellStructureMech","b":"ProteinTraitsMech","n":374,"by":{"UniProt":137,"GO":109,"DOI":57,"NCBITaxon":36,"InterPro":20,"Pfam":8,"CHEBI":7},"ex":[{"id":"NCBITaxon:99287","label":"Salmonella typhimurium (strain LT2 / SGSC1412 / ATCC 700720)"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:90371","label":"Salmonella enterica subsp. enterica serovar Typhimurium"}]},{"a":"CellStructureMech","b":"NaturalProductMech","n":10,"by":{"NCBITaxon":10},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"},{"id":"NCBITaxon:224308","label":"Bacillus subtilis (strain 168)"}]},{"a":"CellStructureMech","b":"AntibioticMech","n":6,"by":{"NCBITaxon":6},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"},{"id":"NCBITaxon:274","label":"Thermus thermophilus"}]},{"a":"CellStructureMech","b":"MediaIngredientMech","n":5,"by":{"CHEBI":5},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:17544","label":"hydrogencarbonate"},{"id":"CHEBI:18248","label":"iron atom"}]},{"a":"CellStructureMech","b":"CultureMech","n":4,"by":{"NCBITaxon":2,"CHEBI":2},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"NCBITaxon:1148","label":"Synechocystis sp. PCC 6803"},{"id":"CHEBI:18248","label":"iron atom"}]},{"a":"ProteinTraitsMech","b":"NaturalProductMech","n":830,"by":{"NCBITaxon":469,"CHEBI":140,"UniProt":133,"DOI":88},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:100226","label":"Streptomyces coelicolor A3(2)"},{"id":"NCBITaxon:227321","label":"Emericella nidulans (strain FGSC A4 / ATCC 38163 / CBS 112.46 / NRRL 194 / M139)"}]},{"a":"ProteinTraitsMech","b":"AntibioticMech","n":2442,"by":{"ARO":1753,"CHEBI":595,"NCBITaxon":70,"UniProt":20,"DOI":2,"GO":2},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"CHEBI:35681","label":"secondary alcohol"},{"id":"NCBITaxon:2697049","label":"Severe acute respiratory syndrome coronavirus 2"}]},{"a":"ProteinTraitsMech","b":"MediaIngredientMech","n":790,"by":{"CHEBI":789,"UBERON":1},"ex":[{"id":"CHEBI:15377","label":"water"},{"id":"CHEBI:15740","label":"formate"},{"id":"CHEBI:33709","label":"amino acid"}]},{"a":"ProteinTraitsMech","b":"CultureMech","n":233,"by":{"CHEBI":221,"NCBITaxon":10,"UBERON":2},"ex":[{"id":"CHEBI:15377","label":"water"},{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:17754","label":"glycerol"}]},{"a":"NaturalProductMech","b":"AntibioticMech","n":272,"by":{"CHEBI":176,"NCBITaxon":85,"DOI":10,"UniProt":1},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:330879","label":"Aspergillus fumigatus (strain ATCC MYA-4609 / CBS 101355 / FGSC A1100 / Af293)"},{"id":"NCBITaxon:5518","label":"Fusarium graminearum"}]},{"a":"NaturalProductMech","b":"MediaIngredientMech","n":48,"by":{"CHEBI":48},"ex":[{"id":"CHEBI:15956","label":"biotin"},{"id":"CHEBI:16349","label":"L-citrulline"},{"id":"CHEBI:27592","label":"ectoine"}]},{"a":"NaturalProductMech","b":"CultureMech","n":5,"by":{"CHEBI":3,"NCBITaxon":2},"ex":[{"id":"CHEBI:15956","label":"biotin"},{"id":"CHEBI:16349","label":"L-citrulline"},{"id":"CHEBI:27592","label":"ectoine"}]},{"a":"AntibioticMech","b":"MediaIngredientMech","n":322,"by":{"CHEBI":322},"ex":[{"id":"CHEBI:33709","label":"amino acid"},{"id":"CHEBI:30746","label":"benzoic acid"},{"id":"CHEBI:17334","label":"penicillin"}]},{"a":"AntibioticMech","b":"CultureMech","n":29,"by":{"CHEBI":29},"ex":[{"id":"CHEBI:17334","label":"penicillin"},{"id":"CHEBI:48923","label":"erythromycin"},{"id":"CHEBI:30746","label":"benzoic acid"}]},{"a":"MediaIngredientMech","b":"CultureMech","n":607,"by":{"CHEBI":543,"KEGG":53,"FOODON":6,"UBERON":3,"ENVO":1,"CAS":1},"ex":[{"id":"FOODON:03315426","label":"yeast extract"},{"id":"CHEBI:17234","label":"glucose"},{"id":"CHEBI:2509","label":"agar"}]}]} \ No newline at end of file diff --git a/_fleet/mechs_template.md b/_fleet/mechs_template.md index a8aa92c..3ff51f9 100644 --- a/_fleet/mechs_template.md +++ b/_fleet/mechs_template.md @@ -100,11 +100,11 @@ Alongside record browsing, the Mechs publish complementary ways to explore their ## Shared vocabulary -The Mechs are joinable because they ground records in the same public ontologies. The table counts identifier occurrences per vocabulary in each Mech's record corpus; darker cells mean more. Click a Mech name to open it, a cell to list the records behind it, or a column heading to filter the graph to that vocabulary. +The Mechs are joinable because they ground records in the same public ontologies. The table counts identifier occurrences per vocabulary in each Mech's record corpus; darker cells mean more. Columns run from the most widely shared vocabulary to the least, so the left edge is the fleet's common ground and the right edge is what a single Mech needs alone. Click a Mech name to open it, a cell to list the records behind it, or a column heading to filter the graph to that vocabulary.
-

This earlier September 2026 vocabulary census was not recomputed with the September 15 site refresh and covers nine Mechs; TaxonMech is a fleet member whose vocabulary census has not yet been measured. Counts are prefix occurrences in the canonical record directories (merged recipes for CultureMech, communities for CommunityMech, habitat records for HabitatMech) as of September 2026. ChEBI binds the chemistry arm (media, ingredients, antibiotics, proteins); NCBITaxon and ENVO bind the organism arm (habitat, community, traits); GO and METPO bridge phenotype, structure and protein.

+

This earlier September 2026 vocabulary census was not recomputed with the September 15 site refresh and covers nine Mechs; TaxonMech is a fleet member whose vocabulary census has not yet been measured. Counts are prefix occurrences in the canonical record directories (merged recipes for CultureMech, communities for CommunityMech, habitat records for HabitatMech) as of September 2026. Columns are ordered by how many Mechs ground anything in each vocabulary, then by the total records citing it across the fleet; PMID and DOI sit at the right because every Mech cites literature. ChEBI binds the chemistry arm (media, ingredients, antibiotics, proteins); NCBITaxon and ENVO bind the organism arm (habitat, community, traits); GO and METPO bridge phenotype, structure and protein.

## How the Mechs reference each other diff --git a/mechs.md b/mechs.md index acb2f66..3dff2ae 100644 --- a/mechs.md +++ b/mechs.md @@ -352,7 +352,7 @@ The X-Mech suite is a fleet of 10 curated, ontology-grounded knowledge bases tha "use strict"; if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); } function init() { - var DATA = {"order":["HabitatMech","CommunityMech","TraitMech","CellStructureMech","ProteinTraitsMech","NaturalProductMech","AntibioticMech","MediaIngredientMech","CultureMech"],"voc":["CHEBI","NCBITaxon","GO","ENVO","METPO","ARO","UniProt","InterPro","Pfam","RHEA","PDB","PATO","UBERON","FOODON","BTO","GTDB","KEGG","CAS","MIBiG","NPAtlas","PMID","DOI"],"heat":{"HabitatMech":{"CHEBI":18,"NCBITaxon":13222,"GO":2,"ENVO":3183,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":4,"UBERON":1089,"FOODON":194,"BTO":1353,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":513,"DOI":112},"CommunityMech":{"CHEBI":2221,"NCBITaxon":3060,"GO":862,"ENVO":366,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":9,"FOODON":0,"BTO":0,"GTDB":1674,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":4812,"DOI":1123},"TraitMech":{"CHEBI":666,"NCBITaxon":844,"GO":809,"ENVO":22,"METPO":3195,"ARO":0,"UniProt":389,"InterPro":113,"Pfam":0,"RHEA":0,"PDB":0,"PATO":97,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":412,"DOI":5319},"CellStructureMech":{"CHEBI":18,"NCBITaxon":351,"GO":398,"ENVO":0,"METPO":14,"ARO":0,"UniProt":238,"InterPro":38,"Pfam":17,"RHEA":0,"PDB":4,"PATO":0,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":205,"DOI":1343},"ProteinTraitsMech":{"CHEBI":373461,"NCBITaxon":357752,"GO":417184,"ENVO":0,"METPO":244,"ARO":194924,"UniProt":656717,"InterPro":1477316,"Pfam":520297,"RHEA":613318,"PDB":235943,"PATO":110,"UBERON":43,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":245,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":654089,"DOI":187928},"NaturalProductMech":{"CHEBI":1587,"NCBITaxon":13718,"GO":0,"ENVO":0,"METPO":0,"ARO":0,"UniProt":1116,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":10175,"NPAtlas":1756,"PMID":5734,"DOI":8320},"AntibioticMech":{"CHEBI":22066,"NCBITaxon":611,"GO":3,"ENVO":0,"METPO":0,"ARO":16653,"UniProt":278,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":6,"PATO":0,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":1835,"MIBiG":0,"NPAtlas":0,"PMID":1207,"DOI":126},"MediaIngredientMech":{"CHEBI":7681,"NCBITaxon":1,"GO":0,"ENVO":110,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":22,"FOODON":270,"BTO":3,"GTDB":0,"KEGG":53,"CAS":661,"MIBiG":0,"NPAtlas":0,"PMID":29,"DOI":5},"CultureMech":{"CHEBI":160660,"NCBITaxon":63,"GO":0,"ENVO":13,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":138,"FOODON":214,"BTO":0,"GTDB":0,"KEGG":1406,"CAS":1,"MIBiG":0,"NPAtlas":0,"PMID":68,"DOI":76}},"cells":{"HabitatMech--NCBITaxon":895,"HabitatMech--ENVO":1263,"HabitatMech--CHEBI":9,"HabitatMech--UBERON":702,"HabitatMech--PATO":3,"HabitatMech--FOODON":85,"HabitatMech--BTO":581,"HabitatMech--GO":1,"CommunityMech--CHEBI":279,"CommunityMech--NCBITaxon":330,"CommunityMech--ENVO":319,"CommunityMech--GO":205,"CommunityMech--GTDB":313,"CommunityMech--UBERON":9,"TraitMech--NCBITaxon":344,"TraitMech--GO":232,"TraitMech--METPO":471,"TraitMech--CHEBI":180,"TraitMech--InterPro":59,"TraitMech--UniProt":176,"TraitMech--ENVO":14,"TraitMech--PATO":47,"CellStructureMech--NCBITaxon":57,"CellStructureMech--UniProt":37,"CellStructureMech--GO":57,"CellStructureMech--InterPro":13,"CellStructureMech--METPO":5,"CellStructureMech--PDB":1,"CellStructureMech--CHEBI":8,"CellStructureMech--Pfam":6,"ProteinTraitsMech--GO":110801,"ProteinTraitsMech--CHEBI":29847,"ProteinTraitsMech--METPO":119,"ProteinTraitsMech--UniProt":159304,"ProteinTraitsMech--RHEA":29506,"ProteinTraitsMech--KEGG":231,"ProteinTraitsMech--NCBITaxon":98152,"ProteinTraitsMech--Pfam":107564,"ProteinTraitsMech--InterPro":120094,"ProteinTraitsMech--UBERON":43,"ProteinTraitsMech--PATO":69,"ProteinTraitsMech--ARO":7452,"ProteinTraitsMech--PDB":51717,"NaturalProductMech--NCBITaxon":3115,"NaturalProductMech--MIBiG":3115,"NaturalProductMech--NPAtlas":1740,"NaturalProductMech--CHEBI":371,"NaturalProductMech--UniProt":142,"AntibioticMech--CAS":1804,"AntibioticMech--CHEBI":2795,"AntibioticMech--ARO":568,"AntibioticMech--NCBITaxon":134,"AntibioticMech--UniProt":47,"AntibioticMech--PDB":5,"AntibioticMech--GO":3,"MediaIngredientMech--CHEBI":2224,"MediaIngredientMech--CAS":267,"MediaIngredientMech--KEGG":53,"MediaIngredientMech--FOODON":99,"MediaIngredientMech--ENVO":26,"MediaIngredientMech--UBERON":9,"MediaIngredientMech--BTO":1,"MediaIngredientMech--NCBITaxon":1,"CultureMech--CHEBI":6123,"CultureMech--FOODON":200,"CultureMech--UBERON":72,"CultureMech--NCBITaxon":30,"CultureMech--ENVO":12,"CultureMech--KEGG":329,"CultureMech--CAS":1},"vocab_edges":[{"a":"HabitatMech","b":"CommunityMech","n":258,"by":{"NCBITaxon":213,"ENVO":40,"UBERON":4,"CHEBI":1},"ex":[{"id":"NCBITaxon:2","label":"Bacteria"},{"id":"ENVO:00002123","label":"bioreactor"},{"id":"NCBITaxon:306","label":"Pseudomonas sp."}]},{"a":"HabitatMech","b":"TraitMech","n":103,"by":{"NCBITaxon":95,"ENVO":4,"PATO":2,"DOI":2},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"HabitatMech","b":"CellStructureMech","n":26,"by":{"NCBITaxon":26},"ex":[{"id":"NCBITaxon:2","label":"Bacteria"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"HabitatMech","b":"ProteinTraitsMech","n":1244,"by":{"NCBITaxon":1230,"UBERON":12,"CHEBI":1,"GO":1},"ex":[{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1869227","label":"bacterium"}]},{"a":"HabitatMech","b":"NaturalProductMech","n":311,"by":{"NCBITaxon":311},"ex":[{"id":"NCBITaxon:56","label":"Sorangium cellulosum"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1931","label":"Streptomyces sp."}]},{"a":"HabitatMech","b":"AntibioticMech","n":23,"by":{"NCBITaxon":23},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"HabitatMech","b":"MediaIngredientMech","n":20,"by":{"ENVO":15,"UBERON":4,"CHEBI":1},"ex":[{"id":"ENVO:00002149","label":"sea water"},{"id":"ENVO:00001998","label":"soil"},{"id":"ENVO:00002263","label":"garden soil"}]},{"a":"HabitatMech","b":"CultureMech","n":25,"by":{"NCBITaxon":13,"ENVO":7,"UBERON":4,"FOODON":1},"ex":[{"id":"UBERON:0000948","label":"heart"},{"id":"UBERON:0000955","label":"brain"},{"id":"UBERON:0000178","label":"blood"}]},{"a":"CommunityMech","b":"TraitMech","n":135,"by":{"CHEBI":58,"NCBITaxon":47,"GO":30},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:15379","label":"dioxygen"},{"id":"GO:0015977","label":"carbon fixation"}]},{"a":"CommunityMech","b":"CellStructureMech","n":35,"by":{"NCBITaxon":22,"CHEBI":7,"GO":6},"ex":[{"id":"NCBITaxon:2","label":"Bacteria"},{"id":"NCBITaxon:2157","label":"Archaea"},{"id":"NCBITaxon:562","label":"Escherichia coli"}]},{"a":"CommunityMech","b":"ProteinTraitsMech","n":635,"by":{"CHEBI":266,"NCBITaxon":187,"GO":181,"UBERON":1},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:30089","label":"acetate"},{"id":"CHEBI:18276","label":"dihydrogen"}]},{"a":"CommunityMech","b":"NaturalProductMech","n":98,"by":{"NCBITaxon":92,"CHEBI":6},"ex":[{"id":"NCBITaxon:306","label":"Pseudomonas sp."},{"id":"NCBITaxon:286","label":"Pseudomonas"},{"id":"NCBITaxon:562","label":"Escherichia coli"}]},{"a":"CommunityMech","b":"AntibioticMech","n":51,"by":{"CHEBI":38,"NCBITaxon":13},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"CHEBI:33709","label":"amino acid"},{"id":"NCBITaxon:4932","label":"Saccharomyces cerevisiae"}]},{"a":"CommunityMech","b":"MediaIngredientMech","n":234,"by":{"CHEBI":232,"ENVO":2},"ex":[{"id":"CHEBI:17234","label":"glucose"},{"id":"CHEBI:33709","label":"amino acid"},{"id":"CHEBI:18276","label":"dihydrogen"}]},{"a":"CommunityMech","b":"CultureMech","n":153,"by":{"CHEBI":140,"NCBITaxon":6,"ENVO":5,"DOI":2},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:18276","label":"dihydrogen"},{"id":"CHEBI:30089","label":"acetate"}]},{"a":"TraitMech","b":"CellStructureMech","n":95,"by":{"GO":31,"NCBITaxon":27,"DOI":17,"CHEBI":6,"UniProt":6,"METPO":5,"InterPro":3},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:83333","label":"Escherichia coli (strain K12)"},{"id":"GO:0009288","label":"bacterial-type flagellum"}]},{"a":"TraitMech","b":"ProteinTraitsMech","n":679,"by":{"GO":212,"NCBITaxon":115,"CHEBI":109,"METPO":90,"DOI":58,"UniProt":49,"InterPro":46},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"METPO:1000631","label":"trophic type"}]},{"a":"TraitMech","b":"NaturalProductMech","n":45,"by":{"NCBITaxon":40,"CHEBI":4,"DOI":1},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"},{"id":"NCBITaxon:287","label":"Pseudomonas aeruginosa"}]},{"a":"TraitMech","b":"AntibioticMech","n":24,"by":{"NCBITaxon":14,"CHEBI":10},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"TraitMech","b":"MediaIngredientMech","n":57,"by":{"CHEBI":57},"ex":[{"id":"CHEBI:17234","label":"glucose"},{"id":"CHEBI:18276","label":"dihydrogen"},{"id":"CHEBI:16526","label":"carbon dioxide"}]},{"a":"TraitMech","b":"CultureMech","n":36,"by":{"CHEBI":26,"NCBITaxon":10},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:18276","label":"dihydrogen"},{"id":"CHEBI:17234","label":"glucose"}]},{"a":"CellStructureMech","b":"ProteinTraitsMech","n":374,"by":{"UniProt":137,"GO":109,"DOI":57,"NCBITaxon":36,"InterPro":20,"Pfam":8,"CHEBI":7},"ex":[{"id":"NCBITaxon:99287","label":"Salmonella typhimurium (strain LT2 / SGSC1412 / ATCC 700720)"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:90371","label":"Salmonella enterica subsp. enterica serovar Typhimurium"}]},{"a":"CellStructureMech","b":"NaturalProductMech","n":10,"by":{"NCBITaxon":10},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"},{"id":"NCBITaxon:224308","label":"Bacillus subtilis (strain 168)"}]},{"a":"CellStructureMech","b":"AntibioticMech","n":6,"by":{"NCBITaxon":6},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"},{"id":"NCBITaxon:274","label":"Thermus thermophilus"}]},{"a":"CellStructureMech","b":"MediaIngredientMech","n":5,"by":{"CHEBI":5},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:17544","label":"hydrogencarbonate"},{"id":"CHEBI:18248","label":"iron atom"}]},{"a":"CellStructureMech","b":"CultureMech","n":4,"by":{"NCBITaxon":2,"CHEBI":2},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"NCBITaxon:1148","label":"Synechocystis sp. PCC 6803"},{"id":"CHEBI:18248","label":"iron atom"}]},{"a":"ProteinTraitsMech","b":"NaturalProductMech","n":830,"by":{"NCBITaxon":469,"CHEBI":140,"UniProt":133,"DOI":88},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:100226","label":"Streptomyces coelicolor A3(2)"},{"id":"NCBITaxon:227321","label":"Emericella nidulans (strain FGSC A4 / ATCC 38163 / CBS 112.46 / NRRL 194 / M139)"}]},{"a":"ProteinTraitsMech","b":"AntibioticMech","n":2442,"by":{"ARO":1753,"CHEBI":595,"NCBITaxon":70,"UniProt":20,"DOI":2,"GO":2},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"CHEBI:35681","label":"secondary alcohol"},{"id":"NCBITaxon:2697049","label":"Severe acute respiratory syndrome coronavirus 2"}]},{"a":"ProteinTraitsMech","b":"MediaIngredientMech","n":790,"by":{"CHEBI":789,"UBERON":1},"ex":[{"id":"CHEBI:15377","label":"water"},{"id":"CHEBI:15740","label":"formate"},{"id":"CHEBI:33709","label":"amino acid"}]},{"a":"ProteinTraitsMech","b":"CultureMech","n":233,"by":{"CHEBI":221,"NCBITaxon":10,"UBERON":2},"ex":[{"id":"CHEBI:15377","label":"water"},{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:17754","label":"glycerol"}]},{"a":"NaturalProductMech","b":"AntibioticMech","n":272,"by":{"CHEBI":176,"NCBITaxon":85,"DOI":10,"UniProt":1},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:330879","label":"Aspergillus fumigatus (strain ATCC MYA-4609 / CBS 101355 / FGSC A1100 / Af293)"},{"id":"NCBITaxon:5518","label":"Fusarium graminearum"}]},{"a":"NaturalProductMech","b":"MediaIngredientMech","n":48,"by":{"CHEBI":48},"ex":[{"id":"CHEBI:15956","label":"biotin"},{"id":"CHEBI:16349","label":"L-citrulline"},{"id":"CHEBI:27592","label":"ectoine"}]},{"a":"NaturalProductMech","b":"CultureMech","n":5,"by":{"CHEBI":3,"NCBITaxon":2},"ex":[{"id":"CHEBI:15956","label":"biotin"},{"id":"CHEBI:16349","label":"L-citrulline"},{"id":"CHEBI:27592","label":"ectoine"}]},{"a":"AntibioticMech","b":"MediaIngredientMech","n":322,"by":{"CHEBI":322},"ex":[{"id":"CHEBI:33709","label":"amino acid"},{"id":"CHEBI:30746","label":"benzoic acid"},{"id":"CHEBI:17334","label":"penicillin"}]},{"a":"AntibioticMech","b":"CultureMech","n":29,"by":{"CHEBI":29},"ex":[{"id":"CHEBI:17334","label":"penicillin"},{"id":"CHEBI:48923","label":"erythromycin"},{"id":"CHEBI:30746","label":"benzoic acid"}]},{"a":"MediaIngredientMech","b":"CultureMech","n":607,"by":{"CHEBI":543,"KEGG":53,"FOODON":6,"UBERON":3,"ENVO":1,"CAS":1},"ex":[{"id":"FOODON:03315426","label":"yeast extract"},{"id":"CHEBI:17234","label":"glucose"},{"id":"CHEBI:2509","label":"agar"}]}]}; + var DATA = {"order":["HabitatMech","CommunityMech","TraitMech","CellStructureMech","ProteinTraitsMech","NaturalProductMech","AntibioticMech","MediaIngredientMech","CultureMech"],"voc":["NCBITaxon","CHEBI","GO","UniProt","ENVO","UBERON","InterPro","PDB","CAS","KEGG","METPO","FOODON","PATO","Pfam","ARO","BTO","RHEA","MIBiG","NPAtlas","GTDB","PMID","DOI"],"heat":{"HabitatMech":{"CHEBI":18,"NCBITaxon":13222,"GO":2,"ENVO":3183,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":4,"UBERON":1089,"FOODON":194,"BTO":1353,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":513,"DOI":112},"CommunityMech":{"CHEBI":2221,"NCBITaxon":3060,"GO":862,"ENVO":366,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":9,"FOODON":0,"BTO":0,"GTDB":1674,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":4812,"DOI":1123},"TraitMech":{"CHEBI":666,"NCBITaxon":844,"GO":809,"ENVO":22,"METPO":3195,"ARO":0,"UniProt":389,"InterPro":113,"Pfam":0,"RHEA":0,"PDB":0,"PATO":97,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":412,"DOI":5319},"CellStructureMech":{"CHEBI":18,"NCBITaxon":351,"GO":398,"ENVO":0,"METPO":14,"ARO":0,"UniProt":238,"InterPro":38,"Pfam":17,"RHEA":0,"PDB":4,"PATO":0,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":205,"DOI":1343},"ProteinTraitsMech":{"CHEBI":373461,"NCBITaxon":357752,"GO":417184,"ENVO":0,"METPO":244,"ARO":194924,"UniProt":656717,"InterPro":1477316,"Pfam":520297,"RHEA":613318,"PDB":235943,"PATO":110,"UBERON":43,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":245,"CAS":0,"MIBiG":0,"NPAtlas":0,"PMID":654089,"DOI":187928},"NaturalProductMech":{"CHEBI":1587,"NCBITaxon":13718,"GO":0,"ENVO":0,"METPO":0,"ARO":0,"UniProt":1116,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":0,"MIBiG":10175,"NPAtlas":1756,"PMID":5734,"DOI":8320},"AntibioticMech":{"CHEBI":22066,"NCBITaxon":611,"GO":3,"ENVO":0,"METPO":0,"ARO":16653,"UniProt":278,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":6,"PATO":0,"UBERON":0,"FOODON":0,"BTO":0,"GTDB":0,"KEGG":0,"CAS":1835,"MIBiG":0,"NPAtlas":0,"PMID":1207,"DOI":126},"MediaIngredientMech":{"CHEBI":7681,"NCBITaxon":1,"GO":0,"ENVO":110,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":22,"FOODON":270,"BTO":3,"GTDB":0,"KEGG":53,"CAS":661,"MIBiG":0,"NPAtlas":0,"PMID":29,"DOI":5},"CultureMech":{"CHEBI":160660,"NCBITaxon":63,"GO":0,"ENVO":13,"METPO":0,"ARO":0,"UniProt":0,"InterPro":0,"Pfam":0,"RHEA":0,"PDB":0,"PATO":0,"UBERON":138,"FOODON":214,"BTO":0,"GTDB":0,"KEGG":1406,"CAS":1,"MIBiG":0,"NPAtlas":0,"PMID":68,"DOI":76}},"cells":{"HabitatMech--NCBITaxon":895,"HabitatMech--ENVO":1263,"HabitatMech--CHEBI":9,"HabitatMech--UBERON":702,"HabitatMech--PATO":3,"HabitatMech--FOODON":85,"HabitatMech--BTO":581,"HabitatMech--GO":1,"CommunityMech--CHEBI":279,"CommunityMech--NCBITaxon":330,"CommunityMech--ENVO":319,"CommunityMech--GO":205,"CommunityMech--GTDB":313,"CommunityMech--UBERON":9,"TraitMech--NCBITaxon":344,"TraitMech--GO":232,"TraitMech--METPO":471,"TraitMech--CHEBI":180,"TraitMech--InterPro":59,"TraitMech--UniProt":176,"TraitMech--ENVO":14,"TraitMech--PATO":47,"CellStructureMech--NCBITaxon":57,"CellStructureMech--UniProt":37,"CellStructureMech--GO":57,"CellStructureMech--InterPro":13,"CellStructureMech--METPO":5,"CellStructureMech--PDB":1,"CellStructureMech--CHEBI":8,"CellStructureMech--Pfam":6,"ProteinTraitsMech--GO":110801,"ProteinTraitsMech--CHEBI":29847,"ProteinTraitsMech--METPO":119,"ProteinTraitsMech--UniProt":159304,"ProteinTraitsMech--RHEA":29506,"ProteinTraitsMech--KEGG":231,"ProteinTraitsMech--NCBITaxon":98152,"ProteinTraitsMech--Pfam":107564,"ProteinTraitsMech--InterPro":120094,"ProteinTraitsMech--UBERON":43,"ProteinTraitsMech--PATO":69,"ProteinTraitsMech--ARO":7452,"ProteinTraitsMech--PDB":51717,"NaturalProductMech--NCBITaxon":3115,"NaturalProductMech--MIBiG":3115,"NaturalProductMech--NPAtlas":1740,"NaturalProductMech--CHEBI":371,"NaturalProductMech--UniProt":142,"AntibioticMech--CAS":1804,"AntibioticMech--CHEBI":2795,"AntibioticMech--ARO":568,"AntibioticMech--NCBITaxon":134,"AntibioticMech--UniProt":47,"AntibioticMech--PDB":5,"AntibioticMech--GO":3,"MediaIngredientMech--CHEBI":2224,"MediaIngredientMech--CAS":267,"MediaIngredientMech--KEGG":53,"MediaIngredientMech--FOODON":99,"MediaIngredientMech--ENVO":26,"MediaIngredientMech--UBERON":9,"MediaIngredientMech--BTO":1,"MediaIngredientMech--NCBITaxon":1,"CultureMech--CHEBI":6123,"CultureMech--FOODON":200,"CultureMech--UBERON":72,"CultureMech--NCBITaxon":30,"CultureMech--ENVO":12,"CultureMech--KEGG":329,"CultureMech--CAS":1},"vocab_edges":[{"a":"HabitatMech","b":"CommunityMech","n":258,"by":{"NCBITaxon":213,"ENVO":40,"UBERON":4,"CHEBI":1},"ex":[{"id":"NCBITaxon:2","label":"Bacteria"},{"id":"ENVO:00002123","label":"bioreactor"},{"id":"NCBITaxon:306","label":"Pseudomonas sp."}]},{"a":"HabitatMech","b":"TraitMech","n":103,"by":{"NCBITaxon":95,"ENVO":4,"PATO":2,"DOI":2},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"HabitatMech","b":"CellStructureMech","n":26,"by":{"NCBITaxon":26},"ex":[{"id":"NCBITaxon:2","label":"Bacteria"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"HabitatMech","b":"ProteinTraitsMech","n":1244,"by":{"NCBITaxon":1230,"UBERON":12,"CHEBI":1,"GO":1},"ex":[{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1869227","label":"bacterium"}]},{"a":"HabitatMech","b":"NaturalProductMech","n":311,"by":{"NCBITaxon":311},"ex":[{"id":"NCBITaxon:56","label":"Sorangium cellulosum"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1931","label":"Streptomyces sp."}]},{"a":"HabitatMech","b":"AntibioticMech","n":23,"by":{"NCBITaxon":23},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"HabitatMech","b":"MediaIngredientMech","n":20,"by":{"ENVO":15,"UBERON":4,"CHEBI":1},"ex":[{"id":"ENVO:00002149","label":"sea water"},{"id":"ENVO:00001998","label":"soil"},{"id":"ENVO:00002263","label":"garden soil"}]},{"a":"HabitatMech","b":"CultureMech","n":25,"by":{"NCBITaxon":13,"ENVO":7,"UBERON":4,"FOODON":1},"ex":[{"id":"UBERON:0000948","label":"heart"},{"id":"UBERON:0000955","label":"brain"},{"id":"UBERON:0000178","label":"blood"}]},{"a":"CommunityMech","b":"TraitMech","n":135,"by":{"CHEBI":58,"NCBITaxon":47,"GO":30},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:15379","label":"dioxygen"},{"id":"GO:0015977","label":"carbon fixation"}]},{"a":"CommunityMech","b":"CellStructureMech","n":35,"by":{"NCBITaxon":22,"CHEBI":7,"GO":6},"ex":[{"id":"NCBITaxon:2","label":"Bacteria"},{"id":"NCBITaxon:2157","label":"Archaea"},{"id":"NCBITaxon:562","label":"Escherichia coli"}]},{"a":"CommunityMech","b":"ProteinTraitsMech","n":635,"by":{"CHEBI":266,"NCBITaxon":187,"GO":181,"UBERON":1},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:30089","label":"acetate"},{"id":"CHEBI:18276","label":"dihydrogen"}]},{"a":"CommunityMech","b":"NaturalProductMech","n":98,"by":{"NCBITaxon":92,"CHEBI":6},"ex":[{"id":"NCBITaxon:306","label":"Pseudomonas sp."},{"id":"NCBITaxon:286","label":"Pseudomonas"},{"id":"NCBITaxon:562","label":"Escherichia coli"}]},{"a":"CommunityMech","b":"AntibioticMech","n":51,"by":{"CHEBI":38,"NCBITaxon":13},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"CHEBI:33709","label":"amino acid"},{"id":"NCBITaxon:4932","label":"Saccharomyces cerevisiae"}]},{"a":"CommunityMech","b":"MediaIngredientMech","n":234,"by":{"CHEBI":232,"ENVO":2},"ex":[{"id":"CHEBI:17234","label":"glucose"},{"id":"CHEBI:33709","label":"amino acid"},{"id":"CHEBI:18276","label":"dihydrogen"}]},{"a":"CommunityMech","b":"CultureMech","n":153,"by":{"CHEBI":140,"NCBITaxon":6,"ENVO":5,"DOI":2},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:18276","label":"dihydrogen"},{"id":"CHEBI:30089","label":"acetate"}]},{"a":"TraitMech","b":"CellStructureMech","n":95,"by":{"GO":31,"NCBITaxon":27,"DOI":17,"CHEBI":6,"UniProt":6,"METPO":5,"InterPro":3},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:83333","label":"Escherichia coli (strain K12)"},{"id":"GO:0009288","label":"bacterial-type flagellum"}]},{"a":"TraitMech","b":"ProteinTraitsMech","n":679,"by":{"GO":212,"NCBITaxon":115,"CHEBI":109,"METPO":90,"DOI":58,"UniProt":49,"InterPro":46},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"METPO:1000631","label":"trophic type"}]},{"a":"TraitMech","b":"NaturalProductMech","n":45,"by":{"NCBITaxon":40,"CHEBI":4,"DOI":1},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"},{"id":"NCBITaxon:287","label":"Pseudomonas aeruginosa"}]},{"a":"TraitMech","b":"AntibioticMech","n":24,"by":{"NCBITaxon":14,"CHEBI":10},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1280","label":"Staphylococcus aureus"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"}]},{"a":"TraitMech","b":"MediaIngredientMech","n":57,"by":{"CHEBI":57},"ex":[{"id":"CHEBI:17234","label":"glucose"},{"id":"CHEBI:18276","label":"dihydrogen"},{"id":"CHEBI:16526","label":"carbon dioxide"}]},{"a":"TraitMech","b":"CultureMech","n":36,"by":{"CHEBI":26,"NCBITaxon":10},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:18276","label":"dihydrogen"},{"id":"CHEBI:17234","label":"glucose"}]},{"a":"CellStructureMech","b":"ProteinTraitsMech","n":374,"by":{"UniProt":137,"GO":109,"DOI":57,"NCBITaxon":36,"InterPro":20,"Pfam":8,"CHEBI":7},"ex":[{"id":"NCBITaxon:99287","label":"Salmonella typhimurium (strain LT2 / SGSC1412 / ATCC 700720)"},{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:90371","label":"Salmonella enterica subsp. enterica serovar Typhimurium"}]},{"a":"CellStructureMech","b":"NaturalProductMech","n":10,"by":{"NCBITaxon":10},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"},{"id":"NCBITaxon:224308","label":"Bacillus subtilis (strain 168)"}]},{"a":"CellStructureMech","b":"AntibioticMech","n":6,"by":{"NCBITaxon":6},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:1423","label":"Bacillus subtilis"},{"id":"NCBITaxon:274","label":"Thermus thermophilus"}]},{"a":"CellStructureMech","b":"MediaIngredientMech","n":5,"by":{"CHEBI":5},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:17544","label":"hydrogencarbonate"},{"id":"CHEBI:18248","label":"iron atom"}]},{"a":"CellStructureMech","b":"CultureMech","n":4,"by":{"NCBITaxon":2,"CHEBI":2},"ex":[{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"NCBITaxon:1148","label":"Synechocystis sp. PCC 6803"},{"id":"CHEBI:18248","label":"iron atom"}]},{"a":"ProteinTraitsMech","b":"NaturalProductMech","n":830,"by":{"NCBITaxon":469,"CHEBI":140,"UniProt":133,"DOI":88},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:100226","label":"Streptomyces coelicolor A3(2)"},{"id":"NCBITaxon:227321","label":"Emericella nidulans (strain FGSC A4 / ATCC 38163 / CBS 112.46 / NRRL 194 / M139)"}]},{"a":"ProteinTraitsMech","b":"AntibioticMech","n":2442,"by":{"ARO":1753,"CHEBI":595,"NCBITaxon":70,"UniProt":20,"DOI":2,"GO":2},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"CHEBI:35681","label":"secondary alcohol"},{"id":"NCBITaxon:2697049","label":"Severe acute respiratory syndrome coronavirus 2"}]},{"a":"ProteinTraitsMech","b":"MediaIngredientMech","n":790,"by":{"CHEBI":789,"UBERON":1},"ex":[{"id":"CHEBI:15377","label":"water"},{"id":"CHEBI:15740","label":"formate"},{"id":"CHEBI:33709","label":"amino acid"}]},{"a":"ProteinTraitsMech","b":"CultureMech","n":233,"by":{"CHEBI":221,"NCBITaxon":10,"UBERON":2},"ex":[{"id":"CHEBI:15377","label":"water"},{"id":"CHEBI:16526","label":"carbon dioxide"},{"id":"CHEBI:17754","label":"glycerol"}]},{"a":"NaturalProductMech","b":"AntibioticMech","n":272,"by":{"CHEBI":176,"NCBITaxon":85,"DOI":10,"UniProt":1},"ex":[{"id":"NCBITaxon:562","label":"Escherichia coli"},{"id":"NCBITaxon:330879","label":"Aspergillus fumigatus (strain ATCC MYA-4609 / CBS 101355 / FGSC A1100 / Af293)"},{"id":"NCBITaxon:5518","label":"Fusarium graminearum"}]},{"a":"NaturalProductMech","b":"MediaIngredientMech","n":48,"by":{"CHEBI":48},"ex":[{"id":"CHEBI:15956","label":"biotin"},{"id":"CHEBI:16349","label":"L-citrulline"},{"id":"CHEBI:27592","label":"ectoine"}]},{"a":"NaturalProductMech","b":"CultureMech","n":5,"by":{"CHEBI":3,"NCBITaxon":2},"ex":[{"id":"CHEBI:15956","label":"biotin"},{"id":"CHEBI:16349","label":"L-citrulline"},{"id":"CHEBI:27592","label":"ectoine"}]},{"a":"AntibioticMech","b":"MediaIngredientMech","n":322,"by":{"CHEBI":322},"ex":[{"id":"CHEBI:33709","label":"amino acid"},{"id":"CHEBI:30746","label":"benzoic acid"},{"id":"CHEBI:17334","label":"penicillin"}]},{"a":"AntibioticMech","b":"CultureMech","n":29,"by":{"CHEBI":29},"ex":[{"id":"CHEBI:17334","label":"penicillin"},{"id":"CHEBI:48923","label":"erythromycin"},{"id":"CHEBI:30746","label":"benzoic acid"}]},{"a":"MediaIngredientMech","b":"CultureMech","n":607,"by":{"CHEBI":543,"KEGG":53,"FOODON":6,"UBERON":3,"ENVO":1,"CAS":1},"ex":[{"id":"FOODON:03315426","label":"yeast extract"},{"id":"CHEBI:17234","label":"glucose"},{"id":"CHEBI:2509","label":"agar"}]}]}; var MANIFEST = {"version":1,"source":{"repository":"CultureBotAI/culturebotai-claw","revision":"683d6b9f45da4515f461b842822c4d0f3201718a","url":"https://github.com/CultureBotAI/culturebotai-claw/blob/683d6b9f45da4515f461b842822c4d0f3201718a/src/kg_microbe_fleet/fleet.yaml"},"capability_catalogue":{"id_label_validation":{},"curation_history":{},"strict_validation":{},"schema_sync":{},"release_management":{},"build_coordination":{},"documentation":{},"testing":{},"refactoring":{},"coordination_hooks":{},"deep_research":{},"edison_key_discovery":{},"environment_coverage":{"settings":{"record_globs":{"type":"string_list","required_when_enabled":true}}},"knowledge_gap_scan":{"settings":{"window":{"type":"integer","required_when_enabled":true,"minimum":1}}},"vendored_sync":{},"unmapped_inventory_input":{},"source_catalogue":{},"corpus_statistics":{"settings":{"fields":{"type":"string_list","required_when_enabled":true}}},"page_budgets":{"settings":{"site_path":{"type":"string","required_when_enabled":true},"budgets_path":{"type":"string","required_when_enabled":true}}},"kgx_export":{"settings":{"nodes_path":{"type":"string","required_when_enabled":true},"edges_path":{"type":"string","required_when_enabled":true},"extra_prefixes":{"type":"string_list"}}},"source_queue":{"settings":{"queue_path":{"type":"string","required_when_enabled":true},"extensions":{"type":"string_list"},"required_when_adopted":{"type":"string_list"}}},"metpo_proposal":{"settings":{"class_glob":{"type":"string","required_when_enabled":true},"property_glob":{"type":"string"}}},"sssom_export":{"settings":{"mapping_globs":{"type":"string_list","required_when_enabled":true},"extensions":{"type":"string_list"}}},"writer_audit":{"settings":{"search_dirs":{"type":"string_list","required_when_enabled":true},"save_helpers":{"type":"string_list"},"validators":{"type":"string_list"},"curation_markers":{"type":"string_list"},"exclude":{"type":"string_list"}}},"site_contract":{"settings":{"site_path":{"type":"string","required_when_enabled":true},"published_root":{"type":"string"},"allowed_hosts":{"type":"string_list"}}}},"mechs":{"CultureMech":{"key":"culturemech","github":"CultureBotAI/CultureMech","capabilities":{"id_label_validation":{"status":"enabled"},"curation_history":{"status":"enabled"},"strict_validation":{"status":"enabled"},"schema_sync":{"status":"enabled"},"release_management":{"status":"enabled"},"build_coordination":{"status":"enabled"},"documentation":{"status":"enabled"},"testing":{"status":"enabled"},"refactoring":{"status":"enabled"},"coordination_hooks":{"status":"enabled"},"deep_research":{"status":"enabled"},"edison_key_discovery":{"status":"enabled"},"environment_coverage":{"status":"enabled","settings":{"record_globs":["data/merge_yaml/merged/*.yaml"]}},"knowledge_gap_scan":{"status":"enabled","settings":{"window":300}},"vendored_sync":{"status":"enabled"},"corpus_statistics":{"status":"enabled","settings":{"fields":["source_environment","medium_type"]}},"page_budgets":{"status":"disabled","reason":"Generates a site through .github/workflows/generate-pages.yaml but declares no size or file-count budgets, so nothing watches it grow. Adopting them applies here; the limits are the repository's to set.","reason_claims":{"present":[".github/workflows/generate-pages.yaml"]}},"writer_audit":{"status":"enabled","settings":{"search_dirs":["scripts","src/culturemech"],"save_helpers":["write_validated_recipe"],"exclude":["scripts/audit_writers.py"]}},"sssom_export":{"status":"enabled","settings":{"mapping_globs":["output/*.sssom.tsv"],"extensions":["mapping_method"]}},"metpo_proposal":{"status":"disabled","reason":"Carries .claude/commands/ground-or-propose-metpo.md, so the grounding half is present, but has no proposals/ directory and has never minted a METPO id. Adopting applies once a CultureMech term needs one.","reason_claims":{"absent":["proposals"],"present":[".claude/commands/ground-or-propose-metpo.md"]}},"kgx_export":{"status":"disabled","reason":"scripts/export_kgx.py writes to output/kgx but has produced nothing tracked, so there is no graph for this contract to judge. Adopting it means running the exporter first; the check applies here once it does.","reason_claims":{"present":["scripts/export_kgx.py"],"absent":["output/kgx"]}},"source_queue":{"status":"disabled","reason":"Has no curation/source_queue.tsv. AntibioticMech wrote the pattern and CellStructureMech adapted it; adopting it here means ranking this corpus's own candidate sources and verifying their licences, which is curation work rather than a file copy.","reason_claims":{"absent":["curation/source_queue.tsv"]}},"site_contract":{"status":"disabled","reason":"Publishes a site built in CI, so no directory in the checkout is the output the check would judge; running it on the Jekyll or template sources reports missing .html files that the build creates. Adopting it means running the check on the build product, which applies here and is not yet wired."},"source_catalogue":{"status":"disabled","reason":"Fetches each source from its own script -- scripts/fetch_komodo_base_volumes.py, scripts/fetch_mediadive_solution_volumes.py, scripts/fetch_pubmed_abstracts.py -- with no download.yaml declaring them, so there is no catalogue to validate. Adopting one would apply here; it has not been written.","reason_claims":{"present":["scripts/fetch_komodo_base_volumes.py","scripts/fetch_mediadive_solution_volumes.py","scripts/fetch_pubmed_abstracts.py"],"absent":["download.yaml"]}},"unmapped_inventory_input":{"status":"enabled"}}},"MediaIngredientMech":{"key":"mediaingredientmech","github":"CultureBotAI/MediaIngredientMech","capabilities":{"id_label_validation":{"status":"enabled"},"curation_history":{"status":"enabled"},"strict_validation":{"status":"enabled"},"schema_sync":{"status":"enabled"},"release_management":{"status":"enabled"},"build_coordination":{"status":"enabled"},"documentation":{"status":"enabled"},"testing":{"status":"enabled"},"refactoring":{"status":"enabled"},"coordination_hooks":{"status":"enabled"},"deep_research":{"status":"enabled"},"edison_key_discovery":{"status":"enabled"},"environment_coverage":{"status":"enabled","settings":{"record_globs":["data/ingredients/**/*.yaml"]}},"knowledge_gap_scan":{"status":"enabled","settings":{"window":300}},"vendored_sync":{"status":"enabled"},"corpus_statistics":{"status":"enabled","settings":{"fields":["ingredient_type","ontology_mapping.mapping_quality"]}},"page_budgets":{"status":"disabled","reason":"Generates a site through .github/workflows/generate-pages.yaml but declares no size or file-count budgets, so nothing watches it grow. Adopting them applies here; the limits are the repository's to set.","reason_claims":{"present":[".github/workflows/generate-pages.yaml"]}},"writer_audit":{"status":"enabled","settings":{"search_dirs":["scripts","src/mediaingredientmech"],"save_helpers":["save_yaml","write_validated_ingredient"],"exclude":["scripts/audit_writers.py"]}},"sssom_export":{"status":"enabled","settings":{"mapping_globs":["mappings/*.sssom.tsv"],"extensions":["source","validation_method"]}},"metpo_proposal":{"status":"not_applicable","reason":"MIM grounds ingredients in ChEBI and FOODON and publishes SSSOM mappings; METPO models microbial phenotypes and processes, which is not the axis this corpus curates."},"kgx_export":{"status":"disabled","reason":"Publishes term mappings rather than a graph; its contribution to kg-microbe is SSSOM. Adopting KGX would apply here only if it starts emitting nodes and edges."},"source_queue":{"status":"disabled","reason":"Has no curation/source_queue.tsv. AntibioticMech wrote the pattern and CellStructureMech adapted it; adopting it here means ranking this corpus's own candidate sources and verifying their licences, which is curation work rather than a file copy.","reason_claims":{"absent":["curation/source_queue.tsv"]}},"site_contract":{"status":"disabled","reason":"Publishes a site built in CI, so no directory in the checkout is the output the check would judge; running it on the Jekyll or template sources reports missing .html files that the build creates. Adopting it means running the check on the build product, which applies here and is not yet wired."},"source_catalogue":{"status":"disabled","reason":"Fetches ontologies through download_ontologies.py rather than a declared catalogue, so there is no download.yaml to validate. Adopting one would apply here; it has not been written.","reason_claims":{"present":["scripts/download_ontologies.py"],"absent":["download.yaml"]}},"unmapped_inventory_input":{"status":"enabled"}}},"CommunityMech":{"key":"communitymech","github":"CultureBotAI/CommunityMech","capabilities":{"id_label_validation":{"status":"enabled"},"curation_history":{"status":"enabled"},"strict_validation":{"status":"enabled"},"schema_sync":{"status":"enabled"},"release_management":{"status":"enabled"},"build_coordination":{"status":"enabled"},"documentation":{"status":"enabled"},"testing":{"status":"enabled"},"refactoring":{"status":"enabled"},"coordination_hooks":{"status":"enabled"},"deep_research":{"status":"enabled"},"edison_key_discovery":{"status":"enabled"},"environment_coverage":{"status":"enabled","settings":{"record_globs":["data/isolates/*.yaml"]}},"knowledge_gap_scan":{"status":"enabled","settings":{"window":305}},"vendored_sync":{"status":"enabled"},"corpus_statistics":{"status":"enabled","settings":{"fields":["environment_term"]}},"page_budgets":{"status":"disabled","reason":"Generates a site through .github/workflows/generate-pages.yaml but declares no size or file-count budgets, so nothing watches it grow. Adopting them applies here; the limits are the repository's to set.","reason_claims":{"present":[".github/workflows/generate-pages.yaml"]}},"writer_audit":{"status":"enabled","settings":{"search_dirs":["scripts","src/communitymech"],"save_helpers":["write_validated_community"],"curation_markers":["record_curation_event"],"exclude":["scripts/audit_writers.py"]}},"sssom_export":{"status":"not_applicable","reason":"Publishes KGX nodes and edges rather than term mappings; its contribution to kg-microbe is a graph, not a mapping set, so there is no SSSOM file for this contract to judge."},"metpo_proposal":{"status":"enabled","settings":{"class_glob":"proposals/*/metpo_proposal_classes_robot.tsv","property_glob":"proposals/*/metpo_proposal_properties_robot.tsv"}},"kgx_export":{"status":"enabled","settings":{"nodes_path":"output/kgx/nodes.tsv","edges_path":"output/kgx/edges.tsv"}},"source_queue":{"status":"disabled","reason":"Has no curation/source_queue.tsv. AntibioticMech wrote the pattern and CellStructureMech adapted it; adopting it here means ranking this corpus's own candidate sources and verifying their licences, which is curation work rather than a file copy.","reason_claims":{"absent":["curation/source_queue.tsv"]}},"site_contract":{"status":"enabled","settings":{"site_path":"docs"}},"source_catalogue":{"status":"disabled","reason":"Has no download.yaml; its inputs arrive through per-source scripts rather than a declared catalogue. Adopting one would apply here; it has not been written.","reason_claims":{"absent":["download.yaml"]}},"unmapped_inventory_input":{"status":"enabled"}}},"TraitMech":{"key":"traitmech","github":"CultureBotAI/TraitMech","capabilities":{"id_label_validation":{"status":"enabled"},"curation_history":{"status":"enabled"},"strict_validation":{"status":"enabled"},"schema_sync":{"status":"enabled"},"release_management":{"status":"enabled"},"build_coordination":{"status":"enabled"},"documentation":{"status":"enabled"},"testing":{"status":"enabled"},"refactoring":{"status":"enabled"},"coordination_hooks":{"status":"enabled"},"deep_research":{"status":"enabled"},"edison_key_discovery":{"status":"enabled"},"environment_coverage":{"status":"not_applicable","reason":"Environment coverage currently compares culture media, ingredients, and microbial communities; trait records are not an environment inventory input."},"knowledge_gap_scan":{"status":"enabled","settings":{"window":300}},"vendored_sync":{"status":"enabled"},"corpus_statistics":{"status":"enabled","settings":{"fields":["mapping_status","trait_category"]}},"page_budgets":{"status":"disabled","reason":"Serves 490 tracked pages under pages/ straight from main via GitHub Pages -- it has no generate-pages.yaml, unlike the other four -- and declares no size or file-count budgets, so nothing watches them grow. Adopting them applies here; the limits are the repository's to set.","reason_claims":{"present":["pages"],"absent":[".github/workflows/generate-pages.yaml"]}},"writer_audit":{"status":"enabled","settings":{"search_dirs":["scripts","src/traitmech"],"save_helpers":["write_validated_trait"],"curation_markers":["record_curation"],"exclude":["scripts/audit_writers.py"]}},"sssom_export":{"status":"enabled","settings":{"mapping_globs":["proposals/*/metpo_proposal_mappings.sssom.tsv"]}},"metpo_proposal":{"status":"enabled","settings":{"class_glob":"proposals/*/metpo_proposal_classes_robot.tsv","property_glob":"proposals/*/metpo_proposal_properties_robot.tsv"}},"kgx_export":{"status":"disabled","reason":"Publishes trait records and METPO mapping proposals, not a KGX graph."},"source_queue":{"status":"disabled","reason":"Has no curation/source_queue.tsv. AntibioticMech wrote the pattern and CellStructureMech adapted it; adopting it here means ranking this corpus's own candidate sources and verifying their licences, which is curation work rather than a file copy.","reason_claims":{"absent":["curation/source_queue.tsv"]}},"site_contract":{"status":"enabled","settings":{"site_path":"pages","published_root":".","allowed_hosts":["cdn.jsdelivr.net"]}},"source_catalogue":{"status":"enabled"},"unmapped_inventory_input":{"status":"not_applicable","reason":"The unmapped-ingredient inventory reads culture-media and ingredient corpora; TraitMech curates traits and has no ingredient records, so scripts/inventory_unmapped_ingredients.py defines no loader for it.","reason_claims":{"present":["claw:scripts/inventory_unmapped_ingredients.py"]}}}},"ProteinTraitsMech":{"key":"proteintraitsmech","github":"CultureBotAI/proteintraitsmech","capabilities":{"id_label_validation":{"status":"enabled"},"curation_history":{"status":"enabled"},"strict_validation":{"status":"enabled"},"schema_sync":{"status":"enabled"},"release_management":{"status":"enabled"},"build_coordination":{"status":"enabled"},"documentation":{"status":"enabled"},"testing":{"status":"enabled"},"refactoring":{"status":"enabled"},"coordination_hooks":{"status":"enabled"},"deep_research":{"status":"enabled"},"edison_key_discovery":{"status":"not_applicable","reason":"ProteinTraitsMech does not use an Edison research-provider key; provider integration is configured through its own supported credential surfaces."},"environment_coverage":{"status":"not_applicable","reason":"Environment coverage currently compares culture media, ingredients, and microbial communities; protein-trait records are not an environment inventory input."},"knowledge_gap_scan":{"status":"not_applicable","reason":"Record-level knowledge-gap scanning targets curated per-record discussion text. This corpus is ontology-derived, so there is no per-record gap surface to scan; the repository is correspondingly absent from the knowledge-gap-scan workflow matrix."},"vendored_sync":{"status":"enabled"},"corpus_statistics":{"status":"enabled","settings":{"fields":["trait_axis","mapping_status"]}},"page_budgets":{"status":"enabled","settings":{"site_path":"_site","budgets_path":"conf/pages_budgets.json"}},"writer_audit":{"status":"not_applicable","reason":"Its scripts/audit_writers.py shares the name and nothing else -- a different tool built on registered editors and guard tests, ~600 lines apart from the other four. This audit does not describe what that one checks, and consolidating them would mean choosing one model over the other rather than removing a duplicate.","reason_claims":{"present":["scripts/audit_writers.py"]}},"sssom_export":{"status":"disabled","reason":"Grounds protein traits directly in its own records rather than publishing a mapping set. Adopting one would apply here; none has been written."},"metpo_proposal":{"status":"disabled","reason":"Carries METPO-grounded records under data/traits/**/metpo/, so it consumes METPO, but proposes no new terms and has no proposals/ directory. Adopting applies once a protein trait needs a term METPO lacks.","reason_claims":{"absent":["proposals"]}},"kgx_export":{"status":"disabled","reason":"Publishes protein-trait records rather than a graph."},"source_queue":{"status":"disabled","reason":"Has no curation/source_queue.tsv. AntibioticMech wrote the pattern and CellStructureMech adapted it; adopting it here means ranking this corpus's own candidate sources and verifying their licences, which is curation work rather than a file copy.","reason_claims":{"absent":["curation/source_queue.tsv"]}},"site_contract":{"status":"disabled","reason":"Publishes a site built in CI, so no directory in the checkout is the output the check would judge; running it on the Jekyll or template sources reports missing .html files that the build creates. Adopting it means running the check on the build product, which applies here and is not yet wired."},"source_catalogue":{"status":"enabled"},"unmapped_inventory_input":{"status":"not_applicable","reason":"The unmapped-ingredient inventory reads culture-media and ingredient corpora; ProteinTraitsMech curates protein-trait records and has no ingredient corpus, so scripts/inventory_unmapped_ingredients.py defines no loader for it.","reason_claims":{"present":["claw:scripts/inventory_unmapped_ingredients.py"]}}}},"AntibioticMech":{"key":"antibioticmech","github":"CultureBotAI/AntibioticMech","capabilities":{"id_label_validation":{"status":"enabled"},"curation_history":{"status":"enabled"},"vendored_sync":{"status":"enabled"},"strict_validation":{"status":"enabled"},"schema_sync":{"status":"enabled"},"testing":{"status":"enabled"},"documentation":{"status":"enabled"},"release_management":{"status":"enabled"},"build_coordination":{"status":"enabled"},"refactoring":{"status":"enabled"},"coordination_hooks":{"status":"enabled"},"deep_research":{"status":"disabled","reason":"Has research-antibiotic, research-entity and deep-research-canary recipes and a research/ tree, but no conf/deep_research_provider.yaml -- the profile every deep-research Mech declares and the contract resolves. Enabled on the recipes alone this would assert a profile that does not exist; the recipes are a research route, not the declared provider contract.","reason_claims":{"present":["research"],"absent":["conf/deep_research_provider.yaml"]}},"edison_key_discovery":{"status":"not_applicable","reason":"Research runs through this repository's own research-antibiotic and research-entity recipes; it uses no Edison provider key."},"environment_coverage":{"status":"not_applicable","reason":"Environment coverage compares culture media, ingredients and microbial communities. An antimicrobial-compound corpus is not an environment inventory input."},"unmapped_inventory_input":{"status":"not_applicable","reason":"The unmapped inventory reconciles ingredient names across media corpora; antimicrobial compounds are not one of its sources."},"knowledge_gap_scan":{"status":"disabled","reason":"Records do not carry the shared Discussion section the scan reads, and this repository is not in the knowledge-gap-scan workflow matrix. Enable once records carry it."},"source_catalogue":{"status":"enabled"},"corpus_statistics":{"status":"enabled","settings":{"fields":["antimicrobial_class","grounding_status"]}},"source_queue":{"status":"enabled","settings":{"queue_path":"curation/source_queue.tsv"}},"site_contract":{"status":"enabled","settings":{"site_path":"pages"}},"page_budgets":{"status":"disabled","reason":"Serves tracked pages under pages/ from main via GitHub Pages and declares no size or file-count budgets, so nothing watches them grow -- 2,956 files and 30.1 MB measured at admission (#230). Adopting them applies here; the limits are this repository's to set.","reason_claims":{"present":["pages"]}},"writer_audit":{"status":"disabled","reason":"Has no scripts/audit_writers.py, so there is no drift between writer copies to remove yet. Adopting it applies once more writers exist.","reason_claims":{"absent":["scripts/audit_writers.py"]}},"sssom_export":{"status":"disabled","reason":"Records carry ChEBI and ARO identifiers inline rather than through a mapping file. Adopting SSSOM applies once a mapping product exists."},"metpo_proposal":{"status":"disabled","reason":"No proposals/ directory and no METPO grounding. Antimicrobial compounds are grounded in ChEBI and ARO inline; adopting applies once a resistance or activity phenotype needs a METPO term.","reason_claims":{"absent":["proposals"]}},"kgx_export":{"status":"disabled","reason":"No exporter and no graph product yet; adopting KGX applies once the corpus is consumed as a graph."}}},"CellStructureMech":{"key":"cellstructuremech","github":"CultureBotAI/CellStructureMech","capabilities":{"id_label_validation":{"status":"enabled"},"curation_history":{"status":"enabled"},"strict_validation":{"status":"enabled"},"schema_sync":{"status":"enabled"},"release_management":{"status":"enabled"},"build_coordination":{"status":"enabled"},"documentation":{"status":"enabled"},"testing":{"status":"enabled"},"refactoring":{"status":"enabled"},"coordination_hooks":{"status":"enabled"},"deep_research":{"status":"disabled","reason":"Research so far is source assessment written by hand under research/ with no provider client or research recipe in the justfile; the repository has not decided on a paid research route.","reason_claims":{"present":["research"]}},"edison_key_discovery":{"status":"not_applicable","reason":"CellStructureMech does not use an Edison research-provider key; it has no research provider integration at all."},"environment_coverage":{"status":"not_applicable","reason":"Environment coverage currently compares culture media, ingredients, and microbial communities; cell-structure records are not an environment inventory input."},"knowledge_gap_scan":{"status":"disabled","reason":"Records carry the shared Discussion section, so the scan applies, but the corpus is four records and the repository is not yet in the knowledge-gap-scan workflow matrix; enable once the first tranche of records lands (CellStructureMech#12)."},"vendored_sync":{"status":"enabled"},"corpus_statistics":{"status":"enabled","settings":{"fields":["structure_category","mapping_status"]}},"page_budgets":{"status":"disabled","reason":"Serves tracked pages under pages/ straight from main via GitHub Pages -- it has no generate-pages.yaml -- and declares no size or file-count budgets, so nothing watches them grow. Adopting them applies here; the limits are the repository's to set.","reason_claims":{"present":["pages"],"absent":[".github/workflows/generate-pages.yaml"]}},"writer_audit":{"status":"disabled","reason":"Has no scripts/audit_writers.py, so there is no drift to remove yet. Adopting it applies here once the corpus grows; the settings are the repository's to declare.","reason_claims":{"absent":["scripts/audit_writers.py"]}},"sssom_export":{"status":"disabled","reason":"Records carry GO cellular-component identifiers inline rather than through a mapping file, and the corpus is four records. Adopting one applies once it grows."},"metpo_proposal":{"status":"disabled","reason":"Structures are grounded in GO cellular-component terms inline and there is no proposals/ directory. Adopting applies once a structure phenotype needs a METPO term GO does not carry.","reason_claims":{"absent":["proposals"]}},"kgx_export":{"status":"disabled","reason":"Four structure records and no exporter; adopting KGX applies once the corpus grows."},"source_queue":{"status":"enabled","settings":{"queue_path":"curation/source_queue.tsv","extensions":["taxon_link","item_id","script"],"required_when_adopted":["script"]}},"site_contract":{"status":"enabled","settings":{"site_path":"pages","published_root":"."}},"source_catalogue":{"status":"disabled","reason":"The repository keeps its ranked source list as curation/source_queue.tsv, machine-checked by scripts/check_source_queue.py inside its qc gate, rather than a download.yaml in the fleet's catalogue shape; there is no download.yaml to parse. Converging on one shape is open.","reason_claims":{"present":["curation/source_queue.tsv","scripts/check_source_queue.py"],"absent":["download.yaml"]}},"unmapped_inventory_input":{"status":"not_applicable","reason":"The unmapped-ingredient inventory reads culture-media and ingredient corpora; CellStructureMech curates cell structures and has no ingredient records, so scripts/inventory_unmapped_ingredients.py defines no loader for it.","reason_claims":{"present":["claw:scripts/inventory_unmapped_ingredients.py"]}}}},"HabitatMech":{"key":"habitatmech","github":"CultureBotAI/HabitatMech","capabilities":{"id_label_validation":{"status":"enabled"},"curation_history":{"status":"enabled"},"strict_validation":{"status":"enabled"},"schema_sync":{"status":"enabled"},"release_management":{"status":"enabled"},"build_coordination":{"status":"enabled"},"documentation":{"status":"enabled"},"testing":{"status":"enabled"},"refactoring":{"status":"enabled"},"coordination_hooks":{"status":"enabled"},"deep_research":{"status":"disabled","reason":"Has research, research-dry and deep-research-canary recipes, a research/ tree and the vendored scripts/deep_research_contract.py, but no conf/deep_research_provider.yaml -- the profile every deep-research Mech declares and the contract resolves. Enabled on the recipes alone this would assert a profile that does not exist.","reason_claims":{"present":["research","scripts/deep_research_contract.py"],"absent":["conf/deep_research_provider.yaml"]}},"edison_key_discovery":{"status":"not_applicable","reason":"HabitatMech does not use an Edison research-provider key; its research recipes run through its own provider surface."},"environment_coverage":{"status":"disabled","reason":"HabitatMech is itself an environment vocabulary: 3,213 habitat records grounded in ENVO, UBERON, FOODON and BTO. Environment coverage compares culture media, ingredients and communities against ENVO and has no loader for HabitatRecord, so it cannot yet read this corpus as either an input or the reference set. Adopting it applies here and is the more valuable direction: teach environment_coverage_dashboard.py to treat habitat records as the reference the other corpora are measured against.","reason_claims":{"present":["claw:scripts/environment_coverage_dashboard.py"]}},"knowledge_gap_scan":{"status":"disabled","reason":"Records carry the shared Discussion section, so the scan applies. The workflow matrix is generated from this manifest, so enabling the capability here with a settings.window is what adds the repository to it. Left disabled until HabitatMech has run the scan once locally and chosen its window."},"vendored_sync":{"status":"enabled"},"corpus_statistics":{"status":"enabled","settings":{"fields":["habitat_category","grounding_status","mapping_status"]}},"page_budgets":{"status":"disabled","reason":"Serves 3,404 published HTML pages under pages/ straight from main via GitHub Pages -- it has no generate-pages.yaml -- and declares no size or file-count budgets, so nothing watches them grow. Adopting them applies here; the limits are the repository's to set.","reason_claims":{"present":["pages"],"absent":[".github/workflows/generate-pages.yaml"]}},"writer_audit":{"status":"disabled","reason":"Has no scripts/audit_writers.py. Its writers exist (write_validated_habitat and record_curation_event in the seeder) and records are seeded as build products, so there is drift to audit; adopting it applies here once the audit is written.","reason_claims":{"absent":["scripts/audit_writers.py"]}},"sssom_export":{"status":"disabled","reason":"Grounds each habitat inline on the record (ENVO, UBERON, FOODON, BTO) and keeps its ontology requests as curation/term_requests.tsv rather than publishing a mapping set; there is no SSSOM file for this contract to judge. Adopting one would apply here.","reason_claims":{"present":["curation/term_requests.tsv"]}},"metpo_proposal":{"status":"disabled","reason":"Habitats are grounded in ENVO and the repository raises its gaps through term requests rather than METPO cohorts, so it has no proposals directory. Adopting applies once a habitat-associated phenotype needs a METPO term.","reason_claims":{"absent":["proposals"]}},"kgx_export":{"status":"disabled","reason":"Consumes kg-microbe's KGX as an input -- conf/sources.yaml names the checkout that supplies ENVO, UBERON, FOODON and BTO -- and publishes habitat records, not a graph. Adopting KGX would apply here only if it starts emitting nodes and edges.","reason_claims":{"present":["conf/sources.yaml"]}},"source_queue":{"status":"disabled","reason":"Has no curation/source_queue.tsv; its sources are declared in conf/sources.yaml and the raw payloads in data/raw/MANIFEST.yaml. AntibioticMech wrote the pattern and CellStructureMech adapted it; adopting it here means ranking candidate habitat sources and verifying their licences, which is curation work rather than a file copy.","reason_claims":{"present":["conf/sources.yaml","data/raw/MANIFEST.yaml"],"absent":["curation/source_queue.tsv"]}},"site_contract":{"status":"disabled","reason":"Publishes 3,404 HTML pages under pages/ straight from main, so the check has a directory to judge, but it has not been measured on this site yet. Enable after measuring on joining, as AntibioticMech did, so the contract's numbers keep describing what it runs on.","reason_claims":{"present":["pages"]}},"source_catalogue":{"status":"disabled","reason":"Declares its sources in conf/sources.yaml and the fetched payloads in data/raw/MANIFEST.yaml rather than a download.yaml in the fleet's catalogue shape; there is no download.yaml to parse. Converging on one shape is open.","reason_claims":{"present":["conf/sources.yaml","data/raw/MANIFEST.yaml"],"absent":["download.yaml"]}},"unmapped_inventory_input":{"status":"not_applicable","reason":"The unmapped-ingredient inventory reads culture-media and ingredient corpora; HabitatMech curates habitats and has no ingredient records, so scripts/inventory_unmapped_ingredients.py defines no loader for it.","reason_claims":{"present":["claw:scripts/inventory_unmapped_ingredients.py"]}}}},"NaturalProductMech":{"key":"naturalproductmech","github":"CultureBotAI/NaturalProductMech","capabilities":{"id_label_validation":{"status":"enabled"},"curation_history":{"status":"disabled","reason":"Vendors the governed curation-history schema and carries a new-history recipe, but has no history directory yet, so no record can append an event. Adopting applies once the tree exists and the recipe is wired into CI.","reason_claims":{"absent":["history"]}},"strict_validation":{"status":"enabled"},"schema_sync":{"status":"enabled"},"release_management":{"status":"enabled"},"build_coordination":{"status":"enabled"},"documentation":{"status":"enabled"},"testing":{"status":"enabled"},"refactoring":{"status":"enabled"},"coordination_hooks":{"status":"enabled"},"deep_research":{"status":"disabled","reason":"No conf/deep_research_provider.yaml and no research recipe; sources are assessed through the source queue. Adopting applies once a provider profile exists under claw's contract.","reason_claims":{"absent":["conf/deep_research_provider.yaml"]}},"edison_key_discovery":{"status":"not_applicable","reason":"NaturalProductMech does not use an Edison research-provider key; it has no research provider integration at all."},"environment_coverage":{"status":"not_applicable","reason":"Environment coverage compares culture media, ingredients and microbial communities. A natural-product structure corpus is not one of those inputs."},"knowledge_gap_scan":{"status":"disabled","reason":"Records do not carry the shared Discussion section the scan reads, and this repository is not in the knowledge-gap-scan workflow matrix. Enable once records carry it."},"vendored_sync":{"status":"enabled"},"corpus_statistics":{"status":"enabled","settings":{"fields":["np_pathway","np_classification","grounding_status","curation_status"]}},"page_budgets":{"status":"disabled","reason":"Serves tracked pages under pages/ straight from main via GitHub Pages and declares no size or file-count budgets, so no conf/pages_budgets.json exists for the audit to read.","reason_claims":{"present":["pages"],"absent":["conf/pages_budgets.json"]}},"writer_audit":{"status":"disabled","reason":"Has no scripts/audit_writers.py, so there is no drift between writer copies to remove yet. Adopting it applies here once the corpus is edited by more than one writer.","reason_claims":{"absent":["scripts/audit_writers.py"]}},"sssom_export":{"status":"disabled","reason":"Records carry ChEBI, NPAtlas and PubChem identifiers inline rather than through a mapping file. Adopting SSSOM applies once a mapping product exists."},"metpo_proposal":{"status":"disabled","reason":"No proposals directory and no METPO grounding; structures are grounded in ChEBI. Adopting applies once a natural-product phenotype needs a METPO term.","reason_claims":{"absent":["proposals"]}},"kgx_export":{"status":"disabled","reason":"No exporter and no graph product yet; adopting KGX applies once the corpus is consumed as a graph."},"source_queue":{"status":"enabled","settings":{"queue_path":"curation/source_queue.tsv","extensions":["structures"]}},"site_contract":{"status":"enabled","settings":{"site_path":"pages"}},"source_catalogue":{"status":"disabled","reason":"Keeps its ranked source list as curation/source_queue.tsv and fetches each adopted source through its own extract recipe; there is no download.yaml for the catalogue check to read. Adopting means deriving the machine-fetchable half from the queue.","reason_claims":{"present":["curation/source_queue.tsv"],"absent":["download.yaml"]}},"unmapped_inventory_input":{"status":"not_applicable","reason":"The unmapped inventory reconciles ingredient names across media corpora; natural-product structures are not one of its inputs."}}},"TaxonMech":{"key":"taxonmech","github":"CultureBotAI/TaxonMech","capabilities":{"id_label_validation":{"status":"enabled"},"curation_history":{"status":"enabled"},"strict_validation":{"status":"enabled"},"schema_sync":{"status":"enabled"},"release_management":{"status":"enabled"},"build_coordination":{"status":"enabled"},"documentation":{"status":"enabled"},"testing":{"status":"enabled"},"refactoring":{"status":"enabled"},"coordination_hooks":{"status":"enabled"},"deep_research":{"status":"disabled","reason":"Vendors scripts/deep_research_contract.py but has no conf/deep_research_provider.yaml or provider recipe. Enable once a research provider is configured and exercised under the shared contract.","reason_claims":{"present":["scripts/deep_research_contract.py"],"absent":["conf/deep_research_provider.yaml"]}},"edison_key_discovery":{"status":"not_applicable","reason":"TaxonMech has no Edison integration or Edison research-provider key."},"environment_coverage":{"status":"not_applicable","reason":"Environment coverage compares culture media, ingredients and microbial communities; taxon identity records are not one of its inputs."},"knowledge_gap_scan":{"status":"disabled","reason":"The schema supports Discussion but no shared scan window or workflow is configured. Enable after adding a durable curated overlay that the generated-corpus pipeline preserves and wiring the scanner to it."},"vendored_sync":{"status":"enabled"},"corpus_statistics":{"status":"enabled","settings":{"fields":["taxon_domain","rank","grounding_status","mapping_status"]}},"page_budgets":{"status":"disabled","reason":"Publishes tracked pages under pages/ but has no conf/pages_budgets.json. Enable once explicit size and file-count budgets are configured and measured.","reason_claims":{"present":["pages"],"absent":["conf/pages_budgets.json"]}},"writer_audit":{"status":"disabled","reason":"Has no scripts/audit_writers.py. Records use a native seeder and validated writer, but no shared audit profile has been adopted. Enable after configuring the profile and measuring its writer coverage.","reason_claims":{"absent":["scripts/audit_writers.py"]}},"sssom_export":{"status":"disabled","reason":"Stores taxonomy mappings and cross-references inline; no SSSOM mapping product is emitted. Enable once a validated export exists."},"metpo_proposal":{"status":"disabled","reason":"The schema references METPO but there is no proposals/ directory or proposal cohort. Enable once the repository produces terms under the shared proposal contract.","reason_claims":{"absent":["proposals"]}},"kgx_export":{"status":"disabled","reason":"Consumes kg-microbe KGX as an input but does not emit a graph product. Enable when an exporter produces validated nodes and edges."},"source_queue":{"status":"disabled","reason":"Sources are configured in conf/sources.yaml and inventoried in data/raw/MANIFEST.yaml; no curation/source_queue.tsv ranks candidate sources. Enable once that review queue is adopted.","reason_claims":{"present":["conf/sources.yaml","data/raw/MANIFEST.yaml"],"absent":["curation/source_queue.tsv"]}},"site_contract":{"status":"enabled","settings":{"site_path":"pages"}},"source_catalogue":{"status":"disabled","reason":"Uses conf/sources.yaml and data/raw/MANIFEST.yaml but has no download.yaml in the shared catalogue shape. Enable after adapting the source declarations to that contract.","reason_claims":{"present":["conf/sources.yaml","data/raw/MANIFEST.yaml"],"absent":["download.yaml"]}},"unmapped_inventory_input":{"status":"not_applicable","reason":"The unmapped inventory reconciles ingredient names across media corpora; taxon identity records are not one of its inputs."}}}},"artifact_count":16}; var MECHS = { @@ -861,11 +861,11 @@ Alongside record browsing, the Mechs publish complementary ways to explore their ## Shared vocabulary -The Mechs are joinable because they ground records in the same public ontologies. The table counts identifier occurrences per vocabulary in each Mech's record corpus; darker cells mean more. Click a Mech name to open it, a cell to list the records behind it, or a column heading to filter the graph to that vocabulary. +The Mechs are joinable because they ground records in the same public ontologies. The table counts identifier occurrences per vocabulary in each Mech's record corpus; darker cells mean more. Columns run from the most widely shared vocabulary to the least, so the left edge is the fleet's common ground and the right edge is what a single Mech needs alone. Click a Mech name to open it, a cell to list the records behind it, or a column heading to filter the graph to that vocabulary.
-

This earlier September 2026 vocabulary census was not recomputed with the September 15 site refresh and covers nine Mechs; TaxonMech is a fleet member whose vocabulary census has not yet been measured. Counts are prefix occurrences in the canonical record directories (merged recipes for CultureMech, communities for CommunityMech, habitat records for HabitatMech) as of September 2026. ChEBI binds the chemistry arm (media, ingredients, antibiotics, proteins); NCBITaxon and ENVO bind the organism arm (habitat, community, traits); GO and METPO bridge phenotype, structure and protein.

+

This earlier September 2026 vocabulary census was not recomputed with the September 15 site refresh and covers nine Mechs; TaxonMech is a fleet member whose vocabulary census has not yet been measured. Counts are prefix occurrences in the canonical record directories (merged recipes for CultureMech, communities for CommunityMech, habitat records for HabitatMech) as of September 2026. Columns are ordered by how many Mechs ground anything in each vocabulary, then by the total records citing it across the fleet; PMID and DOI sit at the right because every Mech cites literature. ChEBI binds the chemistry arm (media, ingredients, antibiotics, proteins); NCBITaxon and ENVO bind the organism arm (habitat, community, traits); GO and METPO bridge phenotype, structure and protein.

## How the Mechs reference each other diff --git a/scripts/fleet/build_data.py b/scripts/fleet/build_data.py index ff133bb..5d40d8a 100644 --- a/scripts/fleet/build_data.py +++ b/scripts/fleet/build_data.py @@ -13,6 +13,11 @@ sub=json.load(open(f"{S}/subsets_summary.json")); cen=json.load(open(f"{S}/prefix_census.json")) ORDER=["HabitatMech","CommunityMech","TraitMech","CellStructureMech","ProteinTraitsMech","NaturalProductMech","AntibioticMech","MediaIngredientMech","CultureMech"] VOC=["CHEBI","NCBITaxon","GO","ENVO","METPO","ARO","UniProt","InterPro","Pfam","RHEA","PDB","PATO","UBERON","FOODON","BTO","GTDB","KEGG","CAS","MIBiG","NPAtlas","PMID","DOI"] +# PMID and DOI are citation identifiers rather than vocabularies: every Mech +# cites literature, so they would sort to the far left and say nothing about +# what the Mechs share. build_subsets.py skips them for the same reason, which +# also means they have no record counts to rank by. Pinned to the right end. +CITATION=["PMID","DOI"] edges=[] for k,v in sub["edges"].items(): a,b=k.split("|") @@ -20,6 +25,16 @@ edges.append({"a":a,"b":b,"n":v["n"],"by":v["by"],"ex":v["ex"]}) heat={m:{v:cen[m]["prefixes"].get(v,0) for v in VOC} for m in ORDER} cells={k.replace("|","--"):n for k,n in sub["cells"].items()} -json.dump({"order":ORDER,"voc":VOC,"heat":heat,"cells":cells,"vocab_edges":edges},open(f"{S}/fleet_data.json","w"),separators=(",",":"),ensure_ascii=False) + +# Heatmap columns run left to right from the most widely shared vocabulary to +# the least: first by how many Mechs ground anything in it, then, for the many +# ties at nine and at one, by the total records citing it across the fleet. +# Name last so the order is stable when a vocabulary appears in no records. +def reach(v): return sum(1 for m in ORDER if heat[m][v]) +def records(v): return sum(cells.get(f"{m}--{v}",0) for m in ORDER) +VOC_ORDER=sorted((v for v in VOC if v not in CITATION),key=lambda v:(-reach(v),-records(v),v))+CITATION +for v in VOC_ORDER: print(f" {v:<10} {reach(v)} mechs {records(v):>9,} records") + +json.dump({"order":ORDER,"voc":VOC_ORDER,"heat":heat,"cells":cells,"vocab_edges":edges},open(f"{S}/fleet_data.json","w"),separators=(",",":"),ensure_ascii=False) print(len(edges),"edges;",os.path.getsize(f"{S}/fleet_data.json"),"bytes") for e in sorted(edges,key=lambda e:-e["n"])[:6]: print(e["a"],e["b"],e["n"],e["by"],[x["label"] for x in e["ex"]]) From c2312cef69f1ba6a9b666823055909edc17c78f0 Mon Sep 17 00:00:00 2001 From: "marcin p. joachimiak" <4625870+realmarcin@users.noreply.github.com> Date: Thu, 10 Sep 2026 21:33:03 -0700 Subject: [PATCH 2/2] Declare the citation prefixes once, in roots.py Review of #60 found the list of prefixes that name a paper rather than a concept written down twice, in scripts that cannot see each other: build_subsets.py skipped them with a literal tuple so they get no record lists, and build_data.py declared its own copy to pin them to the right of the heatmap. Adding a third prefix to one would have left the other sorting it to the far left on Mech count with no record total to break the tie, which is the failure the pin exists to prevent. Both now import CITATION from roots.py, which already owned the other shared fact about the corpora. build_data.py also stops redeclaring ORDER, which roots.py has derived from RECORD_GLOBS since #40. fleet_data.json rebuilds byte-identical, so this changes no published number. Closes #61 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01BXHrBTSU8fU4Zg7HfaMKs9 --- scripts/fleet/build_data.py | 17 +++++++++-------- scripts/fleet/build_subsets.py | 4 ++-- scripts/fleet/roots.py | 7 +++++++ 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/scripts/fleet/build_data.py b/scripts/fleet/build_data.py index 5d40d8a..488d952 100644 --- a/scripts/fleet/build_data.py +++ b/scripts/fleet/build_data.py @@ -8,16 +8,13 @@ import os REPO = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) DATA = os.path.join(REPO, "_fleet", "data") -import json, os +import json, os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from roots import CITATION, ORDER + S=DATA sub=json.load(open(f"{S}/subsets_summary.json")); cen=json.load(open(f"{S}/prefix_census.json")) -ORDER=["HabitatMech","CommunityMech","TraitMech","CellStructureMech","ProteinTraitsMech","NaturalProductMech","AntibioticMech","MediaIngredientMech","CultureMech"] VOC=["CHEBI","NCBITaxon","GO","ENVO","METPO","ARO","UniProt","InterPro","Pfam","RHEA","PDB","PATO","UBERON","FOODON","BTO","GTDB","KEGG","CAS","MIBiG","NPAtlas","PMID","DOI"] -# PMID and DOI are citation identifiers rather than vocabularies: every Mech -# cites literature, so they would sort to the far left and say nothing about -# what the Mechs share. build_subsets.py skips them for the same reason, which -# also means they have no record counts to rank by. Pinned to the right end. -CITATION=["PMID","DOI"] edges=[] for k,v in sub["edges"].items(): a,b=k.split("|") @@ -32,7 +29,11 @@ # Name last so the order is stable when a vocabulary appears in no records. def reach(v): return sum(1 for m in ORDER if heat[m][v]) def records(v): return sum(cells.get(f"{m}--{v}",0) for m in ORDER) -VOC_ORDER=sorted((v for v in VOC if v not in CITATION),key=lambda v:(-reach(v),-records(v),v))+CITATION +# CITATION comes from roots.py, the same list build_subsets.py uses to decide +# which prefixes get no record lists. Those two have to agree: a citation +# prefix would sort to the far left on Mech count with nothing to break the +# tie, which is what the pin exists to prevent. +VOC_ORDER=sorted((v for v in VOC if v not in CITATION),key=lambda v:(-reach(v),-records(v),v))+[v for v in CITATION if v in VOC] for v in VOC_ORDER: print(f" {v:<10} {reach(v)} mechs {records(v):>9,} records") json.dump({"order":ORDER,"voc":VOC_ORDER,"heat":heat,"cells":cells,"vocab_edges":edges},open(f"{S}/fleet_data.json","w"),separators=(",",":"),ensure_ascii=False) diff --git a/scripts/fleet/build_subsets.py b/scripts/fleet/build_subsets.py index e4eb558..c671703 100644 --- a/scripts/fleet/build_subsets.py +++ b/scripts/fleet/build_subsets.py @@ -14,7 +14,7 @@ import re import urllib.parse -from roots import ORDER, mech_root, record_paths +from roots import CITATION, ORDER, mech_root, record_paths OUT=os.path.join(REPO,"assets","fleet") GH="https://github.com/CultureBotAI/"; SITE="https://culturebotai.github.io/" @@ -169,7 +169,7 @@ def scan(m, keep=None, cap_cell=300): print("edge",a,b,len(shared),os.path.getsize(f"{OUT}/edges/{fn}")//1024,"KB") for m in ORDER: for p,(n,refs) in idx[m]["cells"].items(): - if p in ("DOI","PMID"): continue + if p in CITATION: continue fn=f"{m}--{p}.json" json.dump({"mech":m,"prefix":p,"base":MECHS[m]["base"],"total":n,"records":refs},open(f"{OUT}/cells/{fn}","w"),separators=(",",":"),ensure_ascii=False) summary["cells"][f"{m}|{p}"]=n diff --git a/scripts/fleet/roots.py b/scripts/fleet/roots.py index f9e1fd5..b59e1ae 100644 --- a/scripts/fleet/roots.py +++ b/scripts/fleet/roots.py @@ -38,6 +38,13 @@ ORDER = list(RECORD_GLOBS) +# Prefixes that identify a piece of literature rather than a concept. Every +# Mech cites papers, so counting them alongside the ontologies would say only +# that, which is why build_subsets.py writes no record lists for them and +# build_data.py keeps them out of the heatmap's ordering. Declared once here +# because those two decisions have to agree (CultureBotAI.github.io#61). +CITATION = ["PMID", "DOI"] + def mech_root(name: str) -> str: """The checkout for one Mech, verified to exist."""