AOP EMOD Framework Alignment

In progress FRAMEWORK_ALIGNMENTEVIDENCEEXTERNAL_COLLABORATIONENVIRONMENTAL_EXPOSURESCHEMA_EVOLUTION

AOP EMOD Framework Alignment

Scope

This project started with issue #8309, which asked to what extent dismech's environmental-exposure and evidence modeling approaches align with the Adverse Outcome Pathway (AOP) framework, including the AOP Evidence Model (EMOD) expansions. Iterative refinement of the questions that need to be asked led to the content of this project document. The project should be used to identify specific directions for dismech and AOP integration.

There are two AOP reference categories describing the AOP framework and the data classes on a conceptual level.

Reference category What it is Status
AOP-Wiki v2.8 data model The current structure. The AOP Developers' Handbook presents it conceptually to humans; the bulk XML serializes it. Stable, citable
AOP EMOD Computable expansion of v2.8, adding structure to fields that are currently free text. Being adopted by the AOP community; details not OECD-endorsed and open to change

Lead_Poisoning is the pilot comparator entry used to ground the comparison against a real dismech pathograph.

What this page is

It records an inventory of schema comparisons. It does not decide adoption. Whether dismech should sanction AOP-Wiki as a structured reference source or represent canonical AOPs as modules are separate calls belonging in their own issues.

Stability is a property of individual constructs, not of either framework. Both models mix settled and experimental elements, so how firmly a claim can be stated depends on which construct it describes — not on which side of the comparison it sits.

What is known about the AOP Schema

The record begins with each framework described on its own terms — what it defines, and how firmly — before any construct is mapped from one to the other.

The AOP-Wiki data model — v2.8 and EMOD properties

Normative reference: Villeneuve D, Meek B, Viviani B, Burgdorf T, LaLone C, O'Brien J, et al. AOP Developers' Handbook v2.8. AOP-Wiki; 2026 (aopwiki.org/handbooks/6).

What was inspected here is the serialization, not the Handbook prose — the official bulk XML export dated 2026-08-06 (holding 595 AOPs, 2361 KERs), processed in @gingin77's aop_wiki_cli. The Handbook outlines what AOP authors are instructed to do, whereas the XML shows which fields exist and what they contain.

Backbone

MIE → KE → KER → AO, with Prototypical Stressors attached as a separate annotation layer. AOPs are stressor-agnostic by design: the stressor→MIE link is deliberately not part of an AOP. The reason is predictive toxicology — a mechanism characterized once, in studies using prototypical stressors, can then be used to screen thousands of chemicals against it.

An Event is the first-class object; MIE, KE, and AO are roles an Event plays within a particular AOP. Events carry their own stable identifiers and exist independently of any one AOP.

Re-using Events across AOPs is how AOP networks form. This is an explicit design goal rather than an emergent property: an Event appearing in several AOPs is what joins them into a network.

The backbone is neither strictly linear nor necessarily fully connected. Two Events may sit in the same AOP without a KER pairing them, and a KER may itself record feedforward or feedback loops — AOP 17 carries a neuroinflammation ⇄ cell-injury loop.

Key Event Components

Key Event Components (KECs) were introduced in AOP-Wiki Release 2.2 to make Events computable by binding them to OBO Foundry terms. Each KEC defines a discrete action, object, and process term.

Action terms come from an AOP-Wiki controlled vocabulary based on the Phenotypes and Traits Ontology (PATO). Object and process terms use selected bio-ontologies. Separate controlled vocabularies define levels of biological organization (LoBO), sex, and life stage; CL and UBERON give biological spatial context for Events; and NCBI Taxon labels species applicability for Events, KERs, and AOPs.

EMOD adds phenotype as a fourth entity alongside action, object, and process. Its Observation and Assay classes each define a biological object, process, and/or phenotype, serving Events across all levels of biological organization from molecular to population. The phenotype property does work the other three cannot: paired with Experimental Effect it separates a chemical that induces an outcome from one that treats it — the difference between an Observation mapping to a Seizure Event and one mapping to a Decreased Seizure Event.

Maturity stages

AOPs can be classified in ways that reflect maturity of knowledge associated with a pathway, how extensively they have been developed, and how much quantitative data is available to support their use for predictive toxicology.

A 2014 paper on AOP development offers the following AOP classification options:

The paper is explicit that "categorization in a particular phase is neither entirely objective, nor absolute", and that all three stages have uses for regulatory decision support. AOPs "can evolve over time toward greater predictive sophistication (or toward obsolescence if rejected by subsequent evidence)".

A partial AOP whose Events are not all known is explicitly useful — for setting priorities and identifying what to test next.

Source: Villeneuve DL, Crump D, Garcia-Reyero N, Hecker M, Hutchinson TH, LaLone CA, Landesmann B, Lettieri T, Munn S, Nepelska M, Ottinger MA, Vergauwen L, Whelan M. Adverse outcome pathway (AOP) development I: strategies and principles. Toxicol Sci 2014;142(2), Table 3. PMID:25466378.

Evidence structure

Weight of Evidence

Evidence in v2.8 sits at two levels, and the split is easy to misread: the KER carries prose, while the ordinal grade sits on the AOP.

On the KER — five free-text fields:

Field Holds
<weight-of-evidence> prose
<biological-plausibility> prose
<empirical-support-linkage> prose
<quantitative-understanding> prose, with <description> and <response-response-relationship>
<uncertainties-or-inconsistencies> contradicting evidence, as a first-class field

The KER also carries evidence-collection-strategy, known-modulating-factors, feedforward-feedback-loops, time-scale, references, and taxonomic applicability.

On the AOP — the ordinal grades and the summaries:

Field Is
<evidence>, per relationship in the AOP's KER listing the ordinal weight-of-evidence grade
<quantitative-understanding-value> ordinal grade
<key-event-essentiality-summary> essentiality — assessed at AOP level, not on the KER
<weight-of-evidence-summary> AOP-level narrative
<overall-assessment> the Bradford-Hill-style criteria prompt: dose-response concordance, temporal concordance, strength, consistency, specificity

The grade vocabulary is High / Moderate / Low / Not Specified. Counted across the 2026-08-06 export (595 AOPs, 2361 KERs):

<evidence>                          High 2410 | Not Specified 1975 | Moderate 1120 | Low 239
<quantitative-understanding-value>  Not Specified 1896 | Moderate 525 | Low 448 | High 444

Not Specified is ~34% of weight-of-evidence grades and ~57% of quantitative-understanding grades — a large share of the deployed corpus carries no grade at all.

Grade coverage is not evidence strength, because the grade and the evidence behind it are stored in different places. The grade sits on the AOP's relationship listing; the citations and the supporting prose sit on the KER. Nothing in the serialization couples them, so a fully graded AOP can sit on top of relationships that document nothing. Whether a grade carries weight has to be checked against that KER's references, <empirical-support-linkage>, and <biological-plausibility> fields, one relationship at a time.

This is an observation about the deployed data, not about what the Handbook asks of AOP developers — the caveat above applies, and the Handbook's guidance on assigning the weight-of-evidence grade has not been read here. Worth noting for anyone who does read it that the Handbook's three-level Low/Moderate/High scale keyed to evidence ("biologically plausible, but has not been shown experimentally" through "considerable supporting evidence") belongs to KER Biological Domain of Applicability, a different construct, and should not be mistaken for the criteria behind the <evidence> grade counted above.

Biological plausibility is a named field on the KER, kept separate from empirical support, so the distinction between what is plausible and what is demonstrated is carried on individual relationships as well as on the AOP as a whole.

EMOD evidence classes

EMOD adds structure to AOP-Wiki fields that are currently free text. Two of its classes carry evidence, and they attach at different points in the backbone:

An Event may be supported by several Observations. At minimum an Observation names a stressor, a biological entity that maps to the Event, and a direction of perturbation that aligns with it. Additional biological context details like tissue, life stage and sex, are important to include when using AOPs to support comparative analysis of NAMs and context- of-use evaluation.

Citation is a third class, and it is what Observation and Evidence instances link to. It carries the fields a journal or book citation needs, including URL links for DOIs and PubMed IDs, and it replaces the free-text References fields on the AOP, KER, and Event objects. Provenance becomes a link to a record rather than a string inside one — in the deployed v2.8 corpus, KER evidence cites inline author-year references that are not bound to any particular claim.

Source: Hench VK, Caufield JH, Moxon SAT, O'Brien JM, Edwards SW. AOP-Wiki EMOD 3.0: Data Model Expansions and Content Evaluation Framework for Using Agentic AI to Improve Integration between AOPs and New Approach Methodologies (NAMs). arXiv 2605.21645, 2026. EMOD is modelled in LinkML at EHS-Data-Standards/linkml-aop, under active development.


Points of alignment and divergence

A construct or difference is listed here only if it informs an actionable direction for integration between AOPs and dismech, or blocks one until resolved. Constructs that merely resemble each other across the two models are left out.

What enables integration now

AOP / EMOD dismech What it enables
Assay / NAM ExperimentalModel, experimental_model_type, namo_type Both sides already speak NAM and bind NAMO CURIEs — the cheapest existing bridge
Citation EvidenceItem.reference Resolvable PMID/DOI on both sides, so evidence can move between them without re-keying. Modelled differently: EMOD normalizes — Citation is its own record that Observation and Evidence instances link to — while dismech bundles the reference, its quote, and its polarity into one EvidenceItem attached directly to the claim
KEC Object / Process cell_types, biological_processes, locations Shared GO/HP/CL/UBERON terms make Event-to-node matching computable rather than manual
KEC Action Descriptor.modifier Both PATO-derived; mappable term by term
Experiment Type EvidenceItem.evidence_source Mappable term by term, with one named gap: no clinical or epidemiological term on the AOP side
Evidence (attached to the KER) CausalEdge.evidence A validated verbatim quote supporting causality between two Events — the unit a KER with no weight-of-evidence assessment needs
Observation (attached to the Event) EnvironmentalMechanismTarget.evidence, ExperimentalReadout.evidence Grounds a stressor/exposure-to-mechanism record, with direction, in a quote validated against the cited source
Event reuse across AOPs; consensus Events kb/modules/ plus Pathophysiology.conforms_to Both frameworks factor a recurring mechanism out of the entries sharing it. A module node is dismech's consensus Event, and conforms_to declares an entry's node "an organ-specific instance of" it — the relation needed when two AOP authors name one process differently. It is deliberately not inheritance: conforming entries duplicate the content, so this checks consistency and does not merge graphs. Event reuse does not make an AOP a mechanism boundary, though — see An AOP is a publication unit, not a mechanism boundary

The module layer is the part of dismech with no counterpart named elsewhere in this table, and it is the closest dismech comes to the AOP's stressor-agnostic posture — a module describes a conserved process rather than one disease. Where an AOP reuses one Event across several pathways, dismech writes the process once in kb/modules/ and has each entry declare conformance to it.

The first row is the cheapest bridge and the one worked through below: The liver fibrosis NAM use case maps a curated ExperimentalModel onto the seven Key Events of AOP 38 and records what does and does not land on a mechanism node.

What blocks integration until resolved

Divergence Detail
No population level AOP's levels of biological organization include Population; BiologicalScaleEnum has MOLECULAR, CELLULAR, TISSUE, ORGANISM and stops at the individual
No taxonomic applicability AOPs qualify Events, KERs, and whole pathways by species; dismech records species only at model level, never on a mechanism
Toxicokinetics inside the causal chain ADME sits outside an AOP by design — it determines dose at the MIE, and folding it in is what makes an AOP chemical-specific. dismech chains ADME steps and key events together with nothing marking which is which
Stressor-agnostic vs disease-anchored An AOP deliberately excludes the stressor so one pathway serves many chemicals; a dismech graph is anchored to a single disease and pulls the exposure in as a node
AOP identity is provenance, not structure A dismech module is a mechanism boundary; an AOP is a publication unit. One relationship, KER 2124, is listed in 10 AOPs — the same causal step asserted ten times over. Mapping between modules and AOPs is therefore many-to-many, and a count of AOPs is not a count of mechanisms
Method and test system unreachable from the evidence EMOD reifies the observation: Evidence on the KER links an upstream and a downstream Observation, each pointing at an Assay carrying detection_technology, with taxon, sex and life stage on Evidence itself and organ and cell on the Event. dismech's EvidenceItem is a reference, a quote and a polarity attached directly to the claim, with no path to any of that. The node-level counterpart does exist — Pathophysiology.assays mirrors Event.assays — but is unused: 0 of the 564 assay entries in kb/ bind an OBI term, and 2 sit on a pathophysiology node. See How each model records the way a claim was measured

Where the toxicokinetic boundary falls, in the pilot entry

The toxicokinetics row above is not an abstract difference. In Lead_Poisoning it is where every exposure lands: all ten environmental: entries — paint, household dust, drinking water, spices, lead-soldered cans, battery manufacture, mining, e-waste recycling, and both adulterated-opioid routes — carry environmental_effect: TRIGGERS into one node, Lead absorption (kb/disorders/Lead_Poisoning.yaml:105). That node flows to Systemic lead distribution (line 131) before the chain reaches either initiating-event-shaped node: Inhibition of delta-aminolevulinic acid dehydratase (line 268) and NMDA receptor blockade in glutamatergic neurons (line 436, biological_scale: MOLECULAR). Absorption and systemic distribution are ADME.

That is a negative result for one row of the candidate-correspondence table in #8309, produced by #8309's own pilot entry. The table read the molecular initiating event as the "node targeted by a TRIGGERS influences_mechanisms link", hedged as loose because dismech targets "aren't required to be molecular or measurable". In this entry the fit is not loose but wrong in a specific direction: ten of ten TRIGGERS edges land on a toxicokinetic node, and every candidate for the initiating event sits two hops downstream. Neither the edge nor biological_scale marks which kind of step a node is.

Worth stating alongside it: none of the 35 Key Events tabulated below is a heme-synthesis or ALAD event. The 21 cardiac Events are electrophysiologic and the 14 neurodevelopmental ones are glutamatergic, MEK/ERK, mitochondrial and BDNF. So the node this correction nominates as initiating-event-shaped has no counterpart anywhere in the comparator set — material for the seeding direction, where dismech supplies a candidate the eight lead AOPs never reach, rather than a gap on the dismech side.

Recorded as a schema question at question 6.

An AOP is a publication unit, not a mechanism boundary

A dismech module draws a boundary around a mechanism. An AOP does not: it packages one causal story for publication and evaluation, so the same causal step is routinely carried by many AOPs, and one AOP set routinely spans several mechanisms. Three rules follow, and they bind on anything consuming AOP-Wiki lookups in bulk.

  1. An AOP identifier says which pathway asserted a causal step. It is provenance — carried on the edge, and cited when reporting.
  2. It is not a grouping, counting, or de-duplication key.
  3. A mechanism is recovered from a set of relationships by grouping on shared Key Events — the connected components of the relationship graph — not by parent AOP.

This is the framework's own design rather than an artifact of how AOP-Wiki has been curated. Villeneuve et al. 2014 state it as three of the five founding principles (PMID:25466378):

(2) AOPs are modular and composed of reusable components-notably key events (KEs) and key event relationships (KERs); (3) an individual AOP, composed of a single sequence of KEs and KERs, is a pragmatic unit of AOP development and evaluation; (4) networks composed of multiple AOPs that share common KEs and KERs are likely to be the functional unit of prediction for most real-world scenarios

The companion best-practices paper (PMID:25466379) instructs authors to build on existing KE and KER descriptions rather than write redundant ones, which is what produces the reuse in the first place.

How each model records the way a claim was measured

Issue #10772 asks where an evidence item says how a causal claim was measured — the test system the observation was made in, and the technique that produced the number. Neither is the study category, which is what EvidenceItem.evidence_source records with five values. The comparison is worth stating carefully, because the obvious framing — dismech lacks a field EMOD has — is wrong in both halves.

EMOD does not put the method on its evidence object either. In src/linkml_aop/schema/aop_emod_linkml.yaml the work is divided across four classes:

EMOD class Attaches to Slots carrying "how it was measured"
Assay referenced by Observation and by Event title, description, detection_technology, biological_action_id, external_assay_id
Observation the Event assay_id, biological_object_id, biological_process_id, biological_action_id, stressor_id, phenotype, plus events and citations
Evidence the KER upstream_observation_id, downstream_observation_id, citation_id, taxon_term_id, sex_term_id, life_stage_term_id, experimental_design, notes
Event measured_or_detected, has_method_text, assays, organ_term_id, cell_term_id

Evidence has no assay slot. It reaches the method indirectly, through the two Observations it links, each of which points at an Assay. The two things #10772 separates are not kept together on the EMOD side either: the technique lands on Assay.detection_technology, species, sex and life stage on Evidence, and organ and cell type on Event.

So "add a ninth field to EvidenceItem" is not what EMOD did. The closer statement is that EMOD interposes a reified observation between the citation and the claim, and dismech has no such object — EvidenceItem collapses reference, polarity and quote into one thing attached directly to the claim. The Citation row of What enables integration now already makes this point for provenance; the method is the same shape of difference.

Pathophysiology.assays is the structural counterpart of Event.assays, and it is effectively unused. Both frameworks put the method on the node, so this is a rare place where the two models agree structurally and diverge only on whether the slot carries content. In dismech assays is defined on four classes — Pathophysiology, Biochemical, ExperimentalReadout and Experiment — with range AssayDescriptor, whose term binds to the AssayTerm dynamic enum rooted at OBI:0000070 (assay). Counted across kb/ on 2026-09-07:

The five OBI CURIEs that do exist in kb/ are not assays: four are OBI:0002503 (feces specimen) used as a dataset sample_types value in Parkinsons_Disease, and one is OBI:0003552 as an Experiment.experiment_type in CTCF-related_Neurodevelopmental_Disorder.

Nothing checks the slot either. OBI is in the schema's prefix map but has no adapter in conf/oak_config.yaml and no cache/enums/ membership cache, so an assay term cannot be validated the way an HP, GO or CL term is — and CLAUDE.md accordingly tells curators to prefer biological_processes (GO) until that gap closes. The accurate reading of the gap is therefore not that dismech has nowhere to record the method, but that it has the slot in the right place, steers curators away from it, and has never wired up the ontology behind it. That is the open construct already flagged under What this page is.

On the AOP side this is content today, not only schema. Event.measured_or_detected is the deployed "How It Is Measured or Detected" field and is present in the v2.8 corpus this repo already queries: the aop-wiki skill surfaces it as measurement_method on all 1,598 Events in the 08-06-2026 snapshot, alongside a has_method flag and a shipped methods_nams search config for NAM assay methods. That makes this divergence different in kind from the other rows above, which compare schema with schema. Here there is harvestable free text on one side and an empty slot on the other.

ECO is absent from dismech, and it is the vocabulary this would need. There is no ECO prefix in the schema's prefix map and no ECO CURIE anywhere in src/, conf/ or kb/. The ECO/OBI distinction decides where a term would go: OBI types the assay — a patch clamp was performed, a property of the experiment, which is why dismech put assays on the node — while ECO types the evidence — this claim is asserted on patch-clamp evidence, a property of the evidence item. Assay.detection_technology is the OBI-shaped one. Both of #10772's own examples resolve in both ontologies:

Example ECO (types the evidence) OBI (types the assay)
whole-cell voltage clamp ECO:0006014 whole-cell patch-clamp recording evidence OBI:0002178 whole-cell patch clamp assay
FRET biosensor ECO:0001048 fluorescence resonance energy transfer evidence

Also on the ECO side: ECO:0006012 patch-clamp recording evidence and ECO:0005584 macropatch voltage clamp recording evidence.

Sibling gap. #9421 asks what EvidenceItem cannot say about how strong a claim is; #10772 asks what it cannot say about how it was measured. Item 5 of #9421 already proposes an ECO binding in almost these words, and one of its comments proposes letting an evidence item point at the model it came from — which would answer both without a new descriptor, and matches EMOD's indirection through a reified object rather than more slots on the evidence item. If a schema change ever happens it is likely to be one change, not two. No schema change is proposed here; #10772 is explicit that the decision belongs in its own issue.

Until then the only home is the free-text explanation, which nothing gates — check-snippet-length and check-title-snippets act on snippet. For such a clause to be migratable later it has to be a literal fixed prefix a grep can find (Measured by <method> in <system>. as the first sentence, identically every time), and it must not restate evidence_source. Budget for the cleanup either way: CLAUDE.md's "Retired Enum Values" section records that #10003 migrated 11,804 evidence items and left roughly 3,600 explanation fields still arguing for a value the schema had dropped. Nothing flags prose that outlives the construct it describes.


What dismech could contribute to AOP EMOD

The reverse direction: dismech constructs that address a problem the AOP schema has not yet solved. This is outbound — a contribution to another project, not a change to dismech.

Evidence bound to a validated quote

EvidenceItem.snippet requires every evidence item to carry a verbatim quote from the cited source, machine-checked against the fetched text; a paraphrase fails validation. The AOP schema binds citations to a KER or an Event, but nothing binds a specific claim to specific words in the source.

This matters most where EMOD is explicitly headed. Structuring evidence for AI-readiness raises the question of what stops a generated claim from drifting off its source, and a required verbatim quote is a check that runs without a human reading the paper. dismech has run on this constraint across ~2000 entries.


The Lead Poisoning use case

#8309 named one pilot comparison: AOP 17 against Lead_Poisoning. AOP 17's prototypical stressors are methylmercuric(II) chloride, mercuric chloride and acrylamide; lead is not among them, and #8309 named the pair as a mechanism-class comparator rather than a chemical one. The AOP side used below is drawn from lead's own pathways instead. The dismech side did not change — Lead_Poisoning remains the pilot comparator entry named in Scope.

The AOP side draws on the eight AOPs that AOP-Wiki aggregates under lead as a prototypical stressor (stressor 59): AOPs 12, 499, and 500 (neurodevelopmental) and 552, 555, 556, 558, and 560 (cardiac).

Weight of evidence across the eight lead AOPs

They are a stark worked instance of the gap between grade coverage and evidence described under Weight of Evidence above. All 40 relationship listings across them carry a grade and none is Not Specified — by the corpus measure there, exemplary. But of their 36 unique KERs, 20 carry no references, no empirical-support text and no biological-plausibility text at all, and 18 of those 20 are graded High. The empty ones are exactly the 20 cardiac KERs — every relationship in AOPs 552, 555, 556, 558 and 560 — while the 16 neurodevelopmental KERs in AOPs 12, 499 and 500 each carry roughly 1,500–10,600 characters of references alongside empirical-support and plausibility narrative. The grades then run backwards to that documentation: all three Low grades and seven of the nine Moderates sit on the documented neuro relationships, while the undocumented cardiac ones are almost uniformly High. The same inversion holds one level up — AOP 12 is the only OECD-endorsed pathway of the eight, and the only one carrying Low grades.

Do dismech modules already hold the consensus Events?

Asking whether Events chosen by different AOP authors denote one process is a question dismech answers in kb/modules/, not with mechanistic_hypotheses — a module node is the generic process and conforms_to declares an entry's node an organ-specific instance of it. Testing that against the 21 unique Key Events in the five cardiac lead AOPs, with cardiac_ion_channel_repolarization and cardiomyopathy_maladaptive_remodeling as the candidate modules:

KE Event Module node Fit
698 Altered, Action Potential Altered Action Potential and Calcium Handling yes
1961 Prolongation of Action Potential Duration Altered Action Potential and Calcium Handling yes — module names long QT physiology
1962 Prolongation of QT interval Altered Action Potential and Calcium Handling yes
389 Increased, Intracellular Calcium overload Altered Action Potential and Calcium Handling yes — calcium ion transport
2289 Hyperphosphorylation of RyR2 Altered Action Potential and Calcium Handling yes — module names SR calcium-release destabilization
2283 Increased early premature depolarizations Arrhythmogenic Substrate and Triggered Activity yes — module names EADs
1963 Torsades de Pointes Ventricular Tachyarrhythmia yes — module names torsade
1106 Occurrence, cardiac arrhythmia (AO) Arrhythmogenic Substrate and Triggered Activity yes
2291 Slowed Heart Rate Sinoatrial Node Pacemaker Dysfunction yes — module names sinus bradycardia and HCN4
2292 Altered Cardiac Electrical Conduction Sinoatrial Node Pacemaker Dysfunction yes
1321 Increased, intracellular sodium Altered Action Potential and Calcium Handling partial — module names late sodium current, not Na⁺ accumulation
2287 Impaired Sodium-Calcium Exchange Arrhythmogenic Substrate and Triggered Activity partial — NCX appears only in the DAD description
2281 Increased uncoordinated cardiac contraction Ventricular Tachyarrhythmia partial
1532 Decrease, Cardiac contractility Progressive Contractile Dysfunction endpoint only — see below
1535 Heart failure (AO) Structural Cardiac Impairment and Heart Failure endpoint only — see below
1529 Blockade, L-Type Calcium Channels (MIE) none
593 Inhibition, ERG voltage-gated potassium channel (MIE) none
1562 Decreased Na/K ATPase activity (MIE) none
2288 Phosphodiesterase inhibition (MIE) none
2290 Inhibition of Funny current (If) (MIE) none
693 Increased, cyclic adenosine monophosphate none

Ten of 21 map cleanly and three partially, and the eight that do not fall into three groups that each say something different.

All five MIEs are unmatched, and for one reason. The electrophysiology module starts with a genetic cause, while an AOP starts with the damage itself — so a chemical that does the same damage has nothing to attach to. cardiac_ion_channel_repolarization begins at Cardiac Ion-Channel or Calcium-Handling Variant, described as "a pathogenic germline variant alters a cardiac ion channel". AOP 552 begins at Blockade, L-Type Calcium Channels and stays silent on what did the blocking, which is what lets one pathway serve many chemicals. A calcium channel that is not working produces the same altered action potential whether a mutation broke it or lead is sitting in it, so everything downstream matches — but lead cannot conform to a node that asserts the cause was a mutation. All five unmatched MIEs are electrophysiologic, so all five fall in this module's territory.

The claim is specific to that module, not a property of the module layer, and not even true of the other cardiac module here. cardiomyopathy_maladaptive_remodeling opens at Primary Cardiomyocyte Insult, which is explicitly etiology-agnostic: a variant "in inherited cardiomyopathies", but "in acquired and secondary cardiomyopathies … a hemodynamic (pressure or volume overload), metabolic, toxic, or inflammatory stress". A chemical insult is named in the node itself. Other modules open exactly where an AOP would — drug_induced_nephrotoxicity at "Nephrotoxic Drug Exposure and Tubular Uptake", drug_induced_liver_injury at "Reactive Drug Metabolite Formation", diabetic_vascular_complications at "Chronic Hyperglycemia". dismech expresses chemical entry points routinely; the module covering lead's cardiac electrophysiology was written for inherited channelopathy and does not.

The contractility arm reaches a matching endpoint by a different route. KE1532 → KE1535 asserts calcium overload depresses contractility and produces heart failure directly. cardiomyopathy_maladaptive_remodeling reaches the same outcome through neurohormonal activation and ventricular remodeling, and cardiac_ion_channel_repolarization explicitly scopes itself to "structurally normal hearts". So the endpoints align while the mechanism between them does not — the AOPs compress a chain the module expands, or assert an acute pump failure the module does not model.

The cAMP/PDE arm is simply absent from both modules.

The neurodevelopmental side scores worse, and for a different reason

Repeating the exercise on the 14 unique Key Events in AOPs 12, 499, and 500, against glutamate_excitotoxicity, synaptic_vesicle_cycle, mitochondrial_dysfunction, and excitatory_synapse_scaffold_disruption:

KE Event Module node Fit
1339 Increase, intracellular calcium Glutamate Receptor Overactivation and Calcium Overload yes
2151 Disruption, neurotransmitter release Neurotransmitter Release Failure and Synaptic Transmission Deficit yes
177 Increase, Mitochondrial dysfunction Mitochondrial Dysfunction and Oxidative Stress yes
1115 Increase, Reactive oxygen species Mitochondrial Dysfunction and Oxidative Stress yes
55 Increase, Cell injury/death Excitotoxic Neuronal Death partial — module's death is excitotoxic specifically
1262 Apoptosis Excitotoxic Neuronal Death partial — same
352 N/A, Neurodegeneration (AO) Excitotoxic Neuronal Death partial — generic outcome against a specific one
341 Impairment, Learning and memory (AO) Neurodevelopmental Phenotypic Output partial — from excitatory_synapse_scaffold_disruption
201 Binding of antagonist, NMDA receptors (MIE) none — sign-inverted, see below
195 Inhibition, NMDARs none — sign-inverted
52 Decreased, Calcium influx none — sign-inverted
381 Reduced levels of BDNF none — no module covers BDNF
188 Neuroinflammation none — appears only fused into organ-specific composite nodes
2146 Activation of MEK/ERK1/2 (MIE) none — MAPK nodes exist but all are proliferation- or fibrosis-framed

Four of 14 clean and four partial — worse than the cardiac side, despite these being the well-documented AOPs. Documentation quality and module coverage turn out to be independent.

The reason is worth recording, because it is not the entry-point problem again. Three of the six misses fail together because dismech's only glutamate module is the mirror image of lead's mechanism. glutamate_excitotoxicity is built end to end on overactivation — "Excessive Glutamatergic Stimulation and Impaired Glutamate Clearance", "Glutamate Receptor Overactivation and Calcium Overload" — while lead's neurodevelopmental MIE is NMDAR antagonism, giving decreased calcium influx. The sign is inverted at every node, so KE52 cannot conform to a node whose name asserts overload even though modifier could carry the direction.

This is the same directional split the OpenScientist report hit as its Finding 9 and handled by keeping KE52 out of the merge. Finding it independently on the dismech side establishes it as a real gap rather than an AOP-authoring artifact: the KB has no module for developmental hypo-activation of glutamatergic signalling. Note the split runs inside the neuro cluster — KE1339 (increase, from the MEK/ERK arm of AOPs 499 and 500) conforms cleanly while KE52 (decrease, from AOP 12) cannot, so no single calcium node holds both.

The result cuts both ways. Two-thirds of the cardiac Events already have a home in modules written for inherited arrhythmia and cardiomyopathy, with no lead in view — which is the Event-reuse property that makes AOP networks work, arrived at independently. But conformance is consistency-checking, not inheritance, so this yields a checkable claim that two Events are instances of one process and not a merged network render. The graph half of the question stays a query over the XML export.

The rest is not yet written. A consensus network from OpenScientist was the original plan for the AOP side; whether it is still the right comparator is open, given the assessment recorded in AOP_EMOD_ALIGNMENT/assessments/.


The liver fibrosis NAM use case

The lead pilot enters from the stressor: start from a chemical, collect the AOPs naming it a prototypical stressor, compare those against a dismech entry. This second case enters from the assay — start from a NAM built to measure Key Events and ask what it maps onto. It crosses the first row of the enabler table, Assay/NAM to ExperimentalModel, which nothing had exercised, and it meets different obstacles than the stressor-first pass because a NAM's readouts are Key Event measurements before they are anything about a chemical.

The system is the Akura Twin 384-well liver fibrosis microphysiological system (PMID:40754287, Schmidt & Suter-Dick, Toxicology 2025), curated in Liver_Cirrhosis and drug_induced_liver_injury as an experimental_models entry with namo_type: namo:CoCulture. HepaRG hepatocyte microtissues, with or without THP-1 monocytic cells, occupy one compartment of each of 168 interconnected well pairs and hTERT-HSC stellate microtissues the other; TGF-β1, methotrexate and acetaminophen are the three challenges. The paper states its own purpose in AOP terms — built "to quantify the key events of the liver fibrosis AOP" — so the AOP framing is the authors', not applied afterwards.

Its target is AOP 38, Protein Alkylation leading to Liver Fibrosis: OECD WPHA/WNT Endorsed, 94.12% record completion in the 2026-08-06 export. Of the eight lead AOPs only one is endorsed, so confidence in the AOP side is higher here than in the lead use case — though endorsement raises confidence in a hypothesis about a causal chain and does not make the chain a finding.

The correspondence

Levels of biological organisation are AOP-Wiki's, from the 2026-08-06 export. Node names unqualified by a module prefix are Liver_Cirrhosis pathophysiology nodes.

KE Event LoBO Akura Twin readout dismech node Fit
244 Alkylation, Protein (MIE) Molecular none — see below
55 Increase, Cell injury/death Cellular albumin ↓ Hepatocyte Injury and Death yes
1492 Tissue resident cell activation Cellular ALOX5AP, TREM2 ↑ Kupffer Cell Activation partial — THP-1 is not tissue-resident
1493 Increased Pro-inflammatory mediators Tissue PAI-1, TGF-β1 ↑ Hepatic Pro-Inflammatory Mediator Release partial — confounded with the stimulus
265 Increase, Hepatic stellate cell activation Cellular ACTA2, COL1A1, COL3A1, FN1 ↑ Hepatic Stellate Cell Activation → fibrotic_response#Mesenchymal Cell Activation yes
68 Increase, Collagen accumulation Tissue Pro-Collagen 1A1, CTGF ↑ fibrotic_response#Excessive ECM Deposition yes — but the readout is curated on the KE 265 node
344 Increase, Liver fibrosis (AO) Organ none — Liver_Cirrhosis is a later event, see below

Five of seven Events map to a mechanism node, and the two that do not are the two endpoints. That is a more useful statement of the fit than the count, and it is the same shape the lead pilot found from the other direction.

Three rows are weaker than the other two

Worth carrying rather than reading the table as uniform.

Both endpoints fall outside the node layer

AO 344 has no dismech node, and the nearest object is a different event. Nothing in Liver_Cirrhosis represents liver fibrosis at organ scale — the entry's pathograph runs from stellate activation to portal hypertension and synthetic dysfunction without one. The tempting move is to match the adverse outcome to the Liver_Cirrhosis entry itself, and that is wrong: fibrosis and cirrhosis are not the same event. Fibrosis is extracellular matrix accumulation; cirrhosis is the architectural end-stage downstream of it, and a chronically fibrotic liver is not yet a cirrhotic one. fibrotic_response already keeps the two apart, separating Excessive ECM Deposition from Architectural Distortion and Organ Dysfunction, and collapsing them here would undo that distinction in the one place the mapping is meant to demonstrate it.

So the empty AO row is a curation gap — the KB has no organ-level liver-fibrosis event — rather than a statement about where correspondences attach.

KE 244 has no node either, which is the lead pilot's MIE result reached from the opposite direction: dismech has no node for a chemical's molecular initiating interaction in this entry.

Does the acetaminophen arm reach KE 244?

The issue asks because NAPQI, acetaminophen's reactive metabolite, alkylates protein, and KE 244 is the one empty row. This is not settled here — the full text is subscription-only (content_type: abstract_only in references_cache/PMID_40754287.md; not open access, not in PMC), and the abstract does not say alkylation. Two things point against it:

So the likely reading is that the acetaminophen arm is a KE 55 challenge, and that a system built expressly to quantify AOP 38 instruments it from KE 55 downward and leaves the MIE unmeasured. That is a statement about where a NAM sits on a pathway, not a defect in the assay or in the mapping — a partial AOP with unmeasured Events is explicitly useful for setting priorities and identifying what to test next. What would overturn it is a Methods section reporting GSH depletion, an APAP-protein adduct immunoassay, or CYP2E1 activity; an author query (Suter-Dick, FHNW) or an institutional-repository copy would settle it.

Which layer the correspondence sits at

Recorded as an observation; the structural question the issue raises belongs in its own decision, per this page's scope.

An AOP Event is stressor-agnostic and reused across pathways, which is what the enabler table already pairs with kb/modules/ plus conforms_to. The counts make the difference concrete. In the KB as of this writing, fibrotic_response#Mesenchymal Cell Activation is conformed to by 28 pathophysiology nodes and fibrotic_response#Excessive ECM Deposition by 21 — so a KE 265 or KE 68 correspondence asserted on the module node reaches every one of them, while the same correspondence asserted on Liver_Cirrhosis reaches one entry and has to be re-asserted on the next fibrotic disease.

Idiopathic_Pulmonary_Fibrosis is the case that tests this rather than assuming it: its microengineered alveolar lung-on-chip (PMID:41406599, namo_type: namo:OrganOnChip) links to Fibroblast activation and myofibroblast differentiation and Excessive extracellular matrix deposition, which conform to those same two module nodes. Two NAMs, two organs, one pair of module nodes — the module layer already holds what a KE correspondence would need to travel across.

Cross-reference is separable from citation

The constraint that AOP-Wiki is not citable in dismech's validation stack — no fetcher, no cacheable body for a snippet to substring-match against — is about citation. It does not by itself settle cross-reference, and the two are separable because AOP-Wiki identifiers are registered and resolvable:

Prefix Registry name Resolves to
aop AOPWiki aopwiki.org/aops/$1
aop.events AOPWiki (Key Event) aopwiki.org/events/$1
aop.relationships AOPWiki (Key Event Relationship) aopwiki.org/relationships/$1
aop.stressor AOPWiki (Stressor) aopwiki.org/stressors/$1

All four are in identifiers.org and Bioregistry with pattern ^\d+$, and all four resolve — https://identifiers.org/aop.events:265 lands on https://aopwiki.org/events/265 (checked 2026-08-29).

This is recorded as a fact about the identifiers, not as a proposal. Declaring any of these in the schema's prefixes:, and whether a Pathophysiology or disease-level cross-reference slot should exist to carry them, are open questions — see Open schema questions below. No aop*: CURIE appears anywhere in kb/.

What the scale axis showed

AOP-Wiki gives every Event a Level of Biological Organisation and dismech's counterpart is biological_scale, so it is the one axis both sides already carry — and it was empty on almost every node this use case touches. Tagging them is schema-free and makes the correspondence checkable:

dismech node biological_scale AOP LoBO it aligns with
Liver_Cirrhosis Hepatocyte Injury and Death CELLULAR KE 55 Cellular
Liver_Cirrhosis Hepatic Stellate Cell Activation CELLULAR KE 265 Cellular
Liver_Cirrhosis TGF-beta Signaling in Fibrogenesis MOLECULAR — (the stimulus arm; no KE)
Liver_Cirrhosis Kupffer Cell Activation CELLULAR KE 1492 Cellular
Liver_Cirrhosis Hepatic Pro-Inflammatory Mediator Release TISSUE KE 1493 Tissue
fibrotic_response Tissue Injury TISSUE KE 55's module counterpart
fibrotic_response Inflammatory Recruitment and Amplification TISSUE KE 1493 Tissue
fibrotic_response Mesenchymal Cell Activation CELLULAR KE 265 Cellular
fibrotic_response Excessive ECM Deposition TISSUE KE 68 Tissue
fibrotic_response Architectural Distortion and Organ Dysfunction TISSUE — (cirrhosis-ward, downstream of AOP 38's AO)

Two things fell out of doing it.

One node was left unset, and the reason is the finding — since acted on. Kupffer Cell and Inflammatory Response mapped to two Events at two different levels — KE 1492 Cellular and KE 1493 Tissue — so no single biological_scale value described it, and guessing one would have hidden exactly what the mapping exposed. biological_scale is single-valued by design, and CLAUDE.md reads a node that would naturally take two as a signal that it bundles two mechanistic claims. That finding motivated a curation change (#10314): the node has since been split into Kupffer Cell Activation (CELLULAR, KE 1492) and Hepatic Pro-Inflammatory Mediator Release (TISSUE, KE 1493), each with its own evidence and modeled_mechanisms readouts.

AOP's Organ level is not the gap it looks like. BiologicalScaleEnum has no ORGAN value, but TISSUE is defined as "tissue / organ scale" and its description names organ substrates explicitly, so an organ-level Event has a scale to sit at whenever a node exists for it. The divergence table's "no population level" row stands; there is no comparable organ-level gap. That KE 344 is unmapped is a missing node, not a missing scale value.


Open schema questions

Six things this project has surfaced that dismech's schema currently cannot express. They are recorded here as questions, with the observation that raises each one, and deliberately without a proposed answer. Working them is tracked at #10272; an answer belongs on this page, next to the question it resolves. The list is a first pass at naming what is missing, so a question may be reworded, split, merged, or dropped as the project develops.

Three come from the liver fibrosis NAM use case above and three restate rows already in the divergence table as dismech-side questions rather than as descriptions of how the two frameworks differ.

1. Should a pathophysiology node be able to carry a Key Event cross-reference?

Five of AOP 38's seven Key Events correspond to a named dismech mechanism node, and nothing in the schema can record that. No slot exists, and no AOP identifier appears anywhere in the schema, so there is nothing for a correspondence to point at and nowhere to put it.

A prior question sits underneath this one: whether dismech recognizes a Key Event as an entity at all, or only as a label applied to something it already has.

2. Where does an adverse outcome correspondence attach?

AOP 38's adverse outcome, KE 344 Increase, Liver fibrosis, has no dismech node. The nearest object is the Liver_Cirrhosis entry, and matching it there would conflate two different events — fibrosis is matrix accumulation, cirrhosis is the architectural end-stage downstream of it.

Two questions are tangled here and only one is about the schema. Whether the KB should carry an organ-level liver-fibrosis event is curation, and until it does this case cannot settle anything. The schema question is whether an adverse outcome correspondence attaches to a pathophysiology node, to the disease entry, or to both — and whether that is the same slot as question 1 or a different one.

Questions 1 and 2 are separable but entangled: the same identifier, possibly two levels.

3. Should the AOP-Wiki prefixes be declared in the schema?

aop, aop.events, aop.relationships and aop.stressor are registered in identifiers.org and Bioregistry, all with pattern ^\d+$, and all four resolve — https://identifiers.org/aop.events:265 lands on https://aopwiki.org/events/265 (checked 2026-08-29).

This is the smallest and most independent of the six, because declaring a prefix is a different act from citing an AOP page as evidence. Citation stays blocked: there is no fetcher and no cacheable body for a snippet to substring-match against, so an AOP or Key Event page cannot be an evidence reference:. Primary literature from the AOP's own references field can be, through the normal fetch-and-verify route.

4. Should BiologicalScaleEnum gain a population level?

AOP-Wiki's levels of biological organisation run Molecular, Cellular, Tissue, Organ, Individual, Population — 36 Events sit at Population in the 2026-08-06 export. BiologicalScaleEnum stops at ORGANISM.

Note that Organ is not a second gap: TISSUE is defined as "tissue / organ scale" and its description names organ substrates explicitly, so an organ-level Event has a scale to sit at wherever a node exists for it. Population is the only level with no counterpart.

5. Should species applicability be recordable on a mechanism?

AOPs qualify Events, KERs and whole pathways by NCBITaxon. dismech records species only at model level — on animal_models and experimental_models — and never on a pathophysiology node, so a mechanism carries no statement about which organisms it is claimed to hold in.

6. Should a node be markable as toxicokinetic rather than as a mechanism step?

ADME sits outside an AOP by design: it determines dose at the initiating event, and folding it in is what would make the pathway chemical-specific instead of serving many chemicals. A dismech chain runs absorption and distribution steps together with mechanism steps and marks neither, so the two cannot be told apart by a reader or by tooling.

Lead_Poisoning is the case that shows it — lead absorption and systemic distribution are ADME, while Inhibition of delta-aminolevulinic acid dehydratase is the initiating-event-shaped node, and the entry draws them the same way.


Next Steps

The end goal this project leads to is dismech-derived AOPs — dismech pathographs as source material for new AOPs, and dismech evidence as support for existing ones. Two directions, in order of how close they are.

Enriching existing AOPs is the nearer one, and it needs no structural change on either side. A dismech EvidenceItem carries a resolvable identifier plus a quote validated against the source, which is close to what a KER with no weight-of-evidence assessment needs — and Not Specified accounts for ~34% of weight-of-evidence grades and ~57% of quantitative-understanding grades in the deployed corpus.

Seeding new AOPs is the further one, and the divergences above are what stand in the way: the toxicokinetic steps in a dismech chain have to be separated from the key events, species applicability and a population level have no dismech counterpart, and a disease-anchored graph has to be cut stressor-agnostic before it is an AOP.

First attempt at seeding

Two files take that second direction from the abstract to a worked case:

They sharpen the first divergence listed above rather than resolving it. Skeletal_Fluorosis reproduces the Lead_Poisoning toxicokinetic result exactly — all five exposures land on an intake node two hops upstream of the first molecular event — so that is now a pattern across two independently curated entries, not an observation about one file.