I sit firmly in the two-hierarchy camp described in 2.3, and apologies for the length post but I wanted to ensure my rationale was clearly laid out in a single post.
An observable entity is an inherent property of something that can be observed, whether or not anyone measures it. An evaluation procedure is the activity of evaluating that property. The observation is the result. An infant has a weight whether or not we weigh them; weighing the infant is a procedure; “4.1 kg” is the observation. These are three different things, and the difference is not one of phrasing.
The premise does not survive contact with the current content. The document’s core claim is that evaluation procedures are empty, unmodelled placeholders that are “for all intents and purposes, observables with a different semantic tag.” That is not what the edition shows. Take the poster-child pair:
- 33747003 |Glucose measurement, blood| is sufficiently defined, with
Method = 129266000 |Measurement - action| and a blood specimen. It is modelled as an act.
- 434912009 |Blood glucose concentration| is primitive, with no attributes at all.
Even here the two are not interchangeable. The procedure carries the specimen and the measurement action; the observable is a bare property. They resemble each other because this domain has sat in editorial hiatus for the best part of a decade, not because they are the same kind of thing.
At scale, the “under-modelled procedures” claim is actually reversed. <122869004 |Measurement procedure| is roughly 57% sufficiently defined (4,362 of 7,695); <363787002 |Observable entity| is roughly 15% (1,694 of 11,158). @jcase, your point above that order concepts are modelled much less completely than observables is the opposite of what I find. If either hierarchy is the primitive, under-specified one, it is observables, which I would put down to LOINC owning the result space (OBX-3) for decades rather than any defect in the procedure model.
Look-alike is not the same. Much of the case for one hierarchy rests on the two containing near-identical pairs. But SNOMED deliberately maintains near-homonym concepts across hierarchies all the time, because they are different kinds:
- 429040005 |Ulcer (disorder)| and 56208002 |Ulcer (morphologic abnormality)|
- 425558002 |Azoospermia disorder (disorder)| and 48188009 |Azoospermia (finding)|
- 78014005 |Urine (substance)| and 122575003 |Urine specimen (specimen)|
- 387207008 |Ibuprofen (substance)| and 38268001 |Product containing ibuprofen (medicinal product)|, which share the same preferred term in the AU edition
Nobody proposes merging morphologies into clinical findings because they carry the same term. The same reasoning applies to observable and evaluation procedure.
The subsumption argument is the one that sounds strongest, but it conflates a modelling problem with a structural one, and it does not require a single hierarchy. If you want every glucose observation, that is a query within the observable hierarchy: a grouper concept, or ECL over the component, <363787002 |Observable entity| : 246093002 |Component| = 67079006 |Glucose|. That query is thin today, three concepts, only because the observable hierarchy is barely modelled, not because the procedures are in the way; the same query against the procedure hierarchy returns 88. So the difficulty is modelling maturity, and merging the two would not fix it, because you would still have to populate the same attributes to make the query work.
If you want observations and requests together, that is inherently a two-field question: the request sits in OBR-4 or ServiceRequest.code, the result in OBX-3 or Observation.code. You are already reading two fields, so matching each with its appropriate hierarchy is the natural fit rather than an overhead, and where legacy records have placed procedure codes in the result field the query can simply include both. That is a data-quality artefact, not a reason to restructure the terminology. On core versus extension, I agree that core keeping orders in evaluation procedure while the LOINC extension places results in observable is confusing, but the fix is clear guidance on which code belongs in which field, not collapsing the hierarchies.
The tag proposals make my point for me. Introducing an “observation order” tag, or the three tags Jim describes (order-only, observation-only, and a third for the overlap), is an admission that these are two different kinds of concept. It just re-encodes that distinction lexically inside a single hierarchy, with an extra tag for the grey zone, instead of using the hierarchy split that already carries it. And a semantic tag is the weaker mechanism: it labels but does not classify, so the reasoner cannot act on it, whereas it can act on two hierarchies. John’s own rule, that an observable must never parent an observation order, concedes the same point.
The single-hierarchy story only looks plausible for atomic analytes, and falls apart the moment you leave them. None of these are observables by any reading:
- 168132005 |Microscopy, culture and sensitivities|
- 7246002 |Kidney biopsy|, where the request describes specimen collection and the expectation of some sort of pathology investigation is implied.
- 168821007 |Barium swallow|, 303653007 |CT of head|, 426420006 |Plain X-ray of left ankle|
- 373620007 |Romberg test|, 408589008 |Falls assessment|, 425315000 |Cardiac assessment|
The order and the result also occupy different fields in the exchange standards, for different objects:
- the ORDER code in the request (FHIR ServiceRequest.code, v2 OBR-4)
- the RESULT code in the observation (Observation.code, OBX-3)
A single hierarchy can look acceptable while the mapping stays a simple one to one, where the same concept might plausibly serve both the order and the result:
Order: 104934005 |Sodium measurement, serum (procedure)|
Result: 2951-2 |Sodium [Moles/volume] in Serum or Plasma|
Order: 271062006 |Fasting blood glucose measurement (procedure)|
Result: 14771-0 |Fasting glucose [Moles/volume] in Serum or Plasma|
But orders are not one to one with observations, so “two temporal states of the same thing” (6.2.1) does not hold:
Order: 20109005 |Electrolytes measurement, serum (procedure)| Result:
- 2951-2 |Sodium [Moles/volume] in Serum or Plasma|
- 2823-3 |Potassium [Moles/volume] in Serum or Plasma|
- 2075-0 |Chloride [Moles/volume] in Serum or Plasma|
How would a sodium observable relate to an electrolytes panel in a single hierarchy?
The same sodium observation applies to the panel, or as a single test.
Order: 113076002 |Glucose tolerance test (procedure)| Result:
- 14771-0 |Fasting glucose [Moles/volume] in Serum or Plasma|
- 51597-3 |Glucose [Moles/volume] in Serum or Plasma --1 hour post 75 g glucose PO|
- 14995-5 |Glucose [Moles/volume] in Serum or Plasma --2 hours post 75 g glucose PO|
And how would a fasting glucose observable relate to a glucose tolerance test, or to the other panels that also report it? Again, the fasting observable is agnostic of what test it is a part of.
Some association between order and result helps implementations with request and result reconciliation, but it does not need to live in the terminology, and it is not always a clean one to one mapping. Reflex and add-on testing makes this worse, for example a creatinine run alongside a urine albumin to judge specimen dilution that was not explicitly ordered.
This is also why the Interprets range needs both hierarchies, and why I would not tie it to one. 75183008 |Abnormal liver function| interprets 79036002 |Liver function (observable entity)|, an inherent property. But 168943003 |Abdominal aortography abnormal| interprets an angiography procedure (Method = 360037004 |Imaging - action|), and 168628003 |Plain X-ray of ulna normal| interprets a plain X-ray procedure. There is no aortography observable to interpret; what is interpreted is the act. Merge everything into observables and you can no longer state correctly that an X-ray-normal finding interprets an X-ray.
None of this defends the current state of the evaluation procedure hierarchy. It needs a proper clean-up, including reducing genuine overlap with observables. But that overlap is largely an artefact of the domain being parked for a decade during the LOINC discussions, together with the more recent addition of less specific observable groupers as part of the LOINC ontology work. Content created to fill a gap should not then be cited as evidence that the gap proves duplication. The answer to a neglected hierarchy is to maintain it, not to declare it redundant.
On duplication, there should be no expectation that every observable gain a procedure twin. The two hierarchies fill by different criteria: an evaluation procedure earns its place by being something people actually order, while laboratory observable content is effectively gated on LOINC coverage. They diverge more than they duplicate. New evaluation procedures should be added only where there is a real request for one, and legacy procedures that are never ordered are precisely the clean-up candidates. That is content curation, not an argument for one hierarchy.
It is worth being clear about what the case for a single hierarchy rests on. The recurring arguments, less duplication, less maintenance, closer alignment with LOINC tooling, are about convenience, and those are real operational goods. But convenience is not evidence that an order and an observation are the same kind of thing, and the kinds are what a terminology should get right.
So my position is the two-hierarchy model, retained and cleaned up, applied consistently across all domains rather than split into laboratory and clinical. (Two smaller notes. The laboratory-versus-clinical split in section 3 looks to me like an arbitrary distinction (based on convenience) rather than a real boundary: 430327009 |Colour of urine| can be read at the bedside or in a laboratory. And I would leave panel contents undefined, since they vary by jurisdiction and reimbursement and we cannot agree on them even within Australia. Happy to provide more examples if required.