AidboxForm BuilderSQL on FHIRCCDA -> FHIRValidator
Report 2024-10-21

FHIR Digest

A weekly summary of chat.fhir.org to help you stay up to date on important discussions in the FHIR world.

The chat involved discussions about the progress and issues related to FHIR terminology server testing, particularly around terminology server requirements, validation mechanisms, and the execution of test cases on different servers, including Ontoserver and others. Key participants shared updates on test cases, expressed concerns about discrepancies in expected vs. actual outputs, and suggested improvements for better alignment among terminology services, specifically in handling errors, extensions, and display values in validation responses.
430 comments
ML
JS

@Grahame Grieve when you can share any updates, we are about to have a conversation with HL7 CG WG (Tuesday April 4th) on this topic - from a broader perspective of "FHIR Test Cases" in general. Just wondering if any notes can be shared.

Mario Hyland2023-03-31T21:21:40Z

not at this point

Grahame Grieve2023-03-31T21:22:11Z

only that I am planning to add a set of test cases for $expand and $validate-code to the test cases github repo that explore known issues around expansion and validation

Grahame Grieve2023-03-31T21:23:26Z

@Grahame Grieve , @Michael Lawley : If I may believe this: https://confluence.hl7australia.com/display/COOP/2023-03+Sydney+Connectathon , the Australian connectathon was on March 23rd... Do you already have some news about the Publisher/Terminology server interface?

Bart Decuypere2023-04-13T14:32:26Z

nothing final yet. I will update when there's news

Grahame Grieve2023-04-13T19:56:06Z

ok there's news. There's test cases here: https://github.com/FHIR/fhir-test-cases/tree/master/tx

From the next release of the validator, you can run them like this:

java -jar validator.jar -txTests -source https://github.com/FHIR/fhir-test-cases -output /Users/grahamegrieve/temp/txTests -tx http://tx-dev.fhir.org -version 4.0

Where:

  • -txTests.- run the tests
  • -source - the source of the tests (github URL, or a local folder)
  • -output - the local folder where you want output to go
  • -tx - the address of the server to test
  • -version: the version of FHIR to use (default = 5.0, can be 4.0, 3.0)
  • -filter: string portion of a particular test to run
Grahame Grieve2023-04-16T11:24:49Z

there's a fair bit of work to go here, but this is the shape of where things are going

Grahame Grieve2023-04-16T11:25:33Z

@Grahame Grieve What's the preferred way to provide feedback on these tests - questions, apparent bugs, etc?

Michael Lawley2023-04-17T04:44:29Z

Currently I have issues with the REGEX test, a bunch of the language tests, and the big-echo-no-limit test which seems to require a system to refuse to return an expansion with more than 1000 codes?

Michael Lawley2023-04-17T06:45:48Z

Wrt the language tests, language-echo-en-en, language-echo-de-de seem to suggest that the expansion should set ValueSet.language based on the displayLanguage parameter to $expand. But, that would then imply that the entire result ValueSet is in that language rather than just the ValueSet.expansion.contains.display values (which is all that parameter is really requesting).

Michael Lawley2023-04-17T06:51:13Z

For the translated CodeSystems in the language tests, none of the translations have a use value, so I (Ontoserver) can't know that they should be used as the preferredForLanguage display value.

Michael Lawley2023-04-17T06:56:05Z

Last question: is there a branch available with the -txTests option

Michael Lawley2023-04-17T08:08:01Z

What's the preferred way to provide feedback on these tests - questions, apparent bugs, etc?

discussion here first, I think.

Grahame Grieve2023-04-17T12:52:58Z

Currently I have issues with the REGEX test

what?

the big-echo-no-limit test which seems to require a system to refuse to return an expansion with more than 1000 codes?

well, this is something we'll have to figure out. It's my test that that's how my servers work. It's not necessarily how other systems have to work, so we'll have to figure out how to say that in the tests

Grahame Grieve2023-04-17T12:54:53Z

Wrt the language tests, language-echo-en-en, language-echo-de-de seem to suggest that the expansion should set ValueSet.language based on the displayLanguage parameter to $expand. But, that would then imply that the entire result ValueSet is in that language rather than just the ValueSet.expansion.contains.display values (which is all that parameter is really requesting).

I sure expected some discussion on this. There's two different things that you might want - languages on display, and languages on the response. The way the tests work, if you specify one or more display languages, you get displays defined for those languages

But the language of the response - the ValueSet.language, that's based on the language parameter of the parameters, which the controls how the available displays are represented in the response, based on the value of ValueSet.language

Grahame Grieve2023-04-17T12:57:50Z

with regard to the use parameter, I don't believe that the spec says anywhere that there is a preferredForLanguage code, so how can that be in the tests?

Grahame Grieve2023-04-17T12:58:30Z

is there a branch available with the -txTests option

the master has that now

Grahame Grieve2023-04-17T13:00:04Z

I now have the validator test runner going, but I think it is being really overzealous in the level of alignment its looking for between the expected response and the actual response.
First two issues: .meta and .id -- I don't think either of these should be included in the comparison.
Next one: ValueSet.expansion.id -- that's purely a server-specific value

Michael Lawley2023-04-18T22:46:28Z

.meta and .id... I'm not producing them, right?

Grahame Grieve2023-04-18T22:57:50Z

.expansion.id? or expansion.identifier?

Grahame Grieve2023-04-18T22:59:14Z

Regarding the regex issue, we're limited to Lucene's flavour which does not include character classes like '\S' or '\d'.

Michael Lawley2023-04-18T23:09:57Z

.id is in simple/simple-expand-all-response-valueSet.json for example. I produce .meta but not .id

Michael Lawley2023-04-18T23:10:35Z

ouch. would you like to propose an alternative regex?

Grahame Grieve2023-04-18T23:10:46Z

".{4}[0-9]" would work for me in this example, but it's not quite the same. The more accurate "[^ \t\r\n\f]{4}[0-9]" would also work.

Michael Lawley2023-04-18T23:13:03Z

And yes, I did mean expansion.identifier, but I think this was a false negative -- me misreading the output

Michael Lawley2023-04-18T23:15:16Z

I will commit some changes when I can

  • replace the regex
  • ignore meta
  • require no id
Grahame Grieve2023-04-18T23:28:00Z

btw, what are you putting in meta?

Grahame Grieve2023-04-18T23:28:10Z

Require? no id or just don't care? I think a bunch of things should be don't care

Michael Lawley2023-04-18T23:29:03Z

Meta was including a version (doesn't really make sense) but also a lastUpdated

Michael Lawley2023-04-18T23:29:46Z

I think for id, it shouldn't have an id? I just stopped regurgitating the id, which was basically an oversight

Grahame Grieve2023-04-18T23:30:24Z

It would also potentially propagate tags

Michael Lawley2023-04-18T23:30:29Z

What if it's using a stored expansion?

Michael Lawley2023-04-18T23:31:09Z

in this context?

Grahame Grieve2023-04-18T23:31:49Z

Well, no, but I'm thinking that these tests should really only be looking for things that are known to be wrong

Michael Lawley2023-04-18T23:32:57Z

perhaps. They're also my own internal qa tests. that might be too much, I guess, but I'm hoping not

Grahame Grieve2023-04-18T23:34:13Z

I was thinking that the expected response in the test would set the scope of required elements, and other things would just be ignored

Michael Lawley2023-04-18T23:36:06Z

you assume that I'm sure what the answer is there

Grahame Grieve2023-04-18T23:36:45Z

I'm guessing there's a way to require an element but ignore the value

Michael Lawley2023-04-18T23:37:01Z

I'm not even sure that it can have a known answer

Grahame Grieve2023-04-18T23:37:03Z

there is, yes

Grahame Grieve2023-04-18T23:37:12Z

I've got a bunch of time later today to dig into this in detail, so I can hopefully provide coherent feedback rather than piecemeal reactions

Michael Lawley2023-04-18T23:38:59Z

ok great

Grahame Grieve2023-04-18T23:39:12Z

Back quickly to .expansion.identifier, this is what I'm seeing:

Group simple-cases
  Test simple-expand-all: Fail
    string property values differ at .expansion.identifier
Expected :$uuid$
Actual  :4aa6f81f-ab79-41b2-96e2-6faa0aadc38c
Michael Lawley2023-04-19T00:06:10Z

well, that's not a valid value

Grahame Grieve2023-04-19T00:26:03Z

oh! it needs the urn:uuid: prefix?

Michael Lawley2023-04-19T00:27:53Z

yes

Grahame Grieve2023-04-19T00:27:58Z

But the type is uri? which can be absolute or relative

Michael Lawley2023-04-19T00:30:26Z

well... a URI can be, but in this case:

uniquely identifies this expansion of the valueset

I think it should be absolute

Grahame Grieve2023-04-19T00:34:13Z

There's several places in the spec where we missd this when we allowed relative URIs

Grahame Grieve2023-04-19T00:34:31Z

uniquely in what scope though? wrt that specific tx server endpoint, or globally, or in some deployment environment?
I don't think you can legitimately enforce it to be a UUID (it might be something like [base]/expansion/[UUID], which would be "unique" and absolute)

Michael Lawley2023-04-19T00:38:15Z

This one is perhaps tricky:
Several tests expect an expansion parameter for excludeNested but Ontoserver always behaves as if this was true, and so omits it because its value does not affect Ontoserver's behaviour.

Michael Lawley2023-04-19T02:13:20Z

That’s less than ideal from my pov. and probably excludes ontoserver from serving for hl7 igs. Maybe. I’ll think about the testing ramifications. Is that fact visible in the terminology capabilities statement?

Grahame Grieve2023-04-19T03:55:16Z

You have it as a uuid anyway, so prefixing isn’t going to be a problem? And the intent is global since expansions are sometimes cached and reused. Sometimes at scale

Grahame Grieve2023-04-19T03:56:13Z

Globally unique is fine, but then I'd be tempted to adopt a URI based on the template [base]/expansion/[UUID] e.g., https://tx.ontoserver.csiro.au/expansion/4aa6f81f-ab79-41b2-96e2-6faa0aadc38c.
But in principle, if the spec says URI, unique identifier, then I don't think it's good form to impose additional constraints.

Michael Lawley2023-04-19T04:31:55Z

Ontoserver does return TerminologyCapabilities.expansion.hierarchical = false

Michael Lawley2023-04-19T04:33:31Z

But the meaning of excludeNested is only about the result representation (true => MUST return a flat expansion), it does not affect the logical content of the expansion.
Is there a reason you think that parameter should be included?

Michael Lawley2023-04-19T04:37:57Z

Conversely, Ontoserver redundantly includes offset and count values in the expansion parameters even if they haven't had any impact on paging.

Michael Lawley2023-04-19T04:40:45Z

I fully expect we'll need to do some adjustments in this space

Michael Lawley2023-04-19T04:41:19Z

Is there a reason you think that parameter should be included?

IG Authors have raised issues before when the expansion in the IG loses the heirarchy

Grahame Grieve2023-04-19T14:13:29Z

@Michael Lawley I've been thinking about this one:

omits it because its value does not affect Ontoserver's behaviour.

That's wrong - the parameters are to inform a consumer how the value set was expanded. Whether or not Ontoserver can or can't is not the point, it's how it acted when doing the expansion

Grahame Grieve2023-04-19T14:25:41Z

Ontoserver redundantly includes offset and count values in the expansion parameters even if they haven't had any impact on paging

offset = 0, presumably, but what's count in that case?

Grahame Grieve2023-04-19T14:30:25Z

But the presence/absence/value of excludeNested doesn't affect "expansion" (i.e., which codes are present), it only potentially affects how those codes are returned in the ValueSet.expansion.contains.

Michael Lawley2023-04-20T02:21:23Z

Grahame Grieve said:

Ontoserver redundantly includes offset and count values in the expansion parameters even if they haven't had any impact on paging

offset = 0, presumably, but what's count in that case?

MAXINT

Jim Steel2023-04-20T02:24:18Z

it still affects the expansion even if it doesn't affect which codes are present

Grahame Grieve2023-04-20T02:37:25Z

If a consumer is looking through a set of expansions, instead of just generating a new one, then it's going to be input into their choice

Grahame Grieve2023-04-20T02:38:10Z

I had been approaching it from the perspective of judging whether or not a persisted expansion is re-usable for a different expansion request.
(Which is something that Ontoserver does when it has a ValueSet with a stored expansion.)

Michael Lawley2023-04-20T03:24:30Z

indeed, but you're only thinking of it in your context, it could/would also be done in expansion users that can't make the assumption you're making

Grahame Grieve2023-04-20T03:27:29Z

I'm trying to think about this from the perspective of a client / consumer of ValueSet.expansion -- under what circumstances do they need to know excludeNested = true? What is it actually telling them?

Michael Lawley2023-04-20T03:53:45Z

One answer might be "this value was provided for this expansion parameter in the original request"?

Michael Lawley2023-04-20T03:54:13Z

that this is expansion will not contain nested contains even if that might be relevent for this value set

Grahame Grieve2023-04-20T03:55:45Z

Also, what should Ontoserver do if the request was $expand?excludeNested=false? Should it state that in the parameters even though the actual expansion may have (if it was present) flattened any nesting? Or, should it change it to true because flattening might have happened.

Michael Lawley2023-04-20T03:57:01Z

Perhaps the message is just "as a client, you do not have to look for nested codes when processing this expansion"?

Michael Lawley2023-04-20T03:58:22Z

well I think that the server should return an exception if the client asked it to do something it can't do

Grahame Grieve2023-04-20T04:11:22Z

But that's not what excludeNested=false means. It's not the same as saying "include nested"

Michael Lawley2023-04-20T04:13:20Z

no that's true

Grahame Grieve2023-04-20T04:14:01Z

and you don't know whether flattening is a thing that happened or not, I presume

Grahame Grieve2023-04-20T04:14:55Z

correct

Michael Lawley2023-04-20T04:15:07Z

Now looking at all the validation test cases, the system parameter has the wrong type (valueString not valueUri) and, in the responses, code also has the wrong type (valueString instead of valueCode)

Michael Lawley2023-04-24T07:19:40Z

and similarly for system in the responses

Michael Lawley2023-04-24T07:23:11Z

wow that's a bad on my part. Fixed

Grahame Grieve2023-04-24T09:38:08Z

nearly - still problems with the system parameter

diff --git a/tx/validation/simple-code-bad-code-request-parameters.json b/tx/validation/simple-code-bad-code-request-parameters.json
index 077c424..59d292a 100644
--- a/tx/validation/simple-code-bad-code-request-parameters.json
+++ b/tx/validation/simple-code-bad-code-request-parameters.json
@@ -8,6 +8,6 @@
     "valueCode" : "code1x"
   },{
     "name" : "system",
-    "valueString" : "http://hl7.org/fhir/test/CodeSystem/simple"
+    "valueUri" : "http://hl7.org/fhir/test/CodeSystem/simple"
   }]
 }
Michael Lawley2023-04-27T05:09:42Z

In validation/simple-code-implied-good-request-parameters.json, there is a non-standard parameter implySystem:

{
  "resourceType" : "Parameters",
  "parameter" : [{
    "name" : "url",
    "valueUri" : "http://hl7.org/fhir/test/ValueSet/simple-all"
  },{
    "name" : "code",
    "valueCode" : "code1"
  },{
    "name" : "implySystem",
    "valueBoolean" : true
  }]
}
Michael Lawley2023-04-27T22:14:53Z

indeed there is, and there should be, right?

Grahame Grieve2023-04-27T22:15:30Z

it indicates that it is intentional that there's no system and the server should infer what the system is

Grahame Grieve2023-04-27T22:18:19Z

But that is an invented non-standard parameter?
The use-case here seems to be that the system isn't knowable by the calling client, but in the context of validation, why wouldn't the system be known; there should be bindings available?

Michael Lawley2023-04-27T22:46:59Z

it's a code type, so there's only a code, and the server is asked to imply the system from the code and the value set

Grahame Grieve2023-04-27T22:48:27Z

agree I haven't proposed that parameter, but it's still needed

Grahame Grieve2023-04-27T22:49:13Z

Yes, its a code type, but that must exist in some context, right? The context should provide the system?

Michael Lawley2023-04-27T22:57:28Z

the value set itself is the context

Grahame Grieve2023-04-27T23:05:17Z

What are the boundaries here? Can the ValueSet contain codes from > 1 code system? Can the code be non-unique in the valueset expansion?

Michael Lawley2023-04-27T23:24:24Z

The value set can contain codes from more than one code system, yes. A. number of them do. The code must be unique in the value set else it's an error

Grahame Grieve2023-04-27T23:25:23Z

Presumably the system parameter does also need to be provided (from the documentation of $validate-code.code: "the code that is to be validated. If a code is provided, a system or a context must be provided"). Does the client just pass a dummy system that is ignored?

Jim Steel2023-04-27T23:29:09Z

no the system is not provided in this case

Grahame Grieve2023-04-27T23:29:27Z

since there isn't one

Grahame Grieve2023-04-27T23:29:31Z

and yes, that violates the documentation on that parameter

Grahame Grieve2023-04-27T23:29:47Z

And is it only ever used when supplying the code parameter?

Michael Lawley2023-04-27T23:58:32Z

yes. it must be accompanied by a code and a value set

Grahame Grieve2023-04-27T23:59:15Z

I fixed the remaining system parameters

Grahame Grieve2023-04-28T01:19:44Z

for examples like validation/simple-code-bad-display-response-parameters.json why is the result true when the display is invalid? The specification for the result output parameter is:

True if the concept details supplied are valid

Michael Lawley2023-04-30T03:27:57Z

Another test case issue: mis-named input parameter. See, for example, validation/simple-code-bad-version1-request-parameters.json which includes a parameter version that should instead be systemVersion.

Michael Lawley2023-04-30T04:53:59Z

why is the result true when the display is invalid?

Because that's just a warning - the code has been judged to be in the value set

Grahame Grieve2023-04-30T09:36:21Z

a parameter version that should instead be systemVersion

ouch

Grahame Grieve2023-04-30T09:37:09Z

why is the result true when the display is invalid?

Because that's just a warning - the code has been judged to be in the value set

But if a display is provided it should be validated and if its not any of the displays listed by the CodeSystem, then it is invalid -- the definition of result is not "True if the code is a member of the ValueSet/CodeSystem", but rather "if the concept details supplied are valid"; display is one of these details.

I am very uncomfortable about relaxing display validation affecting the outcome due to the prevalence of EHRs that allow for the display to be edited arbitrarily.

Michael Lawley2023-04-30T23:35:03Z

well, I'm very sure that if I changed to an error instead of a warning, the IG authoring community would completely rebel, but I guess TI might want to have an opinion. So what do other people think?

Grahame Grieve2023-04-30T23:38:53Z

There are lots of reasons for display not being valid. (E.g. If someone has a code system supplement the validator doesn't know about.)

Lloyd McKenzie2023-05-01T01:52:42Z

Why is the IG authoring community using non-valid displays?

Michael Lawley2023-05-01T04:40:02Z

there's 4 reasons that I've seen:

  • it's close but not completely correct (it's been 'improved' a little)
  • They're using the value set display, or an implied code system supplement
  • they got the name from somewhere else and it's wrong there (VSAC). Often this is due to drift
  • they think that the existing display is wrong and they wanted it to be right
Grahame Grieve2023-05-01T06:16:12Z
  1. Use the ValueSet or a supplement to "improve".
  2. ValueSet display should succeed, as should explicit supplement; implicit/implied supplements should also work.
  3. Then validation will tell them what an acceptable display is.
  4. Use the ValueSet or a supplement to "fix".

Note, I am more concerned about the clinical community than the IG community.

Michael Lawley2023-05-01T06:43:38Z

If this is an impasse, perhaps the mode flag should be used to relax things?
Either way, I think we need an explicitly agreed mechanism to use the "issues" to flag the invalid display text.

Michael Lawley2023-05-01T06:44:31Z

Also, I think the test extensions-echo-all is wrong at least in assuming supplements will be automagically included

Michael Lawley2023-05-01T06:56:04Z

ValueSet display should succeed

TI decided otherwise; that's no longer allowed

Grahame Grieve2023-05-01T07:21:19Z

I expect that TI will choose to decide this in NOLA. You going to be there?

Grahame Grieve2023-05-01T07:22:06Z

Either way, I think we need an explicitly agreed mechanism to use the "issues" to flag the invalid display text.

the tests are doing that now

Grahame Grieve2023-05-01T07:22:36Z

This has been discussed, at some length, with regard to SNOMED CT descriptions, and I recall that @Dion McMurtrie produced a table with various permutations in the early days of SNOMED on FHIR.

Unless the edition and version of SCT is provided, it's not possible to determine the validity of an unrecognized description. Otherwise, the best a server can do is return the preferred term from its default edition & version and a warning.

Peter Jordan2023-05-01T07:44:45Z

well, this discussion is not just about SCT that's for sure

Grahame Grieve2023-05-01T07:50:29Z

Also, I think the test extensions-echo-all is wrong at least in assuming supplements will be automagically included

why?

Grahame Grieve2023-05-01T08:07:05Z

That's precisely the intent of this test - make sure that supplements such as this are automagically included

Grahame Grieve2023-05-01T08:07:52Z

language supplements

Grahame Grieve2023-05-01T08:08:01Z

Grahame Grieve said:

well, this discussion is not just about SCT that's for sure

Sure - but things are a lot more straightforward for single edition, single language Code Systems.

Peter Jordan2023-05-01T08:16:20Z

that's not much of hill to climb given how complex SCT is

Grahame Grieve2023-05-01T08:18:19Z

It's far more complex with things like LOINC where the same complexity (different national editions and local extensions) exists, but where everyone does it differently and often poorly.

Michael Lawley2023-05-01T08:27:34Z

Re extensions-echo-all, the supplement contains extensions (some I think are technically not valid where they're being used), and then expecting corresponding property values in the output (eg weight)

Michael Lawley2023-05-01T08:30:05Z

which ones are not valid?

Grahame Grieve2023-05-01T09:35:27Z

ItemWeight - only goes on Coding and in a Questionnaire

Michael Lawley2023-05-01T09:52:50Z

I think I created a task about that one

Grahame Grieve2023-05-01T10:08:56Z

I used a property where I could, and an extension where I had to

Grahame Grieve2023-05-01T10:09:17Z

We can force the overhead of a CodeSystem supplement, but we can't count on the supplement being available when performing production-time validation. And that means that non-matching display names shouldn't be treated as an error.

Lloyd McKenzie2023-05-01T14:49:05Z

If you're doing prod time validation without all the base info, then you're only going to get half answers - do you tolerate missing profiles? But, if your use case is tolerant of bad displays, just omit them from the validate-code calls, or let's have an explicit parameter that the client passes telling the server to only treat as warnings

Michael Lawley2023-05-01T22:04:33Z

@Michael Lawley to increase your happiness, I'm just adding tests for supporting these 3 parameters from $expand for $validate-code: system-version, check-system-version, force-system-version, and as I'm doing that, I'm checking that they apply to Coding.version as well

Grahame Grieve2023-05-02T00:08:16Z

One of the other challenges with the txTests is that Ontoserver returns additional expansion.parameters and this causes the test to report a false failure

Michael Lawley2023-05-02T00:51:16Z

Most implementations don't care about the display values - and will be sloppy with them. So the default behavior should be warnings - errors should require the explicit parameter.

Lloyd McKenzie2023-05-02T00:59:51Z

One of the other challenges with the txTests is that Ontoserver returns additional expansion.parameters and this causes the test to report a false failure

I'm assuming that this is something we'll sort out, so I'm not worrying about that today

Grahame Grieve2023-05-02T01:06:35Z

but it's a test problem, not an implementation problem

Grahame Grieve2023-05-02T01:06:52Z

Given that displays are what clinicians see and interpret, being sloppy is bad -- we've seen real clinical risks here.
And just because (a group of) ppl are sloppy doesn't mean we should enable that by default.

Michael Lawley2023-05-02T01:07:27Z

but it's a test problem, not an implementation problem

It's a test problem yes, but it's making it very hard for me to work through the cases because it bails out early and hides potential actual problems in the rest of the response.

Michael Lawley2023-05-02T01:08:44Z

fair.

Grahame Grieve2023-05-02T01:09:08Z

Do you have a list of the extra parameters? In general, some extra parameters would be fine but others might not be, and I don't want to simply let anything go by

Grahame Grieve2023-05-02T01:09:56Z

The reality is that the displays in many code systems are not appropriate for clinician display. By 'sloppy' I mean that systems make the displays what they need to be for appropriate user interface, not worrying too much about diverging from the 'official' display names if the 'official' names aren't useful for the purpose. I'm not saying that the display names chosen are typically inappropriate/wrong.

Lloyd McKenzie2023-05-02T01:18:12Z

Do you have a list of the extra parameters?
version is the main one, and it seems strange that it's not expected in the result

Also, I'm getting a missing error for includeDesignations. Again, this seems like our interpretations of "parameters that affected expansion" are mis-aligned. I interpret this as being the calculation of the matching codes, not the specific representation that gets returned (noting that displayLanguage is counted since it affects the computed display value)

Michael Lawley2023-05-02T01:43:19Z

Coding.display A representation of the meaning of the code in the system, following the rules of the system.

"following the rules of the system", not "following the rules of some system implementer".

Also, if a display is not appropriate, then get it fixed -- either at source (in HL7 / THO) or with the external party. If the external party won't play ball, then fix it in a shared supplement so everyone can benefit rather than lots of (potentially incompatible) fixes spread over many different IGs.

Michael Lawley2023-05-02T02:48:49Z

it sounds so easy when you say it like that

Grahame Grieve2023-05-02T02:50:11Z

Sure. Except that's not what systems do today. They just load the codes into their databases and make the display names say what they want them to say. And they're not going to change that just because we might like them to.

Lloyd McKenzie2023-05-02T02:50:42Z

If that's all they did I'd be less concerned. What they REALLY DO is allow people to change the display text on-the-fly to absolutely anything (and people do this), and the results sometimes bear zero resemblance to the code's meaning. This is why I say we're concerned about the clinical use case over the IG use case, and why I want the caller to explicitly request that an invalid display not return an error; then the onus is on the caller.

Michael Lawley2023-05-02T02:56:53Z

version is the main one, and it seems strange that it's not expected in the result

where is it missing? I just spent a while hunting for it, and yes, it was missing from the validate-code results, but I can't see where it's missing from the $expand results

Grahame Grieve2023-05-02T02:59:04Z

Let's start with simple/simple-expand-all-response-valueSet.json -- it only has:

    "parameter" : [{
      "name" : "excludeNested",
      "valueBoolean" : true
    }],
Michael Lawley2023-05-02T03:01:04Z

.. and ..?

Grahame Grieve2023-05-02T03:03:50Z

Where is the version of the CodeSystem that was used in the expansion?

Michael Lawley2023-05-02T03:05:20Z

that code system doesn't have a version, so there's no parameter saying what it is

Grahame Grieve2023-05-02T03:06:14Z

These days I guess that should be called system-version? But it's a canonical, so I would expect http://hl7.org/fhir/test/CodeSystem/simple| as the value

Michael Lawley2023-05-02T03:07:49Z

really? I would not expect that

Grahame Grieve2023-05-02T03:08:17Z

That says "I use a version-less instance of this code system", rather than just not saying anything.

Michael Lawley2023-05-02T03:09:04Z

so firslty, it's not system-version - that's something else, an instruction about the default version to use. version is the actual version used. Though I just spent 15min verifying that for myself, and it could actually be documented

Grahame Grieve2023-05-02T03:09:05Z

At least it's "not wrong"
+1 for documenting these :)

Michael Lawley2023-05-02T03:09:35Z

That says "I use a version-less instance of this code system", rather than just not saying anything

I

Grahame Grieve2023-05-02T03:09:45Z

I'm not sure that it does. I just read the section on canonicals again, and at least we can say that this is not clear

Grahame Grieve2023-05-02T03:10:06Z
Grahame Grieve2023-05-02T03:14:00Z

I don't see another way to say it -- the trailing | might be optional, but is, I think, in the spirit of things?

Michael Lawley2023-05-02T03:16:11Z

I think that the IG publisher would blow up on this:

"parameter" : [{
      "name" : "version",
      "valueCanonical" : "http://hl7.org/fhir/test/CodeSystem/simple|"
    }]
Grahame Grieve2023-05-02T03:16:13Z

If you want a versionless canonical, you omit the '|'. I would expect (and have only ever seen) the '|' there if there's a trailing version.

Lloyd McKenzie2023-05-02T03:18:23Z

no wouldn't blow up, just wouldn't make sense in the page, because the code makes the same assumption as Lloyd

Grahame Grieve2023-05-02T03:19:47Z

Hmm, that looks like it might be HAPI behaviour -- I'm guessing if you set the version to "" rather than null.
Investigating...

Michael Lawley2023-05-02T03:20:38Z

Yep, that is the issue.

Michael Lawley2023-05-02T03:23:33Z

Would IG publisher cope sensibly without the trailing |

    "parameter" : [{
      "name" : "version",
      "valueCanonical" : "http://hl7.org/fhir/test/CodeSystem/simple"
    }]
Michael Lawley2023-05-02T03:25:23Z

it'll ignore that one. As it will ignore http://hl7.org/fhir/test/CodeSystem/simple| from the next release

Grahame Grieve2023-05-02T03:25:56Z

if there's no version, there's nothing to say

Grahame Grieve2023-05-02T03:26:07Z

And I'll work around HAPI to leave off the |

Michael Lawley2023-05-02T03:29:25Z

but you won't leave the parameter out?

Grahame Grieve2023-05-02T03:32:36Z

what about in the response to $validate-code when there's no version on the code system?

Grahame Grieve2023-05-02T03:34:29Z

that's why you should leave it out

Grahame Grieve2023-05-02T03:34:45Z

I'll have to look & think deeper - if the ValueSet has two code systems but one has no version, then it could be misleading / confusing to have only one "version" reported? I think leaving it out means clients may have to work harder.

Michael Lawley2023-05-02T03:42:02Z

why would clients have to work harder?

Grahame Grieve2023-05-02T03:43:08Z

Just looking now at extensions/expand-echo-bad-supplement-parameters.json -- we've used PROCESSING as the code rather than BUSINESS-RULE ; seems a somewhat arbitrary distinction

Michael Lawley2023-05-02T03:44:46Z

It is but I don't mind changing

Grahame Grieve2023-05-02T03:46:48Z

clients (that care) have to know that a missing version means a code-system didn't have a version. And, they have to scan the expansion to find all the code systems in scope (and this may not be a complete set if paging).
Additionally, what if the valueset references two "versions" of the same code system, and one is empty...hmm, not sure if that is possible with Ontoserver.

Michael Lawley2023-05-02T03:50:38Z

Re PROCESSING vs BUSINESS-RULE, ideally the test would allow either

Michael Lawley2023-05-02T03:51:30Z

what if the valueset references two "versions" of the same code system, and one is empty

You should go bang on that case

Grahame Grieve2023-05-02T03:52:51Z

clients (that care) have to know that a missing version means a code-system didn't have a version

But they have to scan to decide that either way

Grahame Grieve2023-05-02T03:53:18Z

Not if all the code systems are listed directly in expansion.parameters."version".
Another edge case - a code system is referenced in the compose, but no codes actually match - you'd never know it was in scope

Michael Lawley2023-05-02T04:13:53Z

Regarding setting the ValueSet.language to the value of $expand's displayLanguage parameter, will this not be misleading if only some of the codes have translations in the requested language?

Michael Lawley2023-05-02T04:15:32Z

sticking to version for now... you're really using it as more than a version - you're using it as a dependency list

Grahame Grieve2023-05-02T04:25:13Z

I'm thinking that clients might be doing that, yes

Michael Lawley2023-05-02T04:35:24Z

well, if we're going to use it to report things that don't contain versions, then we should change it's name. Or would you not consider that?

Grahame Grieve2023-05-02T04:42:14Z

Regarding setting the ValueSet.language to the value of $expand's displayLanguage parameter, will this not be misleading if only some of the codes have translations in the requested language?

possibly, it that's what was going on, but it's not

Grahame Grieve2023-05-02T05:54:31Z

well, the tests now have version as optional

Grahame Grieve2023-05-02T05:57:15Z

though I think we should consider renaming it

Grahame Grieve2023-05-02T05:57:22Z

did you want to talk about other parameters before we talk about language?

Grahame Grieve2023-05-02T05:57:42Z

and going back, I sure don't understand this:

Also, I'm getting a missing error for includeDesignations. Again, this seems like our interpretations of "parameters that affected expansion" are mis-aligned. I interpret this as being the calculation of the matching codes, not the specific representation that gets returned (noting that displayLanguage is counted since it affects the computed display value)

Grahame Grieve2023-05-02T06:10:59Z

what's it got to do with the calculation of matching codes?

Grahame Grieve2023-05-02T06:11:22Z

https://github.com/hapifhir/org.hl7.fhir.core/pull/1246 - work to date if you won't want to wait for some weird testing thing to be resolved

Grahame Grieve2023-05-02T07:03:24Z

Ignore the includeDesignations thing - I'm just including it if a value was supplied.

Michael Lawley2023-05-02T07:46:27Z

(deleted)

Michael Lawley2023-05-02T07:48:17Z

Back on display validation, the example in the spec suggests that the appropriate response is to fail:
http://www.hl7.org/fhir/valueset-operation-validate-code.html#examples

Is there appetite for adding another mode, e.g. ALLOW_INVALID_DISPLAY ?

Michael Lawley2023-05-02T20:33:43Z

the example certainly does suggest failure is appropriate

Grahame Grieve2023-05-02T20:39:30Z

As a status update, I think we're very close to passing except for the errors relating to unexpected "version" values which manifest like:

Group simple-cases
  Test simple-expand-all: Fail
    array properties count differs at .expansion.parameter
Expected :1
Actual  :2

and also some spurious validation of the actual error message strings:

  Test validation-simple-codeableconcept-bad-system: Fail
    string property values differ at .parameter[0].resource.issue[0].details.text

and

  Test validation-simple-codeableconcept-bad-version1: Fail
    string property values differ at .parameter[0].resource.issue[0].details.text
Michael Lawley2023-05-02T21:18:53Z

I figured the question of the actual error messages would come up at some point

Grahame Grieve2023-05-02T21:26:17Z

but good to hear, thanks

Grahame Grieve2023-05-02T21:26:26Z

Is there appetite for adding another mode, e.g. ALLOW_INVALID_DISPLAY ?

I don't think I'd like to add another mode for this. Or at least, not this alone. I'm considering the ramifications of just saying that's an error, and then picking through the issues in the IG publisher and downgrading it to a warning if the issues are only about displays.

Either way, I'll be putting this question to the two communities (TI and IG editors) in New Orleans

Grahame Grieve2023-05-02T21:34:53Z

I think we're very close to passing

Well, too soon :-)
Seems the test harness complains about Ontoserver including extensions.
It also doesn't account for the expansion.contains being flat when excludeNested is not true.

But I believe these are txTests issues, not Ontoserver issues

Michael Lawley2023-05-02T22:34:04Z

A new spec issue -- expansion.parameter.value[x] doesn't support canonical only uri.
image.png

Which means the test responses that have an expansion.parameter like:

    {
      "name" : "version",
      "valueCanonical" : "http://hl7.org/fhir/test/CodeSystem/simple|0.1.0"
    }],

are invalid.

Michael Lawley2023-05-03T00:11:33Z

yeah I discovered that last night. I'm midway through revising them for other reasons and then I'll make another commit

Grahame Grieve2023-05-03T00:13:40Z

@Michael Lawley I committed fixed up tests.

Grahame Grieve2023-05-03T02:00:10Z

with regard to error messages, can you share a copy of the different error messages with me? I'm going to set the tests up so that the messages have to contain particular words. (I think)

Grahame Grieve2023-05-03T02:00:54Z

I'm going to set the tests up so that the messages have to contain particular words. (I think)

Um, ok.

The specified code 'code1x' is not known to belong to the specified code system 'http://hl7.org/fhir/test/CodeSystem/simple'
A version for a code system with URL http://hl7.org/fhir/test/CodeSystem/simple was not supplied and the system could not find its latest version.
A version for a code system with URL http://hl7.org/fhir/test/CodeSystem/simplex was not supplied and the system could not find its latest version.
None of the codes in the codeable concept were valid.
The provided code "#code1x" was not found in value set http://hl7.org/fhir/test/ValueSet/simple-all
The provided code "http://hl7.org/fhir/test/CodeSystem/en-multi#code1" exists in the ValueSet, but the display "Anzeige 1" is incorrect
The provided code "http://hl7.org/fhir/test/CodeSystem/simple#code2a" was not found in value set http://hl7.org/fhir/test/ValueSet/simple-filter-regex
Michael Lawley2023-05-03T03:23:04Z

Another test case error:

  • validation-simple-code-good-display

The ValueSet specifies a version for the code system 1.0.0 but the display value supplied in the request "good-display" is that from version 1.2.0 AND the response says that version 1.2.0 was used in the validation.

Michael Lawley2023-05-03T03:26:21Z

I think that's fixed up now?

Grahame Grieve2023-05-03T03:30:59Z
Michael Lawley2023-05-03T03:34:28Z

but what's the request?

Grahame Grieve2023-05-03T03:44:36Z

duh. I forgot to push :sad:

Grahame Grieve2023-05-03T03:45:53Z

and now the request has valueString not valueUri for the system :man_facepalming:

Michael Lawley2023-05-03T03:48:25Z

ah, that's an ongoing issue -- I just have local changes to work around :-)

Michael Lawley2023-05-03T03:51:38Z

I'll fix

Grahame Grieve2023-05-03T03:52:03Z

ok pushed

Grahame Grieve2023-05-03T04:07:49Z

Thanks! At least with my test harness the main outstanding issues is the display validation issue.

Michael Lawley2023-05-03T05:19:51Z

Now looking at extensions-echo-enumerated:

  1. Why are the top-level ValueSet.extension in the output expansion ValueSet?
  2. (Not just for this expansion, but all) - ValueSet.compose, ValueSet.date, and ValueSet.publishershould all be optional.
Michael Lawley2023-05-03T06:20:52Z

the display validation issue?

Grahame Grieve2023-05-03T06:23:37Z

whether an invalid display causes result to be false

Michael Lawley2023-05-03T06:25:00Z

oh right. yes

Grahame Grieve2023-05-03T06:26:12Z

Why are the top-level ValueSet.extension in the output expansion ValueSet?

Because they might matter, so the server should echo them

Grahame Grieve2023-05-03T06:28:08Z

Not just for this expansion, but all) - ValueSet.compose, ValueSet.date, and ValueSet.publishershould all be optional.

I guess. I don't think it matters to me? I'll check if I care

Grahame Grieve2023-05-03T06:28:38Z

Why are the top-level ValueSet.extension in the output expansion ValueSet?
Because they might matter, so the server should echo them

That suggests a stronger link between specification and the expansion than I expect. This appears to be the key statement from 4.9.8 Value Set Expansion

A resource that represents a value set expansion includes the same identification details as the definition of the value set

What is the scope of "identification details"?

Michael Lawley2023-05-03T06:37:18Z

regarding ValueSet.compose: I have a parameter includeCompose for whether it should be returned or not, but I don't ever use it, and I wouldn't currently miss the compose

Grahame Grieve2023-05-03T06:41:32Z

Is that not what includeDefinition is for?

Michael Lawley2023-05-03T06:51:43Z

Also, looking at the OperationOutcomes, why use .details.text rather than .diagnostics (given that there's no .details.coding values)

Michael Lawley2023-05-03T06:53:23Z

dear me it is

Grahame Grieve2023-05-03T06:53:33Z

diagnostics is for things like stack dumps etc. The details of the issue go in details.text

Grahame Grieve2023-05-03T06:55:19Z

That suggests a stronger link between specification and the expansion than I expect. This appears to be the key statement from 4.9.8 Value Set Expansion

I didn't understand that

Grahame Grieve2023-05-03T06:56:47Z

What is the scope of "identification details"?
url + version + identifiers, I think

Grahame Grieve2023-05-03T06:57:04Z

OperationOutcome.issue.diagnostics
Comment: This may be a description of how a value is erroneous [...]

Michael Lawley2023-05-03T06:57:37Z

But happy to update - it's all new

Michael Lawley2023-05-03T06:58:02Z

Stronger link...

Why would an extension on a ValueSet definition be relevant to its expansion (as a general rule)?

Michael Lawley2023-05-03T07:00:26Z

it shouldn't be but it might be relevant to the usage of the expansion

Grahame Grieve2023-05-03T07:01:08Z

hence why I echo it

Grahame Grieve2023-05-03T07:01:15Z

Hmm, ok

Michael Lawley2023-05-03T07:09:14Z

Should that be a requirement here?

Michael Lawley2023-05-03T07:09:33Z

no, in fact, they are only included if includeDefinition is true.

Grahame Grieve2023-05-03T07:11:57Z

pushed new tests. code for running the tests is in the gg-202305-more-tx-work2 branch of core

Grahame Grieve2023-05-03T07:17:12Z

my local copy of tx-fhir-org still fails one of the tests... might have more work to do on the tester

Grahame Grieve2023-05-03T07:17:45Z

open issues - text details, + the display validation question which is going to committee in New Orleans

Grahame Grieve2023-05-03T07:18:17Z

So, turns out that it is HAPI's code that's populating the OperationOutcome and putting the text into diagnostics and not details.text

Michael Lawley2023-05-03T07:19:07Z

This is only in the case of things like code system (supplement) or value set not found/resolvable since that's a 404 response

Michael Lawley2023-05-03T07:19:52Z

this one definitely matters.

Grahame Grieve2023-05-03T07:26:49Z

Yep, I'll have to take over from the default interceptor behaviour

Michael Lawley2023-05-03T07:29:52Z

Thanks @Grahame Grieve I have the new tests and the gg-202305-more-tx-work2 branch running locally.
A bunch of tests are failing because the expected expansion is hierarchical, but Ontoserver returns a flat expansion so there are errors like:

Group parameters
  Test parameters-expand-all-hierarchy: Fail
    array properties count differs at .expansion.contains
Expected :3
Actual  :7
Michael Lawley2023-05-03T08:20:00Z

so why is Ontoserver returning a flat expansion? does it need a parameter?

Grahame Grieve2023-05-04T00:54:55Z

Because it's allowed to, and unless you're returning "all codes", it's a hard problem to cut nodes out of a tree/graph

Michael Lawley2023-05-04T01:03:11Z

Let alone order them

Jim Steel2023-05-04T01:04:59Z

but that one is all codes

Grahame Grieve2023-05-04T02:05:53Z

All codes is very low on our priority list (infrequent use case) so we haven't done special-case work to preserve hierarchy.
It's also something that we've rarely been asked about.

Michael Lawley2023-05-04T02:09:33Z

it's certainly come up from the IG developers

Grahame Grieve2023-05-04T04:35:45Z

and I'm surprised... structured expansions are a real thing for UI work

Grahame Grieve2023-05-04T04:36:06Z

What we have heard is that some people want to have an explicit hierarchy on expansion that doesn't match the code system's hierarchy (eg where things are grouped differently from the normal isa hierarchy). In these cases the simplest approach we've found is to have them express the desired hierarchy in the stored expansion.

Michael Lawley2023-05-04T20:58:34Z

that might be, but as you see, there's reasons people want a heirarchy

Grahame Grieve2023-05-04T21:33:49Z

But for IG developers, why do they care about the (on the wire) expansion; if the IG tooling needs to render the hierarchy, then it's in the CodeSystem already, or can be recovered from the ValueSet with $expand?property=parent.

Michael Lawley2023-05-04T22:18:53Z

it IG tooling defers to the tx service on this matter. It doesn't try to impose heirachy on what the tx server chooses to return

Grahame Grieve2023-05-04T23:00:02Z

@Michael Lawley we're going to do triage here on our open issues tomorrow. What I have in my mind:

  • validating display - warning or error if display is wrong
  • whether supplements are automatically in scope or not
  • How a server reports that it doesn't do heirarchical expansions
  • should we rename the 'version' parameter in .expansion.parameters
Grahame Grieve2023-05-06T17:21:04Z

have I missed anything?

Grahame Grieve2023-05-06T17:21:18Z

Wrt "How a server reports that it doesn't do heirarchical expansions", a server may do this in some circumstances but not others. For example, Ontoserver (currently) does not do them when calculating the expansion itself, but may return them if its (re-)using a stored expansion.

Other examples like this would be where, for example, a ValueSet includes the implicit all-codes ValueSet and the result is flat, but if it instead includes the CodeSystem directly then it is hierarchical

Michael Lawley2023-05-07T02:01:26Z

it IG tooling defers to the tx service on this matter. It doesn't try to impose heirachy on what the tx server chooses to return

Then it's effectively choosing to be happy with what the tx server returns, and in that case anything that is in-spec with the general FHIR tx services spec should be acceptable.

Michael Lawley2023-05-07T02:04:26Z

Then it's effectively choosing to be happy with what the tx server returns, and in that case anything that is in-spec with the general FHIR tx services spec should be acceptable.

It is acceptable from the infrastructure's pov, but not acceptable from the consumer's pov

Grahame Grieve2023-05-07T02:58:13Z

it might be acceptable to some consumers, the ones who choose to use Ontoserver, but I think that would mean many editors would not be ok with HL7 using Ontoservrer

Grahame Grieve2023-05-07T02:59:21Z

Other examples like this would be where, for example, a ValueSet includes the implicit all-codes ValueSet and the result is flat, but if it instead includes the CodeSystem directly then it is hierarchical

but that's how the test case we're talking about works

Grahame Grieve2023-05-07T02:59:37Z

Other examples like this would be where, for example, a ValueSet includes the implicit all-codes ValueSet and the result is flat, but if it instead includes the CodeSystem directly then it is hierarchical

If $expand?url=vs1 returns a hierarchical expansion, then I define vs2 as "include vs1", should it not also return a hierarchical expansion?

Michael Lawley2023-05-07T07:52:05Z

It is acceptable from the infrastructure's pov, but not acceptable from the consumer's pov

From my perspective, the consumer here is using a tool that could provide this behaviour itself by using the CodeSystem directly (or by reconstructing the hierarchy from parent relationships), but the tool chooses to hand it off to the tx server. Since this is a context-specific behaviour, why not have the tool that wants it, implement it?

Of course, if Ontoserver users call for this behaviour, then that's something we would strong consider, but otherwise it seems like there's an undocumented set of use-cases where a specific behaviour is desired that we have to discover in a trial by error manner.

Michael Lawley2023-05-07T07:59:27Z

well, here you are, discovering it :grinning:

Grahame Grieve2023-05-07T13:19:32Z

returning an hierarchical expansion when the value set includes all of a hierarchical code system is a required feature for HL7 IG publication

Grahame Grieve2023-05-07T13:20:44Z

Probably because I'm grounded in HL7 culture, but for me that's totally obvious and hardly needs to be stated as a requirement, so there you go. However, Ontoserver doesn't need to do that to be used by the eco-system as an additional terminology server

Grahame Grieve2023-05-07T13:22:16Z

I'm thinking about how to handle that in the tests - that's why I asked whether this is a feature that surfaces in the metadata anywhere. But it doesn't :sad:

Grahame Grieve2023-05-07T13:22:55Z

other than parameters-expand-all-hierarchy, parameters-expand-enum-hierarchy, and parameters-expand-isa-hierarchy, does this affect any other tests?

Grahame Grieve2023-05-07T13:25:46Z

on the subject of display error/warning, I'll be advocating for a parameter that defaults to leaving the tx server returning an error.

Grahame Grieve2023-05-07T13:27:25Z

is it another mode flag? or something else?

Grahame Grieve2023-05-07T13:30:54Z

I think another mode flag works. With the default being return error, and the flag saying don't error on displays, just warn.

Michael Lawley2023-05-07T21:09:09Z
Grahame Grieve2023-05-08T11:40:41Z

I've just updated https://r4.ontoserver.csiro.au/fhir with the work-in-progress changes to align better with the requirements as expressed in the txTests
I believe that many of the reported failures are false negatives, and some are very hard to understand what's going on, e.g.:

  Test validation-simple-code-good-version:   ... Exception: Error from server: Error:org.hl7.fhir.r4.model.CodeableConcept@11b455e5

    org.hl7.fhir.r4.utils.client.EFhirClientException: Error from server: Error:org.hl7.fhir.r4.model.CodeableConcept@11b455e5

    at org.hl7.fhir.r4.utils.client.network.FhirRequestBuilder.unmarshalReference(FhirRequestBuilder.java:263)
    at org.hl7.fhir.r4.utils.client.network.FhirRequestBuilder.execute(FhirRequestBuilder.java:230)
    at org.hl7.fhir.r4.utils.client.network.Client.executeFhirRequest(Client.java:194)
    at org.hl7.fhir.r4.utils.client.network.Client.issuePostRequest(Client.java:119)
    at org.hl7.fhir.r4.utils.client.FHIRToolingClient.operateType(FHIRToolingClient.java:279)
    at org.hl7.fhir.convertors.txClient.TerminologyClientR4.validateVS(TerminologyClientR4.java:137)
    at org.hl7.fhir.validation.special.TxTester.validate(TxTester.java:252)
    at org.hl7.fhir.validation.special.TxTester.runTest(TxTester.java:191)
    at org.hl7.fhir.validation.special.TxTester.runSuite(TxTester.java:163)
    at org.hl7.fhir.validation.special.TxTester.execute(TxTester.java:95)
    at org.hl7.fhir.validation.ValidatorCli.parseTestParamsAndExecute(ValidatorCli.java:227)
    at org.hl7.fhir.validation.ValidatorCli.main(ValidatorCli.java:148)
Michael Lawley2023-05-08T11:41:56Z

I'll investigate

Grahame Grieve2023-05-08T11:42:31Z

it's sure not a useful error message

Grahame Grieve2023-05-08T11:42:41Z
Grahame Grieve2023-05-08T11:46:40Z

I noticed also that the test fixtures are not automatically created?
Also language/codesystem-de-multi.json has elements like title:en which fails when I tried to load it in (using the 5->4 converter in HAPI)

Michael Lawley2023-05-08T11:46:56Z

oh. right

Grahame Grieve2023-05-08T11:47:16Z

you can't use those directly, no

Grahame Grieve2023-05-08T11:47:25Z

I forgot - I was playing around with that format and left it in

Grahame Grieve2023-05-08T11:48:14Z

in the case of that test, the error should be

 Error from server: Error:[0a8c6743-42a8-43fe-bca5-1138aa91595d]: Could not find value set http://hl7.org/fhir/test/ValueSet/version-all-1 and version null. If this is an implicit value set please make sure the url is correct. Implicit values sets for different code systems are specified in https://www.hl7.org/fhir/terminologies-systems.html.
Grahame Grieve2023-05-08T11:55:03Z

I noticed also that the test fixtures are not automatically created?

I'm not sure what that means

Grahame Grieve2023-05-08T11:55:46Z

All the test code systems, and valuesets identified in test-cases.json are not automatically loaded into Ontoserver when I run the txTests thing. Instead, I needed to run my own loader

Michael Lawley2023-05-08T11:57:33Z

no they're passed in a tx-resource parameter with each request

Grahame Grieve2023-05-08T11:58:36Z

I didn't notice this until just now, running against the new r4.ontoserver deployment since previously I was testing against a local server that I'd already loaded things onto

Michael Lawley2023-05-08T11:58:49Z

Aha! Another magic parameter -- is support for that part of the test?

Michael Lawley2023-05-08T11:59:51Z

this is already known. You and I discussed it in the past. see FHIR-33944. It's very definitely required

Grahame Grieve2023-05-08T12:01:02Z

The test cases do it this way since support is required to support the IG publisher

Grahame Grieve2023-05-08T12:03:24Z
Grahame Grieve2023-05-08T12:10:32Z

Yes, I recall the proposal.

The test cases do it this way since support is required to support the IG publisher

that's effectively what I was asking.

Does this also extend to FHIR-33946 and the cache-id parameter?

Michael Lawley2023-05-08T12:10:33Z

that one is optional - the client looks in the capability statement to see if cache-id is stated to be supported before deciding that the server is capable of doing that

Grahame Grieve2023-05-08T12:11:17Z

though the test cases don't try that

Grahame Grieve2023-05-08T12:12:07Z

I'm going to have to put some considered thought into how we support tx-resource.
Non-exhaustive list of considerations:

  1. write permissions (or lack thereof),
  2. operating in read-only mode (common for national / reference servers),
  3. name clashes
  4. visibility and isolation

None of these are a problem for us with ValueSet resources (we already support contained ValueSets), but they are for CodeSystems.

Michael Lawley2023-05-08T12:19:47Z

for me, those are not a thing - they are never written. You probably can't avoid that. But what's 'name clashes' about?

Grahame Grieve2023-05-08T12:24:32Z

What happens when the resource passed via tx-resource has the same URL as one that is already on the server? Does it shadow it? It may have an older version than the one on the server and the reference from the request may not be version-specific; should the older version supplied via tx-resource be preferred over the newer one?

Michael Lawley2023-05-09T00:48:52Z

here's what I drafted about that:

Grahame Grieve2023-05-09T00:54:55Z

One or more additional resources that are referred to from the value set provided with the $expand or $validate-code invocation. These may be additional value sets or code systems that the client believes will or may be necessary to perform the operation. Resources provided in this fashion are used preferentially to those known to the system, though servers may return an error if these resources are already known to the server (by URL and version) but differ from that information on the server

Grahame Grieve2023-05-09T00:55:11Z

@Michael Lawley I updated the test cases for the new mode parameter

Grahame Grieve2023-05-11T13:24:23Z

Thanks. I note that it is still complaining about extension content (Ontoserver includes some of its own extensions). I would have expected addition extension content to be generally ignored?

Michael Lawley2023-05-12T05:56:21Z

which extensions?

Grahame Grieve2023-05-12T09:26:35Z

Michael Lawley said:

Coding.display A representation of the meaning of the code in the system, following the rules of the system.

"following the rules of the system", not "following the rules of some system implementer".

Also, if a display is not appropriate, then get it fixed -- either at source (in HL7 / THO) or with the external party. If the external party won't play ball, then fix it in a shared supplement so everyone can benefit rather than lots of (potentially incompatible) fixes spread over many different IGs.

Remembering that things get done according to the path of the least resistance, I see very little instruction and zero examples of using supplements in http://hl7.org/fhir/valueset.html - so chances of them being used for this purpose are very slim. Any changes in this area must offer a path of less or at most equal resistance compared to trimming the display text to what you mean.

Vadim Peretokin2023-05-12T10:36:15Z

well, we can provide examples, that's for sure.

Grahame Grieve2023-05-12T10:37:46Z

Yep, at the same time, there is dragon text on the supplements:

The impact of Code System supplements on value set expansion - and therefore value set validation - is subject to ongoing experimentation and implementation testing, and further clarification and additional rules might be proposed in future versions of this specification.

That would need to go away as well to get confidence in using them

Vadim Peretokin2023-05-12T10:38:38Z

Otherwise hard to say 'this is what you shall use' when it's an experimental thing.

Vadim Peretokin2023-05-12T10:39:00Z

we're coming out of the experimentation phase :grinning:

Grahame Grieve2023-05-12T10:40:05Z

and talking about the additional rules

Grahame Grieve2023-05-12T10:40:16Z

Michael Lawley said:

If that's all they did I'd be less concerned. What they REALLY DO is allow people to change the display text on-the-fly to absolutely anything (and people do this), and the results sometimes bear zero resemblance to the code's meaning. This is why I say we're concerned about the clinical use case over the IG use case, and why I want the caller to explicitly request that an invalid display not return an error; then the onus is on the caller.

I don't see how this will improve the situation. It would just become an almost mandatory thing you do "just because the spec requires it" and it wouldn't carry the intended meaning.

Good use of supplements would, that way the IG can be explicit about the display codes it is tweaking to better fit the purpose. I'd be happy to do that in my IGs!

Vadim Peretokin2023-05-12T11:13:44Z

@Michael Lawley I finally got to a previously reported issue:

However, I'm trying to use tx.fhir.org/r4 as a reference point but I can't get it to behave.
For example http://tx.fhir.org/r4/ValueSet/$validate-code?system=http://snomed.info/sct&code=22298006&url=http://snomed.info/sct?fhir_vs=isa/118672003 gives a result=true even though the code is not in the valueset. In fact the url parameter seems to be totally ignored?

Indeed. It's an issue in the parser because there's 2 = in the parameter - it's splitting on the second not the first

Grahame Grieve2023-05-16T04:20:23Z

it works as expected if you escape the second =

Grahame Grieve2023-05-16T04:26:10Z

I believe the correct strategy is to take the query part (everything from the 1st ?) and split on &, then split each of these on the first = only

Michael Lawley2023-05-16T04:26:35Z

I didn't say I was happy with what it's doing

Grahame Grieve2023-05-16T04:27:00Z

ah, not your parser code then?

Michael Lawley2023-05-16T04:27:50Z

it is. it's the oldest code I have. I think I haven't touched it since 1997 or so

Grahame Grieve2023-05-16T04:28:10Z

PR time?

Michael Lawley2023-05-16T04:29:16Z

maybe. The URL itself is invalid so the behaviour isn't wrong, but I don't like it much

Grahame Grieve2023-05-16T04:29:48Z

Why is that URL invalid?

Michael Lawley2023-05-16T19:59:52Z

an unescaped = in it. I think that's not valid according to the http spec. But I upgraded the server anyway, and it should be OK now

Grahame Grieve2023-05-16T20:00:37Z

according to https://www.rfc-editor.org/info/rfc3986 it is valid, and '=' is considered to be a subdilimiter.

Bart Decuypere2023-05-17T10:04:10Z

that doesn't really relate to it's use in key/value pairs

Grahame Grieve2023-05-17T12:12:34Z

I don't see where an unescaped = is illegal?

Michael Lawley2023-05-17T23:04:46Z

@Michael Lawley a new issue has raised it's ugly head.

Grahame Grieve2023-05-18T06:40:23Z

consider the situation where a value set refers to an unknown code system, and just includes all of it, and a client asks to validate the code

Grahame Grieve2023-05-18T06:40:57Z

e.g.

{
  "resourceType" : "ValueSet",
  "id" : "unknown-system",
  "url" : "http://hl7.org/fhir/test/ValueSet/unknown-system",
  "version" : "5.0.0",
  "name" : "UnknownSystem",
  "title" : "Unknown System",
  "status" : "active",
  "experimental" : true,
  "date" : "2023-04-01",
  "publisher" : "FHIR Project",
  "compose" : {
    "include" : [{
      "system" : "http://hl7.org/fhir/test/CodeSystem/simpleX"
    }]
  }
}
Grahame Grieve2023-05-18T06:41:41Z

and

{
  "resourceType" : "Parameters",
  "parameter" : [{
    "name" : "url",
    "valueUri" : "http://hl7.org/fhir/test/ValueSet/unknown-system"
  },{
    "name" : "code",
    "valueCode" : "code1"
  },{
    "name" : "system",
    "valueUri" : "http://hl7.org/fhir/test/CodeSystem/simpleX"
  }]
}
Grahame Grieve2023-05-18T06:41:55Z

This is a pretty common situation in the IG world, and the IG publisher considers this a warning not an error.

Grahame Grieve2023-05-18T06:42:24Z

but it's very clearly an error validating

Grahame Grieve2023-05-18T06:42:51Z
{
  "resourceType" : "Parameters",
  "parameter" : [{
    "name" : "issues",
    "resource" : {
      "resourceType" : "OperationOutcome",
      "issue" : [{
        "severity" : "error",
        "code" : "not-found",
        "details" : {
          "text" : "The CodeSystem http://hl7.org/fhir/test/CodeSystem/simpleX is unknown"
        },
        "location" : ["code.system"]
      }]
    }
  },
  {
    "name" : "message",
    "valueString" : "The CodeSystem http://hl7.org/fhir/test/CodeSystem/simpleX is unknown"
  },
  {
    "name" : "result",
    "valueBoolean" : false
  }]
}
Grahame Grieve2023-05-18T06:43:29Z

... only... the validator decides that this is one of those cases because there's a parameter

  "cause" : "not-found"

where cause is taken from OperationOutcome.issue.type.

Grahame Grieve2023-05-18T06:44:48Z

but I removed cause from the returned parameters, and now I have no way to know that the valueset validation failed because of an unknown code system

Grahame Grieve2023-05-18T06:45:17Z

the case above says that there is an unknown code system, but it doesn't explicitly say that the result is false because of the unknown code system.

Grahame Grieve2023-05-18T06:45:47Z

This is a "fail to validate" rather than a "validate = false" situation -- I'd expect a 4XX series error from the Tx and an OperationOutcome about the CodeSystem not found.
Will that work?
I'm pretty sure Ontoserver does something like this

Michael Lawley2023-05-18T07:33:17Z

I don't think that's right - other issues can still be detected and returned

Grahame Grieve2023-05-18T09:22:36Z

So I don't follow why you have removed cause?

Michael Lawley2023-05-18T10:09:50Z

it wasn't a standard parameter. And it was pretty loose anyway

Grahame Grieve2023-05-18T10:12:11Z

it's kind of weird to just put 'cause : not found' and assume everyone knows that means validation failed because the code system needed to determine value set membership wasn't found

Grahame Grieve2023-05-18T10:13:16Z

I need a better way to say it...

Grahame Grieve2023-05-18T10:13:29Z

you also have location: ["code.system"] and the details.text

Michael Lawley2023-05-18T10:19:32Z

I do have that, but I'm going to be second guessing the server to decide whether that's the cause, or an incidental finding

Grahame Grieve2023-05-18T10:27:04Z

Does this come down to identifying which one (or more?) of the issues was the trigger for result = false?

Michael Lawley2023-05-18T10:38:31Z

yes that's one way to look at it

Grahame Grieve2023-05-18T10:45:19Z

Can it be as simple as "all the issues with severity = error"?

Michael Lawley2023-05-18T10:46:00Z

no I don't think it can. There's plenty of scope of issues with severity = error whether or not the code is in the value set

Grahame Grieve2023-05-18T10:47:11Z

Doesn't that depend on how you interpret things? For example, if validating a codeableConcept, then you validate each contained Coding. If they all fail, then each contributes an issue with severity of error, but if any passes, then the issues from the others would just be warning?

Michael Lawley2023-05-18T10:52:55Z

This seems to be in line with

Indicates how relevant the issue is to the overall success of the action

Michael Lawley2023-05-18T10:53:16Z

I certainly don't think levels work like that. If a system is wrong, or a code is invalid, then that's an error

Grahame Grieve2023-05-18T10:53:51Z

at the local level, but not at the level of the overall operation

Michael Lawley2023-05-18T10:54:21Z

issue.code has this comment:

For example, code-invalid might be a warning or error, depending on the context

Michael Lawley2023-05-18T10:55:12Z

really?

Grahame Grieve2023-05-18T10:56:12Z

really

Comments:
Code values should align with the severity. For example, a code of forbidden generally wouldn't make sense with a severity of information or warning. Similarly, a code of informational would generally not make sense with a severity of fatal or error. However, there are no strict rules about what severities must be used with which codes. For example, code-invalid might be a warning or error, depending on the context

(my emphasis)

Michael Lawley2023-05-18T11:11:44Z

oh I believed you. And I probably did write that. But I've noodled on it for a couple of hours, and in the context of the validator, invalid codes are invalid codes, whether they're in the scope of the value set or not.

Grahame Grieve2023-05-18T11:58:13Z

and on further noodling, I think this is OK to be an extension for tx.fhir.org - the notion of 'it's not an error because the code system is unknown' is kind of centric to the base tx service, and not to additional ones. So I'm going with a parameter name of x-caused-by-unknown-system for the link, and the tests won't require that

Grahame Grieve2023-05-18T19:25:00Z
Grahame Grieve2023-05-30T08:28:35Z

also @Jonathan Payne

Grahame Grieve2023-05-30T08:28:41Z

@Grahame Grieve Looks nice... :+1:

Bart Decuypere2023-05-30T09:17:14Z

other/codesystem-dual-filter.json is invalid -- it has a duplicate code: AA

Michael Lawley2023-06-02T00:55:56Z

Also, HAPI is complaining about language/codesystem-de-multi.json:

HAPI-0450: Failed to parse request body as JSON resource. Error was: HAPI-1825: Unknown element 'title:en' found during parse

Michael Lawley2023-06-02T00:57:51Z

hmm

Grahame Grieve2023-06-02T01:24:57Z

hapi probably doesn't support JSON 5 either. can you try commenting that line out?

Grahame Grieve2023-06-02T02:12:37Z

So, the testing/comparison aspect is complaining about / rejecting extensions that Ontoserver includes that are not part of the expected result.
e.g.,

Group simple-cases
  Test simple-expand-all: Fail
    properties differ at .expansion.contains[1]: missing property extension
  Test simple-expand-enum: Fail
    properties differ at .expansion.contains[1]: missing property extension
  Test simple-expand-isa: Fail
    properties differ at .expansion.contains[0]: missing property extension
  Test simple-expand-prop: Fail
    properties differ at .expansion.contains[0]: missing property extension
  Test simple-expand-regex: Fail
    properties differ at .expansion.contains[1]: missing property extension
Michael Lawley2023-06-09T11:33:17Z

what extensions are yo including?

Grahame Grieve2023-06-09T12:16:27Z

One is http://ontoserver.csiro.au/profiles/expansion

Michael Lawley2023-06-09T12:18:28Z

what is it?

Grahame Grieve2023-06-09T12:36:31Z

Why does that matter? It's an extension, if you don't understand it you can (should) ignore it.

(It's actually legacy from DSTU2_1 to indicate inactive status)

Michael Lawley2023-06-09T12:40:31Z

it doesn't matter for the tests, no, but I'm just interested for the sake of being nosy

Grahame Grieve2023-06-09T12:41:15Z

:laughing:

Michael Lawley2023-06-09T12:41:39Z

I'll think about the testing part

Grahame Grieve2023-06-09T12:41:49Z
Grahame Grieve2023-06-12T16:18:24Z

I have removed the section on registration - I'm rewriting that after talking to @Michael Lawley, more on that soon

Grahame Grieve2023-07-26T10:15:37Z

I reconciled the two pages and changed the way the web source reference works

Grahame Grieve2023-07-26T10:16:04Z

@Grahame Grieve Hi, I am running the fhir tx testsuite against Snowstorm. For some tests, there are complaints about a missing "id" property, and the test fails. Turns out that the resource that is returned contains an "id" whereas the "reference" resource does not contain an "id". Is this a real "fail", or is the "id" property supposed to be optional?
Expected:

{
  "$optional-properties$" : ["date", "publisher", "compose"],
  "resourceType" : "ValueSet",
  "url" : "http://hl7.org/fhir/test/ValueSet/simple-all",
  "version" : "5.0.0",
  "name" : "SimpleValueSetAll",
  "title" : "Simple ValueSet All",
  "status" : "active",
  "experimental" : false,
  "date" : "2023-04-01",
  "publisher" : "FHIR Project",
  "compose" : {
    "include" : [{
      "system" : "http://hl7.org/fhir/test/CodeSystem/simple"
    }]
  },
  "expansion" : {
    "identifier" : "$uuid$",
    "timestamp" : "$instant$",
    "total" : 7,
    "parameter" : [{
      "name" : "excludeNested",
      "valueBoolean" : true
    },
    {
      "name" : "used-codesystem",
      "valueUri" : "http://hl7.org/fhir/test/CodeSystem/simple|0.1.0"
    },
    {
      "$optional$" : true,
      "name" : "version",
      "valueUri" : "http://hl7.org/fhir/test/CodeSystem/simple|0.1.0"
    }],
    "contains" : [{
      "system" : "http://hl7.org/fhir/test/CodeSystem/simple",
      "code" : "code1",
      "display" : "Display 1"
    },
    {
      "system" : "http://hl7.org/fhir/test/CodeSystem/simple",
      "abstract" : true,
      "inactive" : true,
      "code" : "code2",
      "display" : "Display 2"
    },
    {
      "system" : "http://hl7.org/fhir/test/CodeSystem/simple",
      "code" : "code2a",
      "display" : "Display 2a"
    },
    {
      "system" : "http://hl7.org/fhir/test/CodeSystem/simple",
      "code" : "code2aI",
      "display" : "Display 2aI"
    },
    {
      "system" : "http://hl7.org/fhir/test/CodeSystem/simple",
      "code" : "code2aII",
      "display" : "Display 2aII"
    },
    {
      "system" : "http://hl7.org/fhir/test/CodeSystem/simple",
      "code" : "code2b",
      "display" : "Display 2b"
    },
    {
      "system" : "http://hl7.org/fhir/test/CodeSystem/simple",
      "code" : "code3",
      "display" : "Display 3"
    }]
  }
}

Actual:

{
    "resourceType": "ValueSet",
    "id": "simple-all",
    "url": "http://hl7.org/fhir/test/ValueSet/simple-all",
    "version": "5.0.0",
    "name": "SimpleValueSetAll",
    "title": "Simple ValueSet All",
    "status": "active",
    "experimental": false,
    "publisher": "FHIR Project",
    "expansion": {
        "id": "f4b71bf6-3ef4-4c30-a4ea-ab3f4ae3dad6",
        "timestamp": "2024-10-09T15:08:23+02:00",
        "total": 7,
        "offset": 0,
        "parameter": [
            {
                "name": "version",
                "valueUri": "http://hl7.org/fhir/test/CodeSystem/simple|0.1.0"
            },
            {
                "name": "displayLanguage",
                "valueString": "en"
            }
        ],
        "contains": [
            {
                "system": "http://hl7.org/fhir/test/CodeSystem/simple",
                "code": "code1",
                "display": "Display 1"
            },
            {
                "system": "http://hl7.org/fhir/test/CodeSystem/simple",
                "code": "code2",
                "display": "Display 2"
            },
            {
                "system": "http://hl7.org/fhir/test/CodeSystem/simple",
                "code": "code2a",
                "display": "Display 2a"
            },
            {
                "system": "http://hl7.org/fhir/test/CodeSystem/simple",
                "code": "code2aI",
                "display": "Display 2aI"
            },
            {
                "system": "http://hl7.org/fhir/test/CodeSystem/simple",
                "code": "code2aII",
                "display": "Display 2aII"
            },
            {
                "system": "http://hl7.org/fhir/test/CodeSystem/simple",
                "code": "code2b",
                "display": "Display 2b"
            },
            {
                "system": "http://hl7.org/fhir/test/CodeSystem/simple",
                "code": "code3",
                "display": "Display 3"
            }
        ]
    }
}
Bart Decuypere2024-10-09T13:17:06Z

it's not an error to return a populated id element. If doesn't even have to the same id. Probably it shouldn't be, but that's a style question

Grahame Grieve2024-10-09T14:21:17Z

which means that the test is wrong, really

Grahame Grieve2024-10-09T14:22:29Z

I updated the tests to allow id, but you'll have to wait for the release of a new validator to use them, unfortunately

Grahame Grieve2024-10-09T14:46:49Z

about 24 hours

Grahame Grieve2024-10-09T15:05:08Z

As you may know from other messages, I am investigating the options to make Snowstorm fhir tx testsuite compliant. As our reference server for terminology in Belgium is an Ontoserver (now 6.20.1 since yesterday), and I want the Snowstorm behaviour to be as similar as possible to the Ontoserver behaviour, I also ran the fhir tx testsuite against Ontoserver. I got a result of 16% fails.

I know from #Announcements > Using Ontoserver with Validator / IG Publisher that Ontoserver is considered compatible. How should I interpret the 16% failed tests? Is any software allowed to fail 16% tests? Any 16%, or only that specific 16% of the tests? What is also strange, is that the highest amount of failures is in the "simple-cases" test group. Is the "simple-cases" test group the test of _basic_ behaviour, and are these tests of a greater weight? What does this say about the interplay between IGPublisher and the tested terminology server?

Bart Decuypere2024-10-15T09:03:33Z

I don't know about 16% failure. What version are you running? I test the public ontoserver everyday and get 100% pass rate

Grahame Grieve2024-10-15T09:59:17Z
Grahame Grieve2024-10-15T09:59:51Z

is that the highest amount of failures is in the "simple-cases" test group

hmm. maybe you need to set a parameter for flat rather than nested? Ontoserver doesn't do nested expansions, and that's a setting you pass to the test cases

Grahame Grieve2024-10-15T10:03:53Z

try -mode flat

Grahame Grieve2024-10-15T10:08:22Z

Ah yes, I had forgotten about that option

Michael Lawley2024-10-15T11:17:16Z

@Michael Lawley @Grahame Grieve Errors have gone down to 10% with

-mode flat

But that is still a lot... Any other suggestions? Since there are 'only' 21 failed testcases now, I'll post a list of their names here.

Bart Decuypere2024-10-17T07:00:48Z
        {
          "name" : "simple-expand-isa-o2",
          "status" : "fail",
          "message" : "properties differ at .expansion.contains[0]: missing property abstract"
        },
        {
          "name" : "simple-expand-isa-c2",
          "status" : "fail",
          "message" : "properties differ at .expansion: missing property offset"
        },
        {
          "name" : "simple-expand-isa-o2c2",
          "status" : "fail",
          "message" : "string property values differ at .expansion.contains[0].code\nExpected:\"code2aI\" for simple-expand-isa-o2c2\nActual  :\"code2a\""
        },
        {
          "name" : "simple-lookup-1",
          "status" : "fail",
          "message" : "string property values differ at .parameter[6].part[2].valueCode\nExpected:\"code2aI\" for simple-lookup-1\nActual  :\"code2aII\""
        },
        {
          "name" : "simple-lookup-2",
          "status" : "fail",
          "message" : "array item count differs at .parameter[9].part\nExpected:\"2\" for simple-lookup-2\nActual  :\"3\""
        },
        {
          "name" : "validation-simple-code-bad-valueSet",
          "status" : "fail",
          "message" : "array item count differs at .issue\nExpected:\"1\" for validation-simple-code-bad-valueSet\nActual  :\"2\""
        },
        {
          "name" : "validation-simple-coding-bad-valueSet",
          "status" : "fail",
          "message" : "array item count differs at .issue\nExpected:\"1\" for validation-simple-coding-bad-valueSet\nActual  :\"2\""
        },
        {
          "name" : "validation-simple-codeableconcept-bad-valueSet",
          "status" : "fail",
          "message" : "array item count differs at .issue\nExpected:\"1\" for validation-simple-codeableconcept-bad-valueSet\nActual  :\"2\""
        },
        {
          "name" : "validation-simple-codeableconcept-bad-version2",
          "status" : "fail",
          "message" : "string property values differ at .parameter[1].resource.issue[1].details.text\nExpected:\"A definition for CodeSystem 'http://hl7.org/fhir/test/CodeSystem/simpleXX' version '1.0.4234' could not be found, so the code cannot be validated. Valid versions: []\" for validation-simple-codeableconcept-bad-version2\nActual  :\"A definition for CodeSystem 'http://hl7.org/fhir/test/CodeSystem/simpleXX|1.0.4234' could not be found, so the code cannot be validated\""
        },
        {
          "name" : "validation-simple-code-bad-language",
          "status" : "fail",
          "message" : "array item count differs at .parameter\nExpected:\"6\" for validation-simple-code-bad-language\nActual  :\"4\""
        },
        {
          "name" : "validation-simple-coding-bad-language",
          "status" : "fail",
          "message" : "array item count differs at .parameter\nExpected:\"6\" for validation-simple-coding-bad-language\nActual  :\"4\""
        },
        {
          "name" : "validation-simple-coding-bad-language-header",
          "status" : "fail",
          "message" : "array item count differs at .parameter\nExpected:\"6\" for validation-simple-coding-bad-language-header\nActual  :\"4\""
        },
        {
          "name" : "validation-simple-coding-bad-language-vs",
          "status" : "fail",
          "message" : "array item count differs at .parameter\nExpected:\"6\" for validation-simple-coding-bad-language-vs\nActual  :\"4\""
        },
        {
          "name" : "validation-simple-coding-bad-language-vslang",
          "status" : "fail",
          "message" : "array item count differs at .parameter\nExpected:\"6\" for validation-simple-coding-bad-language-vslang\nActual  :\"4\""
        },
        {
          "name" : "validation-simple-codeableconcept-bad-language",
          "status" : "fail",
          "message" : "array item count differs at .parameter\nExpected:\"7\" for validation-simple-codeableconcept-bad-language\nActual  :\"5\""
        },
        {
          "name" : "big-echo-no-limit",
          "status" : "fail",
          "message" : "string property values differ at .resourceType\nExpected:\"OperationOutcome\" for big-echo-no-limit\nActual  :\"ValueSet\""
        },
        {
          "name" : "notSelectable-reprop-true",
          "status" : "fail",
          "message" : "number property values differ at .expansion.total\nExpected:\"1\" for notSelectable-reprop-true\nActual  :\"0\""
        },
        {
          "name" : "notSelectable-reprop-false",
          "status" : "fail",
          "message" : "number property values differ at .expansion.total\nExpected:\"1\" for notSelectable-reprop-false\nActual  :\"0\""
        },
        {
          "name" : "notSelectable-reprop-true-true",
          "status" : "fail",
          "message" : "array item count differs at .parameter\nExpected:\"5\" for notSelectable-reprop-true-true\nActual  :\"6\""
        },
        {
          "name" : "notSelectable-reprop-false-false",
          "status" : "fail",
          "message" : "array item count differs at .parameter\nExpected:\"5\" for notSelectable-reprop-false-false\nActual  :\"6\""
        },
        {
          "name" : "act-class",
          "status" : "fail",
          "message" : "properties differ at .expansion.contains[10]: missing property property"
        }
Bart Decuypere2024-10-17T07:09:29Z

well, that's weird. like I said, 100% on the public ontoserver. is that what you get testing that one?

Grahame Grieve2024-10-17T07:49:01Z

No, that is what I get testing the Belgian one. Sadly I cannot give you the URL, because it is not publicly accessible for the moment. But it's newly setup, so its setup might differ from the Australian setup.

Bart Decuypere2024-10-17T08:33:03Z

well, how about you test the public Australian one. If that passes, then you have a baseline. Btw, the output will point you at a temp directory where you can use a diff program to look at the difference between expected and actual

Grahame Grieve2024-10-17T08:35:07Z

@Michael Lawley I know you are in contact with our terminology man David Op de Beeck and his team. Could you suggest any possible modifications in the Belgian setup to get the test cases working?

Bart Decuypere2024-10-17T08:42:05Z

it'd be a lot easier if you'd look at the differences and tell us why... a language thing?

Grahame Grieve2024-10-17T08:43:22Z

that seems most likely to me

Grahame Grieve2024-10-17T08:43:28Z

And is there a tad of documentation available on that topic?

Bart Decuypere2024-10-17T08:44:22Z

which topic?

Grahame Grieve2024-10-17T08:44:35Z

I mean from the Ontoserver side, how to pass the tests...

Bart Decuypere2024-10-17T08:44:56Z

@Grahame Grieve
These are the cli options I am using now:
-txTests -source ./tx -output ./output -tx https://belgian.tx.server -version 4.0 -mode flat
Do I find the temp directory in test-results.json? Or in the stdout/stderr of the validator_cli.jar?

Bart Decuypere2024-10-17T08:57:41Z

your output should start something like this:

Run terminology service Tests
  Source for tests: /Users/grahamegrieve/work/test-cases/tx
  Output Directory: /Users/grahamegrieve/temp/local.fhir.org
  Term Service Url: http://local.fhir.org
  External Strings: false
  Test  Exec Modes: []
  Tx  FHIR Version: true
Grahame Grieve2024-10-17T09:18:02Z

look in the output directory

Grahame Grieve2024-10-17T09:18:11Z

Just catching up with this thread. We too get an error for:

        {
          "name" : "simple-expand-isa-o2",
          "status" : "fail",
          "message" : "properties differ at .expansion.contains[0]: missing property abstract"
        },

for example, because Ontoserver includes "abstract = true" for "code2" (implied because it has the property notSelectable = true"). The expected response in the test doesn't include this, but I think should be updated (in line with a number of the other expected responses in the "simple" set).

Michael Lawley2024-10-17T10:08:55Z

@Grahame Grieve do you perhaps have a "quarrantine" list that whitelists a bunch of reported (but wrong/trivial) failures?

Michael Lawley2024-10-17T10:09:49Z

not to my knowledge. I'll investigate

Grahame Grieve2024-10-17T10:36:47Z

hmm so this is where I eat humble pie. it turns out that I don't check the outcomes at all. Here's the code in the my JUnit test cases:

    String err = tester.executeTest(setup.suite, setup.test, modes);
    Assertions.assertTrue(true); // we don't care what the result is, only that we didn't crash
Grahame Grieve2024-10-17T10:52:43Z

and when I looked at that in surprise, I remembered what I was thinking. You (@Michael Lawley) might recall that occasionally, the tester crashed testing ontoserver. so I added the ontoserver tests to ensure that it didn't crash on you (which it hasn't since I added the tests)

But I erroneously got it in my mind that it was testing ontoserver, as is evident earlier in the thread. Now that I've changed it, I'm getting 100 failures

Grahame Grieve2024-10-17T10:54:27Z

I'll dig into them over the weekend. @Bart Decuypere my apologies for giving you the run around on this

Grahame Grieve2024-10-17T10:55:39Z

100?!? Are you setting mode flat?

Michael Lawley2024-10-17T10:56:55Z

yep

Grahame Grieve2024-10-17T10:57:39Z

some of them at tx.fhir.org only tests, don't know why they're running, but that's only maybe 20. I haven't looked at the others

Grahame Grieve2024-10-17T10:58:01Z

how often do you run them?

Grahame Grieve2024-10-17T10:58:40Z

Every build runs the tests, but we have a quarantine list so that certain failures are tolerated.
I can share that - the intention had been to work through that list and get the corner cases sorted out (some have crept in as new tests were added), but with Jim on paternity leave we've not had the bandwidth

Michael Lawley2024-10-17T11:02:57Z

well, we better work through them then

Grahame Grieve2024-10-17T11:10:56Z

and congratulations @Jim Steel btw

Grahame Grieve2024-10-17T11:13:12Z

i'm not pointing at the Ontoserver message file. I better do that

Grahame Grieve2024-10-17T11:24:49Z

what is this?

      "extension" : [{
        "extension" : [{
          "url" : "inactive",
          "valueBoolean" : true
        }],
        "url" : "http://ontoserver.csiro.au/profiles/expansion"
      }],
Grahame Grieve2024-10-17T11:46:13Z

lots of the fails are because of this

Grahame Grieve2024-10-17T11:46:23Z

Yes, it's a "private" extension, kept for backward compatibility, that predates the R5 property stuff.
But it should be ignored for test purposes; unknown extensions that are not must understand are safe to ignore

Michael Lawley2024-10-17T11:49:12Z

it didn't used to be present

Grahame Grieve2024-10-17T11:50:10Z

and this one is weird given that there's also inactive = true directly

Grahame Grieve2024-10-17T11:50:35Z

Grahame Grieve said:

@Bart Decuypere my apologies for giving you the run around on this

No offense taken, I've seen worse in my life...

Bart Decuypere2024-10-17T12:32:22Z

I am still eager to see the actual differences:

  Java:   18 from C:\openjdk-18\jdk-18 on amd64 (64bit). 8148MB available
  Paths:  Current = C:\Temp\toy\fhir-test-cases, Package Cache = C:\Users\eh089\.fhir\packages
  Params: -txTests -source ./tx -output ./output -tx https://belgian.tx.server -version 4.0 -mode flat
Run terminology service Tests
  Source for tests: ./tx
  Output Directory: ./output
  Term Service Url: https://belgian.tx.server
  External Strings: false
  Test  Exec Modes: [flat]
  Tx  FHIR Version: 4.0
Load Tests from ./tx

I can't find any files to diff in the output directory, only test-results.json

Bart Decuypere2024-10-17T12:40:46Z

really? weird.

Grahame Grieve2024-10-17T12:41:33Z

BTW: I forgot to paste the version:
FHIR Validation tool Version 6.3.32 (Git# 54bf319161d4). Built 2024-10-14T06:04:19.383Z (3 days old)

Bart Decuypere2024-10-17T12:43:48Z

if you run it with these parameters:

Grahame Grieve2024-10-17T12:46:48Z

-txTests -source /Users/grahamegrieve/work/test-cases/tx -tx https://tx.ontoserver.csiro.au/fhir -mode flat

Grahame Grieve2024-10-17T12:47:07Z

you should get this in your output directory:

Grahame Grieve2024-10-17T12:47:17Z
Grahame Grieve2024-10-17T12:47:53Z

OK, I'll try...

Bart Decuypere2024-10-17T12:48:43Z

The -output option will need an overhaul, I presume... without it, it works as you described. The percentage of failures however is identical (10%).

Bart Decuypere2024-10-17T12:56:05Z

@Michael Lawley So the Australian and the Belgian Ontoserver seem to have the same setup with regard to the FHIR tx testcases.

Bart Decuypere2024-10-17T12:57:43Z

I'm not understanding that bit about the -output option.

Grahame Grieve2024-10-17T13:03:37Z

If I specify the -output option, the "actual" files do not get logged in the output directory, but in another directory (which is not visible in the stdout/stderr). Only the test-results.json file is written to the directory specified in the -output option.

Bart Decuypere2024-10-17T13:08:40Z

it works for me? Weird. I don't know how to investigate that

Grahame Grieve2024-10-17T13:09:08Z

no I happened to have it set to the value it's hardcoded to use. Fixed next release

Grahame Grieve2024-10-17T13:19:40Z
New Publication
#Announcements
Multiple new publications related to HL7 standards and implementation guides have been announced, including updates on various FHIR and CDA guides and release versions spanning topics such as vital records, payer data exchange, and electronic case reporting. Notable updates include the release of STU1 for the FHIR Shorthand implementation guide and the C-CDA on FHIR Implementation Guide, alongside various other specialized guides for healthcare data exchange and reporting.
228 comments
JB
MA
EK

new Publication: STU 1 of theFHIR Shorthand implementation guide: http://hl7.org/fhir/uv/shorthand/STU1

Grahame Grieve2020-10-12T06:07:36Z

New Publication: STU 1 of the FHIR Da Vinci Unsolicited Notifications Implementation Guide: http://hl7.org/fhir/us/davinci-alerts/STU1

Lynn Laakso2020-10-15T20:08:25Z

New Publication: STU 1.1 of the C-CDA on FHIR Implementation Guide: http://hl7.org/fhir/us/ccda/STU1.1

Lynn Laakso2020-10-22T01:06:54Z

New Publication: STU 1 of the Vital Records Mortality and Morbidity Reporting FHIR Implementation Guide: http://hl7.org/fhir/us/vrdr/STU1/index.html

Lynn Laakso2020-10-27T18:03:50Z

New Publication: STU1 of the CARIN Consumer Directed Payer Data Exchange (CARIN IG for Blue Button®) FHIR Implementation Guide: http://hl7.org/fhir/us/carin-bb/STU1

Lynn Laakso2020-11-23T17:57:40Z

New Publication: STU1 of the HL7 Payer Data Exchange (PDex) Payer Network, Release 1 - US Realm Implementation Guide: hl7.org/fhir/us/davinci-pdex-plan-net/STU1

Lynn Laakso2020-12-20T06:38:13Z

New Publication: STU1 of the HL7 Prior-Authorization Support (PAS), Release 1- US Realm FHIR® Implementation Guide: http://hl7.org/fhir/us/davinci-pas/STU1

Lynn Laakso2020-12-20T19:40:08Z

New Publication: STU1 of the HL7 Payer Data Exchange (PDex), Release 1 - US Realm FHIR® Implementation Guide: http://hl7.org/fhir/us/davinci-pdex/STU1

Lynn Laakso2020-12-22T15:08:27Z

New Publication: STU1 of the HL7 Da Vinci - Coverage Requirements Discovery (CRD), Release 1- US Realm FHIR® Implementation Guide: http://hl7.org/fhir/us/davinci-crd/STU1

Lynn Laakso2020-12-22T17:33:08Z

New Publication: STU1 of the HL7 FHIR® Implementation Guide: Payer Coverage Decision Exchange, R1 - US Realm: http://hl7.org/fhir/us/davinci-pcde/STU1

Lynn Laakso2020-12-23T14:04:05Z

New Publication: STU1 of the FHIR® Implementation Guide: Documentation Templates and Payer Rules (DTR), Release 1- US Realm: http://hl7.org/fhir/us/davinci-dtr/STU1/index.html

Lynn Laakso2020-12-23T14:04:44Z

New Publication: STU1 of the HL7 FHIR® Implementation Guide: Risk Based Contract Member Identification, Release 1 - US Realm: http://hl7.org/fhir/us/davinci-atr/STU1

Lynn Laakso2021-02-11T15:26:21Z

New Publication: STU1 of the HL7 FHIR® Implementation Guide: Pharmacist Care Plan Document, Release 1 - US Realm: http://hl7.org/fhir/us/phcp/STU1

Lynn Laakso2021-02-11T17:38:45Z

New Publication: STU1 of the HL7 FHIR® Implementation Guide: Clinical Guidelines, Release 1: http://hl7.org/fhir/uv/cpg/STU1

Lynn Laakso2021-02-11T21:12:52Z

Newly Posted: FHIR R4B Ballot #1: http://hl7.org/fhir/2021Mar

Grahame Grieve2021-03-12T01:31:53Z

New Publication: Normative Release 1 of the HL7 Cross-Paradigm Specification: Clinical Quality Language (CQL), Release 1: http://cql.hl7.org/N1

Lynn Laakso2021-05-10T21:06:01Z

New Publication: STU Release 1 of the HL7/NCPDP FHIR® Implementation Guide: Specialty Medication Enrollment, Release 1 - US Realm: http://hl7.org/fhir/us/specialty-rx/STU1.

Lynn Laakso2021-06-21T16:59:49Z

New Publication: STU Release 3 of HL7 FHIR® Implementation Guide: Data Exchange for Quality Measures STU3 for FHIR R4: http://hl7.org/fhir/us/davinci-deqm/STU3

Lynn Laakso2021-06-21T17:02:35Z

Lynn Laakso said:

New Publication: STU Release 3 of HL7 FHIR® Implementation Guide: Data Exchange for Quality Measures STU3 for FHIR R4: http://hl7.org/fhir/us/cqfmeasures/STU3

http://hl7.org/fhir/us/davinci-deqm/STU3/

Paul Denning2021-06-21T17:18:32Z

new Publication: STU Release 1 of the HL7 Immunization Decision Support Forecast (ImmDS) Implementation Guide: http://hl7.org/fhir/us/immds/STU1

Grahame Grieve2021-06-25T07:03:36Z

New Publication: STU Release 4 of the HL7 FHIR® US Core Implementation Guide STU 4 Release 4.0.0: http://hl7.org/fhir/us/core/STU4

Lynn Laakso2021-06-28T19:58:37Z

File not found ;-)

Ewout Kramer2021-06-28T20:14:50Z

well that's not supposed to happen

Lynn Laakso2021-06-28T20:18:49Z

it'll work now

Grahame Grieve2021-06-28T20:41:09Z

The change log appears to be empty? http://hl7.org/fhir/us/core/history.html

Merlyn Albery-Speyer2021-06-28T21:03:39Z

Grahame has to fix that, it'll be 12 hours

David Pyke2021-06-28T21:04:45Z

fixed

Grahame Grieve2021-06-29T12:09:15Z

New Publication: STU Update Release 1.1 of HL7 FHIR® Implementation Guide: Consumer Directed Payer Data Exchange (CARIN IG for Blue Button®), Release 1 - US Realm: http://www.hl7.org/fhir/us/carin-bb/STU1.1

Lynn Laakso2021-07-02T20:38:03Z

I don't know as it matters but the directory of published versions doesn't show this version. http://hl7.org/fhir/us/carin-bb/history.html

Daniel Venton2021-07-02T22:37:10Z

it does for me. You might have a caching problelm

Grahame Grieve2021-07-03T09:19:24Z

New Publication: STU Update Release 1.1 of HL7 FHIR® Profile: Occupational Data for Health (ODH), Release 1 - US Realm: http://hl7.org/fhir/us/odh/STU1.1

Lynn Laakso2021-07-12T18:49:27Z

New Publication: STU Release 1 of HL7 FHIR® Implementation Guide: Vital Records Common FHIR Profile Library, Release 1: http://hl7.org/fhir/us/vr-common-library/STU1

Lynn Laakso2021-10-12T13:22:26Z

New publication: STU Release 1 of HL7 FHIR® Implementation Guide: NHSN Inpatient Medication COVID-19 Administration Reports, Release 1- US Realm: http://hl7.org/fhir/us/nhsn-med-admin/STU1

Lynn Laakso2021-10-12T13:38:12Z

New Publication: STU Release 1 of HL7 FHIR® Implementation Guide: NHSN Adverse Drug Event - Hypoglycemia Report, Release 1- US Realm: http://hl7.org/fhir/us/nhsn-ade/STU1

Lynn Laakso2021-10-12T13:48:32Z

New Publication: STU Update (STU1.1) of HL7 FHIR® Implementation Guide: DaVinci Payer Data Exchange US Drug Formulary, Release 1 - US Realm: http://hl7.org/fhir/us/Davinci-drug-formulary/STU1.1

Lynn Laakso2021-10-15T16:22:22Z

New Publication: STU Publication of HL7 FHIR® Implementation Guide: Vital Records Birth and Fetal Death Reporting, Release 1 - US Realm: http://hl7.org/fhir/us/bfdr/STU1

Lynn Laakso2021-10-22T16:15:24Z

New Publication: STU Publication of HL7 FHIR® Implementation Guide: Dental Data Exchange, Release 1 - US Realm: http://hl7.org/fhir/us/dental-data-exchange/STU1

Lynn Laakso2021-11-02T16:50:06Z

New Publication: STU Publication of HL7 FHIR® Implementation Guide: Post-Acute Care Cognitive Status, Release 1- US Realm: http://hl7.org/fhir/us/pacio-cs/STU1

Lynn Laakso2021-11-04T12:43:18Z

New Publication: STU Publication of HL7 FHIR® Implementation Guide: Post-Acute Care Functional Status, Release 1- US Realm: http://hl7.org/fhir/us/pacio-fs/STU1

Lynn Laakso2021-11-04T12:43:53Z

New Publication: Release 4.0.1 of the CQF FHIR® Implementation Guide: Clinical Quality Framework Common FHIR Assets: http://fhir.org/guides/cqf/common/4.0.1/. (note: this is not a guide published through the HL7 consensus process, but according to the FHIR Community Process, so it's posted on fhir.org)

Grahame Grieve2021-11-13T00:05:42Z

STU Update Publication of HL7 FHIR® Implementation Guide: Prior-Authorization Support (PAS), Release 1- US Realm: http://hl7.org/fhir/us/davinci-pas/STU1.1

Lynn Laakso2021-12-20T23:08:26Z

STU Publication of HL7 FHIR Implementation Guide: minimal Common Oncology Data Elements (mCODE) Release 1 STU 2 – US Realm: http://hl7.org/fhir/us/mcode/STU2

Lynn Laakso2022-01-18T04:00:02Z

STU Publication of HL7 FHIR® Implementation Guide: Electronic Case Reporting (eCR), Release 2: http://hl7.org/fhir/us/ecr/STU2

Lynn Laakso2022-01-18T13:41:51Z

STU Update Publication of HL7 FHIR® Profile: Quality, Release 1 STU 4.1- US Realm: http://hl7.org/fhir/us/qicore/STU4.1

Lynn Laakso2022-01-18T16:07:03Z

STU Publication of HL7 FHIR Implementation Guide: Profiles for ICSR Transfusion and Vaccination Adverse Event Detection and Reporting, Release 1 - US Realm: www.hl7.org/fhir/us/icsr-ae-reporting/STU1

Lynn Laakso2022-01-19T14:22:38Z

Normative Publication of HL7 FHIR® Implementation Guide: FHIR Shorthand, Release 2: http://hl7.org/fhir/uv/shorthand/N1

Lynn Laakso2022-02-17T13:33:30Z

STU Publication of HL7 FHIR® Structured Data Capture (SDC) Implementation Guide, Release 3: http://hl7.org/fhir/uv/sdc/STU3

Lynn Laakso2022-03-11T23:40:04Z

STU Publication of HL7 FHIR® Implementation Guide: Clinical Data Exchange (CDex), Release 1- US Realm: http://hl7.org/fhir/us/davinci-cdex/STU1

Lynn Laakso2022-03-28T14:54:27Z

STU Publication of HL7 FHIR® Implementation Guide: Health Record Exchange (HRex) Framework, Release 1- US Realm: http://hl7.org/fhir/us/davinci-hrex/STU1

Lynn Laakso2022-03-28T15:47:11Z

STU Errata Publication of HL7 FHIR® Profile: Quality, Release 1 - US Realm STU 4.1.1: http://hl7.org/fhir/us/qicore/STU4.1.1

Lynn Laakso2022-03-31T18:27:24Z

@David Pyke and @John Moehrke are pleased to announce the release of HotBeverage #FHIR Implementation Guide release April 1st - Based on IETF RFC 2324 allows for the fulfillment of a device request for an artfully brewed caffeinated beverage. http://fhir.org/guides/acme/HotBeverage/1.4.2022

Grahame Grieve2022-04-01T12:35:36Z

STU Update Publication for HL7 FHIR® Implementation Guide: Payer Data Exchange (PDex) Payer Network, Release 1 - US Realm: http://hl7.org/fhir/us/davinci-pdex-plan-net/STU1.1

Lynn Laakso2022-04-04T19:07:50Z

STU Publication of HL7 FHIR® Implementation Guide: Quality Measures, Release 1 STU 3 - US Realm: http://hl7.org/fhir/us/cqf-measures/STU3

Lynn Laakso2022-04-28T16:11:24Z

Informative Publication of HL7 EHRS-FM Release 2.1 – Pediatric Care Health IT Functional Profile Release 1 – US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=593

Lynn Laakso2022-05-04T18:44:49Z

STU Publication of HL7 FHIR® IG: SMART Web Messaging Implementation Guide, Release 1: http://hl7.org/fhir/uv/smart-web-messaging/STU1

Lynn Laakso2022-05-06T18:36:30Z

STU Publication of HL7 FHIR® Implementation Guide: Clinical Genomics, STU 2: http://hl7.org/fhir/uv/genomics-reporting/STU2

Lynn Laakso2022-05-09T17:31:16Z

STU Publication of HL7 Domain Analysis Model: Vital Records, Release 5- US Realm: see http://www.hl7.org/implement/standards/product_brief.cfm?product_id=466

Lynn Laakso2022-05-10T14:13:57Z

STU Publication of HL7 FHIR® Implementation Guide: Personal Health Device (PHD), Release 1: http://hl7.org/fhir/uv/phd/STU1

Lynn Laakso2022-05-12T22:31:12Z

STU Publication of HL7 CDA® R2 IG: C-CDA Templates for Clinical Notes STU Companion Guide, Release 3 – US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=447

Lynn Laakso2022-05-13T13:54:18Z

STU Publication of HL7 FHIR® US Core Implementation Guide STU5 Release 5.0.0: http://hl7.org/fhir/us/core/STU5

Lynn Laakso2022-05-13T20:31:01Z

STU Update Publication of HL7 CDA® R2 Implementation Guide: National Health Care Surveys (NHCS), Release 1, STU Release 2.1 and STU Release 3.1 – US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=385

Lynn Laakso2022-05-27T19:28:07Z

STU Publication of HL7 FHIR® Implementation Guide: Risk Adjustment, Release 1 - US Realm: http://hl7.org/fhir/us/davinci-ra/STU1

Lynn Laakso2022-06-16T16:25:20Z

Informative Guidance Publication of HL7 Short Term Solution - V2: SOGI Data Exchange Profile: http://www.hl7.org/permalink/?SOGIGuidance

Lynn Laakso2022-06-22T14:24:28Z

Errata Publication of CDA® R2.1 (HL7 Clinical Document Architecture, Release 2.1): https://www.hl7.org/documentcenter/private/standards/cda/2019CDAR2_1_2022JUNerrata.zip

Lynn Laakso2022-06-22T15:24:03Z

Errata Publication of US Core STU5 Release 5.0.1: http://hl7.org/fhir/us/core/STU5.0.1

Lynn Laakso2022-06-22T20:49:57Z

STU Publication of HL7 FHIR® Implementation Guide: Digital Insurance Card, Release 1 - US Realm: http://hl7.org/fhir/us/insurance-card/STU1

Lynn Laakso2022-07-13T17:55:51Z

STU Publication of HL7 FHIR® Implementation Guide: Subscription R5 Backport, Release 1: http://hl7.org/fhir/uv/subscriptions-backport/STU1

Lynn Laakso2022-07-18T20:34:05Z

STU Update Publication of HL7 CDA® R2 Implementation Guide: Reportability Response, Release 1 STU Release 1.1- US Realm: http://www.hl7.org/implement/standards/product_brief.cfm?product_id=470

Lynn Laakso2022-07-20T01:02:02Z

STU Update Publication Request of HL7 CDA® R2 Implementation Guide: Public Health Case Report - the Electronic Initial Case Report (eICR) Release 2, STU Release 3.1 - US Realm: http://www.hl7.org/implement/standards/product_brief.cfm?product_id=436

Lynn Laakso2022-07-20T12:14:53Z

Informative Publication of HL7 FHIR® Implementation Guide: COVID-19 FHIR Clinical Profile Library, Release 1 - US Realm: http://hl7.org/fhir/us/covid19library/informative1

Lynn Laakso2022-07-25T15:20:16Z

STU Publication of HL7 CDA® R2 Implementation Guide: NHSN Healthcare Associated Infection (HAI) Reports, Release 4, STU 2 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=570

Lynn Laakso2022-07-29T15:22:04Z

STU Publication of HL7 FHIR® Implementation Guide: Clinical Data Exchange (CDex), Release 1 STU1.1.0 - US Realm: http://hl7.org/fhir/us/davinci-cdex/STU1.1

Lynn Laakso2022-08-09T15:42:38Z

STU Update Publication of HL7 FHIR Profile: Occupational Data for Health (ODH), Release 1.2: http://hl7.org/fhir/us/odh/STU1.2

Lynn Laakso2022-08-17T16:51:31Z

STU Publication of HL7 FHIR® Implementation Guide: Payer Data Exchange (PDex) Drug Formulary, Release 1 STU2 - US Realm: http://hl7.org/fhir/us/davinci-drug-formulary/STU2

Lynn Laakso2022-08-25T13:53:44Z

STU Publication of HL7 FHIR® Implementation Guide: Vital Records Death Reporting (VRDR), Release 1 STU2 - US Realm: http://hl7.org/fhir/us/vrdr/STU2

Lynn Laakso2022-08-31T16:51:59Z

STU Update Publication of HL7 FHIR® Implementation Guide: Electronic Case Reporting (eCR), Release 2.1 - US Realm: http://hl7.org/fhir/us/ecr/STU2.1

Lynn Laakso2022-08-31T18:32:16Z

R5 Ballot is published. http://hl7.org/fhir/2022Sep/

Grahame Grieve2022-09-09T23:38:34Z

STU Publication of HL7 FHIR® Implementation Guide: Vital Signs, Release 1- US Realm: http://hl7.org/fhir/us/vitals/STU1/

Lynn Laakso2022-09-12T02:04:35Z

STU Publication of HL7 Cross Paradigm Specification: CDS Hooks, Release 1: https://cds-hooks.hl7.org/2.0/

Lynn Laakso2022-09-14T21:34:01Z

New release of HL7 Terminology (THO) v4.0.0: https://terminology.hl7.org/4.0.0. (Thanks @Marc Duteau)

Grahame Grieve2022-09-17T15:35:32Z

STU Publication of HL7 FHIR® Implementation Guide: Hybrid/Intermediary Exchange, Release 1- US Realm: http://www.hl7.org/fhir/us/exchange-routing/STU1

Lynn Laakso2022-09-26T17:41:39Z

Errata publication of C-CDA (HL7 CDA® R2 Implementation Guide: Consolidated CDA Templates for Clinical Notes - US Realm): https://www.hl7.org/implement/standards/product_brief.cfm?product_id=492

Lynn Laakso2022-09-27T12:37:16Z

STU Publication of HL7 FHIR® Implementation Guide: Security for Registration, Authentication, and Authorization, Release 1- US Realm: http://hl7.org/fhir/us/udap-security/STU1/

Lynn Laakso2022-09-27T19:01:38Z

STU Publication of HL7 FHIR® Implementation Guide: FHIR for FAIR, Release 1: http://hl7.org/fhir/uv/fhir-for-fair/STU1

Lynn Laakso2022-09-28T16:44:16Z

STU Publication of HL7 FHIR® Implementation Guide: PACIO Re-assessment Timepoints, Release 1 - US Realm: http://hl7.org/fhir/us/pacio-rt/STU1

Lynn Laakso2022-09-28T16:56:20Z

STU Publication of HL7 FHIR® Implementation Guide: Medicolegal Death Investigation (MDI), Release 1 - US Realm: http://hl7.org/fhir/us/mdi/STU1

Lynn Laakso2022-09-30T20:50:44Z

STU Publication of HL7 CDA® R2 Implementation Guide: ePOLST: Portable Medical Orders About Resuscitation and Initial Treatment, Release 1 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=600

Lynn Laakso2022-10-03T14:03:40Z

STU Publication of HL7 Version 2.5.1 Implementation Guide: Laboratory Results Interface, Release 1 STU Release 4 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=279

Lynn Laakso2022-10-10T17:31:40Z

STU Publication of HL7 Version 2.5.1 Implementation Guide: Laboratory Orders (LOI) from EHR, Release 1, STU Release 4 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=152

Lynn Laakso2022-10-10T17:32:11Z

STU Publication of HL7 Version 2 Implementation Guide: Laboratory Value Set Companion Guide, Release 2- US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=413

Lynn Laakso2022-10-10T17:32:37Z

New release of HL7 Terminology (THO) v5.0.0: https://terminology.hl7.org/5.0.0

Grahame Grieve2022-11-06T21:36:04Z

This also means that the THO freeze has been lifted.

You can view the UTG tickets that were implemented in this release using the following dashboard and selecting 5.0.0 in the first pie chart. https://jira.hl7.org/secure/Dashboard.jspa?selectPageId=16115

Jessica Bota2022-11-07T12:19:34Z

Informative Publication of HL7 V2 Implementation Guide Quality Criteria, Release 1: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=608

Lynn Laakso2022-11-07T16:29:41Z

STU Publication of HL7 FHIR® Implementation Guide: SDOH Clinical Care, Release 2.0 - US Realm: http://hl7.org/fhir/us/sdoh-clinicalcare/STU2

Lynn Laakso2022-11-21T19:25:31Z

STU Update Publication of HL7 FHIR® Implementation Guide: Data Exchange for Quality Measures, STU3.1 for FHIR R4 - US Realm: http://hl7.org/fhir/us/davinci-deqm/STU3.1/

Lynn Laakso2022-11-21T22:13:53Z

STU Update Publication of HL7 FHIR® Implementation Guide: International Patient Summary, Release 1.1: http://hl7.org/fhir/uv/ips/STU1.1

Lynn Laakso2022-11-22T04:03:09Z

STU Publication of HL7 FHIR® Implementation Guide: Consumer-Directed Payer Exchange (CARIN IG for Blue Button®), Release 1 STU2: http://hl7.org/fhir/us/carin-bb/STU2

Lynn Laakso2022-11-28T16:16:57Z

STU Publication Request for HL7 Domain Analysis Model: Nutrition Care, Release 3 STU 1: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=609

Lynn Laakso2022-12-14T14:15:04Z

Errata Publication of HL7 CDA® R2 Implementation Guide: Quality Reporting Document Architecture - Category I (QRDA I) - US Realm, STU 5.3: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=35

Lynn Laakso2022-12-14T16:59:57Z

Snapshot3 of FHIR Core spec: http://hl7.org/fhir/5.0.0-snapshot3. This is published to support the Jan 2023 connectathon, and help prepare for the final publication of R5, which is still scheduled for March 2023

Grahame Grieve2022-12-15T04:18:28Z

Informative Publication of HL7 EHRS-FM R2.0.1: Usability Functional Profile, Release 1: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=611

Lynn Laakso2023-01-02T16:30:33Z

STU Publication of NHSN Healthcare Associated Infection (HAI) Reports Long Term Care Facilities (HAI-LTCF-FHIR), Release 1 - US Realm: http://hl7.org/fhir/us/hai-ltcf/STU1

Lynn Laakso2023-01-10T21:20:33Z

STU Update Publication of HL7 FHIR® Implementation Guide: Subscription R5 Backport, Release 1, STU 1.1: http://hl7.org/fhir/uv/subscriptions-backport/STU1.1/

Lynn Laakso2023-01-11T14:23:11Z

New release of HL7 Terminology (THO) v5.1.0: https://terminology.hl7.org/5.1.0

Lynn Laakso2023-02-28T16:17:20Z

The Final Draft version of FHIR R5 is now published for QA : http://hl7.org/fhir/5.0.0-draft-final. There's a two week period to do QA on it. In particular, we'd like to focus on the invariants - there'll be another announcement about that shortly

Grahame Grieve2023-03-02T02:34:33Z

STU Update Publication of minimal Common Oncology Data Elements (mCODE) Implementation Guide 2.1.0 - STU 2.1: http://hl7.org/fhir/us/mcode/STU2.1/

Lynn Laakso2023-03-20T21:01:37Z

STU Update Publication of HL7 FHIR Profile: Occupational Data for Health (ODH), Release 1.3: https://hl7.org/fhir/us/odh/STU1.3/

Lynn Laakso2023-03-22T12:32:55Z

STU Publication of HL7 FHIR® Implementation Guide: Clinical Data Exchange (CDex), Release 1 STU 2 - US Realm: http://hl7.org/fhir/us/davinci-cdex/STU2/

Lynn Laakso2023-03-22T12:56:11Z

STU Update Publication of HL7 FHIR® Implementation Guide: Vital Records Death Reporting (VRDR), Release 1 STU2.1 - US Realm: https://hl7.org/fhir/us/vrdr/STU2.1/

Lynn Laakso2023-03-25T16:39:46Z

I have started publishing R5. Unlike the IGs, R5 is rather a big upload - it will take me a couple of days. In the meantime, you might find discontinuities and broken links on the site, and confusion between R4 and R5 as bits are copied up. Also you may find missing and broken redirects too. I will make another announcement once it's all uploaded

Grahame Grieve2023-03-26T10:57:30Z

STU Publication of HL7 FHIR® Implementation Guide: International Patient Access (IPA), Release 1: http://hl7.org/fhir/uv/ipa/STU1

Lynn Laakso2023-03-26T22:48:30Z

STU Publication of HL7 FHIR® Implementation Guide: Longitudinal Maternal & Infant Health Information for Research, Release 1 - US Realm: http://hl7.org/fhir/us/mihr/STU1/

Lynn Laakso2023-03-29T19:47:59Z

STU Publication of HL7 FHIR® Implementation Guide: Patient Cost Transparency, Release 1 - US Realm: http://hl7.org/fhir/us/davinci-pct/STU1

Lynn Laakso2023-03-30T17:53:10Z

STU Publication of HL7 FHIR® Profile: Quality, Release 1 - US Realm (qicore) STU Release 5: http://hl7.org/fhir/us/qicore/STU5

Lynn Laakso2023-04-04T14:39:17Z

Normative Publication of HL7 CDA® R2 Implementation Guide: Emergency Medical Services; Patient Care Report Release 3 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=438

Lynn Laakso2023-04-11T16:55:44Z

STU Publication of HL7 Consumer Mobile Health Application Functional Framework (cMHAFF), Release 1, STU 2: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=476

Lynn Laakso2023-04-17T18:12:56Z

STU Publication of HL7 FHIR® Implementation Guide: Data Segmentation for Privacy (DS4P), Release 1: http://hl7.org/fhir/uv/security-label-ds4p/STU1

Lynn Laakso2023-04-17T19:48:57Z

STU Publication of HL7 FHIR® IG: SMART Application Launch Framework, Release 2.1: http://hl7.org/fhir/smart-app-launch/STU2.1

Lynn Laakso2023-04-18T13:57:53Z

STU Publication of HL7 Version 2 Implementation Guide: Diagnostic Audiology Reporting, Release 1- US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=620

Lynn Laakso2023-04-18T16:17:13Z

STU Publication of HL7 FHIR® R4 Implementation Guide: Clinical Study Schedule of Activities, Edition 1: http://hl7.org/fhir/uv/vulcan-schedule/STU1/

Lynn Laakso2023-04-18T16:55:17Z

STU Update Publication of HL7 FHIR® Implementation Guide: NHSN Healthcare Associated Infection (HAI) Reports for Long Term Care Facilities (HAI-LTCF-FHIR), Release 1 STU 1.1 - US Realm: http://hl7.org/fhir/us/hai-ltcf/STU1.1

Lynn Laakso2023-04-19T15:19:28Z

STU Publication of HL7 CDA® R2 Implementation Guide: Personal Advance Care Plan (PACP) Document, Edition 1, STU3 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=434

Lynn Laakso2023-04-19T16:57:28Z

STU Publication of HL7 CDA® R2 Implementation Guide: Pharmacy Templates, Edition 1 STU Release 2: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=514

Lynn Laakso2023-04-20T13:08:15Z

STU Publication of HL7 FHIR® R4 Implementation Guide: Single Institutional Review Board Project (sIRB), Edition 1- US Realm: http://hl7.org/fhir/us/sirb/STU1

Lynn Laakso2023-04-20T14:08:06Z

STU Publication of HL7 CDA® R2 Implementation Guide: C-CDA Templates for Clinical Notes STU Companion Guide Release 4 - US Realm Standard for Trial Use May 2023: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=447

Lynn Laakso2023-05-03T18:10:31Z

STU Publication of HL7 FHIR® US Core Implementation Guide STU6 Release 6.0.0: http://hl7.org/fhir/us/core/STU6

Lynn Laakso2023-05-03T23:13:22Z

STU Publication of HL7/NCPDP FHIR® Implementation Guide: Specialty Medication Enrollment, Release 1 STU 2 - US Realm: http://hl7.org/fhir/us/specialty-rx/STU2/

Lynn Laakso2023-05-04T14:59:11Z

STU Publication of Vulcan's HL7 FHIR® Implementation Guide: Retrieval of Real World Data for Clinical Research STU 1 - UV Realm: http://hl7.org/fhir/uv/vulcan-rwd/STU1

Grahame Grieve2023-05-26T21:25:05Z

Version 6.1.0-snapshot1 of US Core for public review of forth coming STU update to STU6 - US Realm: http://hl7.org/fhir/us/core/STU6.1-snapshot1

Grahame Grieve2023-05-27T13:35:36Z

STU Publication of HL7 FHIR® Implementation Guide: Military Service History and Status, Release 1 - US Realm: http://hl7.org/fhir/us/military-service/STU1

Lynn Laakso2023-05-30T15:42:35Z

STU Publication of HL7 FHIR® Implementation Guide: Identity Matching, Release 1 - US Realm: http://hl7.org/fhir/us/identity-matching/STU1

Lynn Laakso2023-06-02T03:15:37Z

STU Publication of HL7 FHIR® Implementation Guide: Making Electronic Data More Available for Research and Public Health (MedMorph) Reference Architecture, Release 1- US Realm: http://hl7.org/fhir/us/medmorph/STU1/

Lynn Laakso2023-06-08T19:37:06Z

STU Update Publication of HL7 CDA® R2 Implementation Guide: National Healthcare Safety Network (NHSN) Healthcare Associated Infection (HAI) Reports for Long Term Care Facilities (HAI-LTCF-CDA), Release 1, STU 1.1 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=546

Lynn Laakso2023-06-20T15:37:05Z

STU Update Publication of HL7 CDA® R2 Implementation Guide: C-CDA Templates for Clinical Notes Companion Guide, Release 4.1 STU - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=447

Lynn Laakso2023-06-29T19:01:57Z

STU Update Publication of HL7 FHIR® US Core Implementation Guide STU6 Release 6.1.0: http://hl7.org/fhir/us/core/STU6.1

Lynn Laakso2023-06-30T16:03:36Z

STU Publication of HL7 FHIR® Implementation Guide: Cancer Electronic Pathology Reporting, Release 1 - US Realm: https://hl7.org/fhir/us/cancer-reporting/STU1

Lynn Laakso2023-07-11T16:17:33Z

STU Publication of HL7 FHIR Implementation Guide: Electronic Medicinal Product Information, Release 1: http://hl7.org/fhir/uv/emedicinal-product-info/STU1

Lynn Laakso2023-07-26T14:14:50Z

Unballoted STU Update Publication of HL7 FHIR® Implementation Guide: SDOH Clinical Care, Release 2.1 - US Realm: http://hl7.org/fhir/us/sdoh-clinicalcare/STU2.1

Lynn Laakso2023-07-27T21:45:15Z

STU Publication of HL7 FHIR® Implementation Guide: CodeX™ Radiation Therapy, Release 1- US Realm: http://hl7.org/fhir/us/codex-radiation-therapy/STU1

Lynn Laakso2023-07-28T14:39:55Z

STU Publication of HL7 FHIR® Implementation Guide: US Public Health Profiles Library, Release 1 - US Realm: http://hl7.org/fhir/us/ph-library/STU1

Lynn Laakso2023-08-17T15:49:02Z

STU Publication of HL7 FHIR® Implementation Guide: ICHOM Patient Centered Outcomes Measure Set for Breast Cancer, Edition 1: http://hl7.org/fhir/uv/ichom-breast-cancer/STU1

Lynn Laakso2023-08-21T18:16:16Z

STU Publication of HL7 FHIR® Implementation Guide: Health Care Surveys Content, Release 1 - US Realm: http://hl7.org/fhir/us/health-care-surveys-reporting/STU1

Lynn Laakso2023-08-22T19:58:30Z

STU Publication of HL7 FHIR® Implementation Guide: Physical Activity, Release 1 - US Realm: http://hl7.org/fhir/us/physical-activity/STU1

Lynn Laakso2023-08-25T17:05:59Z

STU Publication of HL7 FHIR® Implementation Guide: Quality Measures, Release 1 STU4 - US Realm: http://hl7.org/fhir/us/cqfmeasures/STU4

Lynn Laakso2023-08-28T21:44:05Z

Unballoted STU Update Publication of HL7 FHIR® Implementation Guide: Healthcare Associated Infection Reports, Release 1, STU 2.1 —US Realm: http://hl7.org/fhir/us/hai/STU2.1

Lynn Laakso2023-09-06T21:05:51Z

STU Publication of HL7 Cross Paradigm Specification: Health Services Reference Architecture (HL7-HSRA), Edition 1:https://www.hl7.org/implement/standards/product_brief.cfm?product_id=632

Lynn Laakso2023-09-07T15:52:34Z

Errata publication of HL7 CDA® R2 Attachment Implementation Guide: Exchange of C-CDA Based Documents, Release 2 US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=464

Lynn Laakso2023-09-12T21:25:45Z

Informative Publication of HL7 EHR-S FM R2.1 Functional Profile: Problem-Oriented Health Record (POHR) for Problem List Management (PLM), Edition 1: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=630

Lynn Laakso2023-09-15T18:52:14Z

STU Publication of HL7 CDA R2 Implementation Guide: Gender Harmony - Sex and Gender representation, Edition 1 - Component of: HL7 Cross-Paradigm Implementation Guide: Gender Harmony - Sex and Gender representation, Edition 1: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=633

Lynn Laakso2023-09-28T14:26:58Z

Informative Publication of HL7 Cross-paradigm Implementation Guide: Gender Harmony - Sex and Gender Representation, Edition 1: http://hl7.org/xprod/ig/uv/gender-harmony/informative1

Lynn Laakso2023-09-29T14:03:31Z

STU Publication of HL7 FHIR® Implementation Guide: Data Exchange for Quality Measures, Edition 1 STU4 - US Realm: http://hl7.org/fhir/us/davinci-deqm/STU4

Lynn Laakso2023-10-03T20:10:47Z

STU Publication of HL7 FHIR® Implementation Guide: Human Services Directory, Release 1 - US Realm: http://hl7.org/fhir/us/hsds/STU1

Lynn Laakso2023-10-04T19:24:06Z

STU Update Publication of HL7 CDA® R2 Implementation Guide: NHSN Healthcare Associated Infection (HAI) Reports, Release 4, STU 2.1 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=570

Lynn Laakso2023-10-05T15:39:01Z

STU Update Publication of HL7 FHIR® Implementation Guide: Vital Records Common FHIR Profile Library R1.1: http://hl7.org/fhir/us/vr-common-library/STU1.1

Lynn Laakso2023-10-06T14:31:57Z

Errata:

I wrong wrote:

STU Publication of HL7 Cross-Product Implementation Guide: HL7 Cross Paradigm Implementation Guide: Gender Harmony - Sex and Gender Representation, Edition 1: http://hl7.org/xprod/ig/uv/gender-harmony/

This was a copy paste error on my part, sorry. This is an informative publication, not a trial-use publication

Grahame Grieve2023-10-08T22:26:31Z

STU Update Publication of HL7 FHIR® Implementation Guide: Vital Records Birth and Fetal Death Reporting, Release 1.1: http://hl7.org/fhir/us/bfdr/STU1.1

Lynn Laakso2023-10-10T14:55:34Z

STU Update Publication of Vital Records Death Reporting FHIR Implementation Guide, STU2.2 - US Realm: http://hl7.org/fhir/us/vrdr/STU2.2

Lynn Laakso2023-10-17T20:10:19Z

STU Publication of HL7 FHIR® Implementation Guide: Coverage Requirements Discovery, Edition 2 - US Realm: http://hl7.org/fhir/us/davinci-crd/STU2

Lynn Laakso2023-10-20T15:05:20Z

STU Publication of HL7 FHIR Implementation Guide: minimal Common Oncology Data Elements (mCODE) Release 1 STU 3 - US Realm: http://hl7.org/fhir/us/mcode/STU3

Lynn Laakso2023-10-26T01:08:19Z

STU Publication of HL7 FHIR® Implementation Guide: Documentation Templates and Rules, Edition 2 - US Realm: http://hl7.org/fhir/us/davinci-dtr/STU2

Lynn Laakso2023-11-07T14:12:36Z

STU Update Publication of HL7 CDA R2 Implementation Guide: Personal Advance Care Plan (PACP), Edition 1 STU 3.1 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=434

Lynn Laakso2023-11-08T16:46:05Z

STU Publication of HL7 FHIR® Implementation Guide: Protocols for Clinical Registry Extraction and Data Submission (CREDS), Release 1 - US Realm: http://hl7.org/fhir/us/registry-protocols/STU1

Lynn Laakso2023-11-14T19:36:16Z

Informative Publication of HL7 Informative Document: Patient Contributed Data, Edition 1: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=638

Lynn Laakso2023-11-16T14:55:22Z

STU Update Publication of HL7 FHIR® Implementation Guide: Medicolegal Death Investigation (MDI), Release 1.1 - US Realm: http://hl7.org/fhir/us/mdi/STU1.1

Lynn Laakso2023-11-16T22:45:57Z

STU Publication of HL7 FHIR® Implementation Guide: Prior-Authorization Support (PAS), Edition 2 - US Realm: http://hl7.org/fhir/us/davinci-pas/STU2

Lynn Laakso2023-11-21T19:02:44Z

FHIR Foundation Publication: HRSA 2023 Uniform Data System (UDS) Patient Level Submission (PLS) (UDS+) FHIR IG, Release 1- see http://fhir.org/guides/hrsa/uds-plus/

Grahame Grieve2023-12-01T09:43:09Z

HL7 DK Publication: DK Core version 3.0 is now published at https://hl7.dk/fhir/core/index.html

Grahame Grieve2023-12-04T13:26:36Z

STU Publication of Health Level Seven Arden Syntax for Medical Logic Systems, Edition 3.0: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=639

Lynn Laakso2023-12-11T20:17:20Z

STU Publication of HL7 FHIR® Implementation Guide: Integrating the Healthcare Enterprise (IHE) Structured Data Capture/electronic Cancer Protocols on FHIR, Release 1- US Realm: http://hl7.org/fhir/uv/ihe-sdc-ecc/STU1

Lynn Laakso2023-12-12T22:26:57Z

1st Draft Ballot of HL7 FHIR® R6: http://hl7.org/fhir/6.0.0-ballot1

Grahame Grieve2023-12-18T18:16:51Z

Release of HL7 FHIR® Tooling IG (International): http://hl7.org/fhir/tools/0.1.0

Grahame Grieve2023-12-19T01:45:37Z

Ballot for the next versions of the FHIR Extensions Pack (5.1.0-ballot1): http://hl7.org/fhir/extensions/5.1.0-ballot/

Grahame Grieve2023-12-19T04:16:09Z
Grahame Grieve2023-12-20T22:58:16Z

This is a particularly important milestone for the publishing process. Quoting from the specification itself:

Within HL7, since 2020, an initiative to develop the same underlying publication process tech stack across all HL7 standards has been underway. The intent is to provide the same look and feel, to leverage inherent validation and versioning, to ease annual updates, and to avoid the unwieldy word and pdf publication process. This publication of C-CDA R3.0 is the realization of that intent for the CDA product family.

Many people have contributed to this over a number of years, and while I'm hesitant to call attention to any particular individuals because of the certainty of missing some others who also deserve it, it would not have got across the line without a significant contribution from @Benjamin Flessner

Grahame Grieve2023-12-20T23:00:33Z

Informative Publication of HL7 FHIR® Implementation Guide: Record Lifecycle Events (RLE), Edition 1: http://hl7.org/fhir/uv/ehrs-rle/Informative1

Lynn Laakso2024-01-02T22:24:23Z

STU Update Publication of HL7 FHIR® Implementation Guide: Patient Cost Transparency, Release 1 - US Realm: http://hl7.org/fhir/us/davinci-pct/STU1.1

Lynn Laakso2024-01-03T19:03:37Z

STU Publication of HL7 FHIR® Implementation Guide: PACIO Personal Functioning and Engagement, Release 1 - US Realm: http://hl7.org/fhir/us/pacio-pfe/STU1

Lynn Laakso2024-01-05T17:47:05Z

STU Publication of HL7 FHIR® Implementation Guide: Payer Data Exchange (PDex), Release 2 - US Realm: http://hl7.org/fhir/us/davinci-pdex/STU2

Lynn Laakso2024-01-06T03:49:11Z

STU Publication of HL7 FHIR® Implementation Guide: Member Attribution List, Edition 2- US Realm: http://hl7.org/fhir/us/davinci-atr/STU2

Lynn Laakso2024-01-09T21:21:44Z

STU Publication of HL7 FHIR® Implementation Guide: PACIO Advance Directive Interoperability, Edition 1 - US Realm: http://hl7.org/fhir/us/pacio-adi/STU1

Lynn Laakso2024-01-11T18:47:32Z

STU Publication of HL7 FHIR® R4 Implementation Guide: QI-Core, Edition 1.6 - US Realm: http://hl7.org/fhir/us/qicore/STU6

Lynn Laakso2024-03-01T20:33:38Z

STU Update Publication of HL7 CDA® R2 Implementation Guide: NHSN Healthcare Associated Infection (HAI) Reports, Release 4, STU 2.2 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=570

Lynn Laakso2024-03-06T15:10:55Z

Interim Snapshot 5.1.0-snapshot1 of the Extensions package (hl7.fhir.yv.extensions#5.1.0-snapshot1) has been published to support publication requests waiting for a new release of the extensions package @ http://hl7.org/fhir/extensions/5.1.0-snapshot1/

Grahame Grieve2024-03-12T13:30:16Z

STU Publication of HL7 FHIR® Implementation Guide: C-CDA on FHIR, STU 1.2.0 - US Realm: http://hl7.org/fhir/us/ccda/STU1.2

Lynn Laakso2024-03-12T20:34:03Z

STU Update Publication of HL7 CDA® R2 Implementation Guide: National Healthcare Safety Network (NHSN) Healthcare Associated Infection (HAI) Reports for Long Term Care Facilities (HAI-LTCF-CDA), Release 1, STU 1.2 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=546

Lynn Laakso2024-03-13T16:19:13Z

STU Publication of HL7 CDS Hooks: Hook Library, Edition 1: https://cds-hooks.hl7.org/

Lynn Laakso2024-03-22T14:11:14Z

STU Publication ofHL7 FHIR® R5 Implementation Guide: Adverse Event Clinical Research, Edition 1: http://hl7.org/fhir/uv/ae-research-ig/STU1

Lynn Laakso2024-04-16T13:27:32Z

STU Update Publication of HL7 FHIR® Implementation Guide: Digital Insurance Card, Release 1 - US Realm: http://hl7.org/fhir/us/insurance-card/STU1.1/

Lynn Laakso2024-04-16T18:22:39Z

STU Publication of HL7 FHIR® R4 Implementation Guide: Adverse Event Clinical Research R4 Backport, Edition 1: http://hl7.org/fhir/uv/ae-research-backport-ig/STU1

Lynn Laakso2024-04-17T13:55:42Z

STU Update Publication of HL7 FHIR® Implementation Guide: Central Cancer Registry Reporting Content IG, Edition 1- US Realm: https://hl7.org/fhir/us/cancer-reporting/STU1.0.1

Lynn Laakso2024-04-17T14:48:53Z

STU Publication of HL7 FHIR® Implementation Guide: SMART Application Launch Framework, Release 2.2: http://hl7.org/fhir/smart-app-launch/STU2.2

Lynn Laakso2024-04-30T19:53:57Z

STU Publication of HL7 FHIR® Implementation Guide: Pharmaceutical Quality (Industry), Edition 1: http://hl7.org/fhir/uv/pharm-quality/STU1

Lynn Laakso2024-05-08T14:47:17Z

STU Publication of HL7 FHIR® US Core Implementation Guide STU 7 Release 7.0.0 - US Realm: http://hl7.org/fhir/us/core/STU7

Lynn Laakso2024-05-08T19:23:09Z

STU Publication of HL7 Version 2.5.1 Implementation Guide: Laboratory Orders from EHR (LOI) Edition 5 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=152

Lynn Laakso2024-05-16T12:42:29Z

STU Publication of HL7 Version 2.5.1 Implementation Guide: Laboratory Results Interface (LRI), Edition 5 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=279

Lynn Laakso2024-05-16T18:04:41Z

Ok, a significant milestone has been reached with two new publications:

Grahame Grieve2024-05-18T09:30:26Z

STU Publication of the HL7 FHIR® R4 Implementation Guide: Electronic Long-Term Services and Supports (eLTSS) Edition 1 STU2 - US Realm: http://hl7.org/fhir/us/eltss/STU2

Lynn Laakso2024-05-27T03:23:58Z

STU Publication of HL7 CDA® R2 Implementation Guide: NHSN Healthcare Associated Infection (HAI) Reports for Antimicrobial Use in Long Term Care Facilities (AULTC), Edition 1.0, STU1 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=646

Lynn Laakso2024-05-30T15:16:25Z

STU Publication of HL7 FHIR® Implementation Guide: Central Cancer Registry Reporting Content IG, Edition 1- US Realm: http://hl7.org/fhir/us/central-cancer-registry-reporting/STU1

Lynn Laakso2024-05-31T13:43:04Z

STU Publication of HL7 FHIR® Implementation Guide: Using CQL With FHIR, Edition 1: http://hl7.org/fhir/uv/cql/STU1

Lynn Laakso2024-05-31T14:50:04Z

STU Publication of HL7 FHIR® Implementation Guide: Canonical Resource Management Infrastructure (CRMI), Edition 1: http://hl7.org/fhir/uv/crmi/STU1

Lynn Laakso2024-05-31T17:38:43Z

STU Publication of HL7 FHIR® Implementation Guide: Value Based Performance Reporting (VBPR), Edition 1 - US Realm: http://hl7.org/fhir/us/davinci-vbpr/STU1

Lynn Laakso2024-06-17T14:41:45Z

STU Update Publication of HL7 FHIR® R4 Implementation Guide: At-Home In-Vitro Test Report, Edition 1.1: http://hl7.org/fhir/us/home-lab-report/STU1.1

Lynn Laakso2024-08-08T20:18:04Z

STU Publication of MCC eCare Plan Implementation Guide, Edition 1 - US Realm: http://hl7.org/fhir/us/mcc/STU1

Lynn Laakso2024-08-13T21:53:26Z

Normative Reaffirmation Publication of HL7 Version 3 Standard: Event Publish & Subscribe Service Interface, Release 1 - US Realm and HL7 Version 3 Standard: Unified Communication Service Interface, Release 1 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=390 or https://www.hl7.org/implement/standards/product_brief.cfm?product_id=388

Lynn Laakso2024-08-14T13:01:47Z

Normative Reaffirmation Publication of HL7 Version 3 Standard: Regulated Studies - Annotated ECG, Release 1: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=70

Lynn Laakso2024-08-14T13:03:25Z

Normative Reaffirmation Publication of Health Level Seven Arden Syntax for Medical Logic Systems, Version 2.10: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=372

Lynn Laakso2024-08-14T13:05:00Z

Normative Reaffirmation Publication of HL7 Healthcare Privacy and Security Classification System, Release 1: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=345

Lynn Laakso2024-08-14T14:41:28Z

Normative Reaffirmation Publication of HL7 EHR Clinical Research Functional Profile, Release 1: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=16

Lynn Laakso2024-08-14T16:30:33Z

Normative Reaffirmation Publication of HL7 EHR Child Health Functional Profile, Release 1: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=15

Lynn Laakso2024-08-14T16:31:49Z

Normative Reaffirmation Publication of HL7 Version 3 Standard: XML Implementation Technology Specification - Wire Format Compatible Release 1 Data Types, Release 1 and HL7 Version 3 Standard: XML Implementation Technology Specification - V3 Structures for Wire Format Compatible Release 1 Data Types, Release 1: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=357 and https://www.hl7.org/implement/standards/product_brief.cfm?product_id=358

Lynn Laakso2024-08-14T17:29:34Z

Normative Reaffirmation Publication of HL7 Version 3 Standard: Privacy, Access and Security Services; Security Labeling Service, Release 1: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=360

Lynn Laakso2024-08-14T18:06:33Z

Reaffirmation Publication of HL7 Version 3 Implementation Guide: Context-Aware Knowledge Retrieval Application (Infobutton), Release 4: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=22

Lynn Laakso2024-08-15T13:57:21Z

Normative Publication of HL7 FHIR® Implementation Guide: FHIR Shorthand, Edition 3.0.0: http://hl7.org/fhir/uv/shorthand/N2

Lynn Laakso2024-08-19T16:36:13Z

STU Publication Request for HL7 FHIR® Implementation Guide: Medication Risk Evaluation and Mitigation Strategies (REMS), Edition 1- US Realm: http://hl7.org/fhir/us/medication-rems/STU1

Lynn Laakso2024-08-19T20:34:59Z

Normative Reaffirmation Publication of HL7 Cross-Paradigm Specification: FHIRPath, Release 1: http://hl7.org/FHIRPath/N2

Lynn Laakso2024-08-21T12:55:58Z

STU Update Publication of HL7 FHIR® Implementation Guide: Security for Registration, Authentication, and Authorization (FAST), Edition 1 - US Realm: http://hl7.org/fhir/us/udap-security/STU1.1

Lynn Laakso2024-08-21T13:44:33Z

Informative Publication of HL7 Guidance: AI/ML Data Lifecycle, Edition 1 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=658

Lynn Laakso2024-08-27T15:07:02Z

Unballoted STU Update of HL7 FHIR® Implementation Guide: SDOH Clinical Care, Release 2.2 - US Realm: http://hl7.org/fhir/us/sdoh-clinicalcare/STU2.2

Lynn Laakso2024-08-27T18:01:53Z

Normative Publication of HL7 Clinical Document Architecture R2.0 Specification Online Navigation, Edition 2024: https://hl7.org/cda/stds/online-navigation/index.html

Lynn Laakso2024-08-28T22:29:16Z

Normative Publication of Health Level Standard Standard Version 2.9.1 - An Application Protocol for Electronic Data Exchange in Healthcare Environments: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=649

Lynn Laakso2024-09-06T17:58:13Z

STU Publication of HL7 FHIR® Implementation Guide: Vital Records Common Library, Edition 2 - US Realm: http://hl7.org/fhir/us/vr-common-library/STU2

Lynn Laakso2024-10-11T19:44:45Z

Normative Retirement Publication of HL7 V3 Patient Registry R1, Person Registry R1, Personnel Management R1 and Scheduling R2: Patient Registry, Person Registry, Personnel Management and Scheduling.

Lynn Laakso2024-10-14T16:53:32Z

STU Publication of HL7 FHIR® Implementation Guide: Vital Records Birth and Fetal Death Reporting, Edition 2 - US Realm: http://hl7.org/fhir/us/bfdr/STU2

Lynn Laakso2024-10-15T18:03:55Z

STU Publication of HL7 FHIR® Implementation Guide: Prescription Drug Monitoring Program (PDMP), Edition 1 - US Realm: http://hl7.org/fhir/us/pdmp/STU1

Lynn Laakso2024-10-15T19:03:27Z

Normative Retirement Publication of HL7 Version 3 Standard: Security and Privacy Ontology, Release 1: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=348

Lynn Laakso2024-10-16T13:23:37Z

STU Publication of HL7 FHIR® Implementation Guide: Vital Records Death Reporting (VRDR), Edition 3 - US Realm: http://hl7.org/fhir/us/vrdr/STU3

Lynn Laakso2024-10-16T20:38:57Z

STU Update Publication of HL7 FHIR® Implementation Guide: Personal Health Device (PHD), Release 1.1: http://hl7.org/fhir/uv/phd/STU1.1

Lynn Laakso2024-10-18T14:51:31Z
tx.fhir.org
#terminology
The discussion revolves around the accessibility issues facing the terminology server tx.fhir.org, with multiple participants reporting connectivity problems while Grahame Grieve works on restarting the server. Additionally, there are inquiries regarding how to properly configure and operate local copies of tx.fhir.org for specific use cases and terminology validations, with participants seeking clarification on loading terminologies and troubleshooting access errors.
99 comments
ML
JM
DO
SM
DH
CM

tx.fhir.org is not responding

John Moehrke2023-05-01T12:56:52Z

working for me

Grahame Grieve2023-05-01T13:10:43Z

trying again. thanks

John Moehrke2023-05-01T13:16:55Z

Is tx.fhir.org down? I don't seem to be able to reach it.

Dave Hill2023-06-01T13:27:07Z

it is. restarted it

Grahame Grieve2023-06-01T13:32:38Z

Still down?

Terminology server http://tx.fhir.orgException in thread "main" org.hl7.fhir.exceptions.FHIRException: Unable to connect to
terminology server. Use parameter '-tx n/a' to run without using terminology services to validate LOINC, SNOMED, ICD-X etc. Error = Error fetching the server's capability statement: Connect timed out
Bart Decuypere2023-06-01T13:56:16Z

It appears to still be down for me as well

Max Masnick2023-06-01T15:52:51Z

back

Grahame Grieve2023-06-01T16:23:21Z

tx.fhir.org appears to be down. I'm checking if I can restart it; @Grahame Grieve

David Otasek2023-06-08T15:24:58Z

I'm restarting it

Grahame Grieve2023-06-08T15:26:27Z

tx.fhir.org seems to be down again.

Chris Moesel2023-06-10T15:47:53Z

I'll check it now.

Rob Hausam2023-06-10T16:05:11Z

Hmm. The server itself appears to be offline. I can't get a remote connection to it - and without that, I can't do anything. I think this probably will require @Grahame Grieve or @David Otasek or @Mark Iantorno to restart the server VM instance.
@Chris Moesel

Rob Hausam2023-06-10T16:12:27Z

Thanks for trying, @Rob Hausam!

Chris Moesel2023-06-10T16:19:23Z

@Grahame Grieve appears to be online now.

Rob Hausam2023-06-10T16:20:28Z

Nah. Phone only. I’ll have a look when I get back to the hotel in a few hours

Grahame Grieve2023-06-10T16:21:19Z
Grahame Grieve2023-06-10T16:21:52Z

Is the server still down? Or is there something else going on...

Bart Decuypere2023-06-16T08:52:39Z

Bad gateway 502 at tx.fhir.org

Bart Decuypere2023-06-21T08:55:01Z

yup. working on it

Grahame Grieve2023-06-21T08:56:21Z

back

Grahame Grieve2023-06-21T09:04:39Z

I'm getting 502s when trying to connect to tx.fhir.org.

Stephen MacVicar2023-07-12T14:01:43Z

Seems to be responsive now?

Lloyd McKenzie2023-07-12T17:13:18Z

Yeah, it's back for me.

Stephen MacVicar2023-07-12T17:40:16Z

tx or tho might not be fully populated?

A definition for CodeSystem 'http://terminology.hl7.org/CodeSystem/icd9cm' could not be found, so the code cannot be validated

John Moehrke2024-02-28T19:41:51Z

that's because you should be using http://hl7.org/fhir/sid/icd-9-cm

Grahame Grieve2024-02-28T20:09:15Z

Ill change, but I didn't see that before

John Moehrke2024-02-28T20:09:52Z

did you consider looking in THO? https://terminology.hl7.org/ICD.html

Grahame Grieve2024-02-28T20:12:04Z

im sure I found it somewhere before. I would not have known to use terminology.hl7.org at all.

John Moehrke2024-02-28T20:12:44Z

what would you know to use? How do we get people to look in the right place? Where else would you look?

Grahame Grieve2024-02-28T20:13:26Z

I note I fixed this in a different IG back in January. so I guess I have been chastised more than once now

John Moehrke2024-02-28T20:14:28Z

I better go look at my other IGs.

John Moehrke2024-02-28T20:14:44Z

the IG Publisher seems to be getting a new response from tx.fhir.org on codeSystems that are not in tx.fhir org. For example with a inaccessible codeSystem (propritary) I am now getting an ERROR vs the WARNING that I used to be able to put into ignorewarnings.txt

Error reading Http Response from http://tx.fhir.org/r4: Error parsing JSON source: Unexpected char '<' in json stream at Line 1 (path=[null])

John Moehrke2024-02-28T20:16:49Z

clear your txcache

Grahame Grieve2024-02-28T20:18:00Z

yup... :-( sorry

John Moehrke2024-02-28T20:21:35Z

restarting the server again to deal with what was seen in the last crash

Grahame Grieve2024-02-29T01:51:00Z

back

Grahame Grieve2024-02-29T01:54:33Z

Grahame Grieve said:

what would you know to use? How do we get people to look in the right place? Where else would you look?

It would be really nice if the old links like http://hl7.org/fhir/icd.html, http://hl7.org/fhir/R4/icd.html, http://hl7.org/fhir/R4/snomed.html redirected to the new less-memorable places at THO

Michael Lawley2024-02-29T04:01:31Z

do you have a full list?

Grahame Grieve2024-02-29T04:12:19Z

(no, but for the partial list, I'd love id https://build.fhir.org/snomedct-usage.html could link prominently to https://terminology.hl7.org/SNOMEDCT.html)

Josh Mandel2024-02-29T04:13:51Z

you can make a PR to do that one

Grahame Grieve2024-02-29T04:14:25Z
Josh Mandel2024-02-29T04:14:33Z

https://hl7.org/fhir/R4/terminologies-systems.html#4.3.0 The comment column of the table of external vocabularies seems like a good sourcw of the special purpose pages we used to have

Josh Mandel2024-02-29T04:15:17Z

I can also make a list of the pages that do exist, but changing any of them is a pretty big deal - a technical correction.

Grahame Grieve2024-02-29T04:16:19Z

the pages that don't exist anymore, that i can just fix, but that's what I wondered if there was a list

Grahame Grieve2024-02-29T04:16:37Z

Yeah, the /R4/ ones I think are fine, because they are fixed to the FHIR version. Rather it's the unversioned ones from exactly that column

Michael Lawley2024-02-29T04:19:09Z

well, technically, they are fixed to R5

Grahame Grieve2024-02-29T04:20:39Z

The ones that used to exist and are listed in that table at /fhir/r4 and don't exist in / ... those URLs should be added as redirects in /fhir

Josh Mandel2024-02-29T04:22:57Z

:point_up: I mean http://hl7.org/fhir/R4/icd.html should not change, but http://hl7.org/fhir/icd.html should redirect to https://terminology.hl7.org/ICD.html rather than giving a 404
If you were feeling generous, then yes, http://hl7.org/fhir/R5/icd.html could also redirect to https://terminology.hl7.org/ICD.html

Michael Lawley2024-02-29T04:24:16Z

the server is restarting again to fix an issue with R2 support

Grahame Grieve2024-02-29T12:04:51Z

26 messages were moved here from #committers/announce > tx.fhir.org by David Pyke.

Notification Bot2024-02-29T16:26:00Z

ok @Michael Lawley I think they do now

Grahame Grieve2024-03-07T13:07:21Z

I feel like I should know this, but what are the intended terms of use for tx.fhir.org? Is it intended only for testing and supporting things like IG builds, or for more than that (production use-cases)?

Craig McClendon2024-04-12T17:02:38Z

@Grahame Grieve

Lloyd McKenzie2024-04-12T17:13:06Z

testing, validation, IG publication. It's not for supporting unit testing or production usage. The terms of service include that I can take it down at any time without warning (and that it can do that to itself :sad:)

Grahame Grieve2024-04-12T19:00:28Z

Would production usage that subscribes to changes to code systems or value sets to update a different production tx server be reasonable?

Lloyd McKenzie2024-04-12T20:01:09Z

(With allowance for the fact that it's only a "moderately availabile" service)

Lloyd McKenzie2024-04-12T20:02:11Z

Would production usage that subscribes to changes to code systems or value sets to update a different production tx server be reasonable?

I don't know what this means

Grahame Grieve2024-04-12T21:56:27Z

If Canada were to have a tx server intended for production use that subscribed to tx.fhir.org to retrieve updates to certain value set definitions or code system definitions, would that be a violation of usage terms?

Lloyd McKenzie2024-04-13T04:01:38Z

I don't think that tx.fhir.org supports subscriptions like that

Grahame Grieve2024-04-13T07:01:44Z

but if it did, no it wouldn't be

Grahame Grieve2024-04-13T07:01:51Z

Is the content loaded in from packages?

Michael Lawley2024-04-13T09:40:26Z

yes

Grahame Grieve2024-04-13T09:41:43Z

and some external terminologies

Grahame Grieve2024-04-13T09:41:54Z

There should be some way for downstream servers targeted to production uses to leverage the loading that we do with tx.fhir.org. Saying that everyone needs to repeat that effort doesn't scale well.

Lloyd McKenzie2024-04-13T15:10:11Z

if you run a clone of tx.fhir.org using the same software, you just point it at the same config. No subscription needed.

if you're running a different piece of software... well, then, the terminologies supported by tx.fhir.org fall into two categories: large external terminologies which are supported using custom formats. Other terminology servers have their own approach for this, so there's nothing to reuse. All other terminology content is delivered using packages, so just load the latest version of said package, and the tx.fhir.org config is available if you want to list the relevant packages.

so I haven't been thinking about this problem at all

Grahame Grieve2024-04-13T21:01:01Z

National terminology services do think about this, and it's a governance question; they're hardly going to listen to what we do on tx.fhir.org

Grahame Grieve2024-04-13T21:28:25Z

Pretty much where AU lands is that, where possible, relevant FHIR terminology content is loaded from packages, SNOMED and LOINC are special, so get loaded from native formats, and then there's a bunch of FHIR resources that (currently) exist outside of IGs, so have config that points at the directly.
All of this is built around an open extension to the ATOM syndication file format (also adopted by SNOMED International).
So, just like tx.fhir.org, it's all config based and available for any conforming system to consume the same config, but different governance requirements lead to different config.

Michael Lawley2024-04-14T09:49:05Z

Hi Folks,
New to this chat, so saying to all :)
I have a couple questions regarding the setup and running a clone of tx.fhir.org (https://confluence.hl7.org/display/FHIR/Running+your+own+copy+of+tx.fhir.org).

I've been able to setup this service up and have it run via console mode on a windows server; I also have a docker service that is running the inferno Validator (https://github.com/inferno-framework/fhir-validator-wrapper)

One curious thing that came up, when I point my local validator to my local terminology server, I get these odd "Access violation" errors vs to when I point my local validator to tx.fhir.org.
For example, when there are certain Observation validations that silently fail, eg:

Validate Observation against http://hl7.org/fhir/StructureDefinition/bodyweight|4.0.1.. ..Access violation
Validate Observation against http://hl7.org/fhir/StructureDefinition/vitalsigns|
Validate Observation against http://hl7.org/fhir/StructureDefinition/bodyweight|4.0.1.. ..Access violation

And there are some Access violation that aren't thrown in the logs, but are surfaced via the OperationOutcome, eg:

....
           "severity": "error",
            "code": "code-invalid",
            "details": {
                "text": "Error from http://10.0.0.209:8099/r4: Access violation"
            },
            "expression": [
                "Bundle.entry[6].resource.medication.ofType(CodeableConcept).coding[0]"
            ]
....

When using tx.fhir.org, I never see any of these Access violation... I figure it's something to do with my local configuration, alas, in my www searching, I've not been able to find anything.
I created the below composite screen shot to illustrate the config (via the fhirconsole exec) :
terminology_server_config.png

Question: what am I missing configuration wise ? Happy to provide any further artefacts that may be of interest to review.

I probably should add why I'm standing up a clone of this; it's for a Canadian project, and there very strick rules about network traffic leaving (and entering) the private data center, hence, the need to have a local copy so nothing related to any FHIR submissions being validated leaves the "four walls" of the data center.

Andrzej Wloskowicz2024-04-24T01:05:54Z

My second question is around the building of a docker service. My initial pondering with the window service was to get a 'feel' of this service. I have been able to build a docker container using the provided source code (https://github.com/HealthIntersections/fhirserver) and post build, I was happy to see it start, however, I was faced with an odd exception about a missing lang file - I believe this is the lang.dat file that ships with the windows service.

]:/opt/fhir_tx_server/fhirserver-master# docker container logs --tail 1000 fhir_tx_server
07:16:40 00:00:00 1815b 0% FHIR Server 3.4.3 Linux/FreePascal, Development Build
07:16:40 00:00:00 1911b 0% Running on "f3920d21f4a4": "Ubuntu" v"22.04.4 LTS (Jammy Jellyfish)". 20.7 GB/ 0 bytes memory
07:16:40 00:00:00 1981b 0% Logging to /tmp/fhirserver.log. No Debugger.
07:16:40 00:00:00 2091b 0% /work/fhirserver/exec/64/fhirserver -cmd console -cfg /config/config.ini -local /terminology (dir=/work/fhirserver)
07:16:40 00:00:00 2091b 0% Command Line Parameters: see https://github.com/HealthIntersections/fhirserver/wiki/Command-line-Parameters-for-the-server
07:16:40 00:00:00 1793b 0% Loading Dependencies
07:16:40 00:00:00 282kb 0% TimeZone: UTC @ UTC
07:16:40 00:00:00 282kb 0% Loaded
07:16:40 00:00:00 282kb 0% Local config: /config/config.ini (exists = False)
07:16:40 00:00:00 282kb 0% Actual config: /work/fhirserver/exec/64/fhirserver.cfg
07:16:40 00:00:00 315kb 0% Using Configuration file /work/fhirserver/exec/64/fhirserver.cfg
07:16:40 00:00:00 316kb 0% Start Telnet Server on Port 44123
07:16:41 00:00:01 328kb 0% Run Number 40
07:16:41 00:00:01 328kb 0% Load Terminologies
07:16:41 00:00:01 1119kb 0% Error starting: EFslException: Unable to find the lang file ""


07:16:41 00:00:01 1119kb 0% stopping:
07:16:41 00:00:01 1119kb 0% close web server
07:16:41 00:00:01 1119kb 0% stop internal thread
07:16:41 00:00:01 1119kb 0% stop web server
07:16:41 00:00:01 1119kb 0% closing
07:16:41 00:00:01 1119kb 0% stopped
07:16:41 00:00:01 1119kb 0% Exception [EFslException] in Service Execution:
Unable to find the07:16:40 00:00:00 321kb 0% Thread start  Telnet Server 00007B372B366640
07:16:41 00:00:01 327kb 0% Thread Finish Telnet Server
 lang file ""

I figure it's a matter of importing that lang.dat file, I'm just not that entirely familiar with the project setup and the Dockerfile, so I'm not sure sure where that file should go?
Is it just in the config/ directory ?
eg:
image.png

Any other helpful hints folks here might know on building this docker container ? Any pointers to documentation will be highly appreciated :)

Andrzej Wloskowicz2024-04-24T01:18:45Z

it's in the exec/pack folder, and the files in there need to go in the same folder as the server

Grahame Grieve2024-04-25T12:52:55Z

Tx server is down. @Grahame Grieve @Rob Hausam @Mark Iantorno

Lloyd McKenzie2024-05-26T12:53:13Z

Lynn Laakso has marked this topic as resolved.

Notification Bot2024-05-26T13:42:53Z

Lynn Laakso has marked this topic as unresolved.

Notification Bot2024-05-26T15:12:56Z

of course it goes down while I'm on a 17hour flight

Grahame Grieve2024-05-26T22:24:50Z

back

Grahame Grieve2024-05-26T22:40:12Z

WARNING: Running without terminology server - terminology content will likely not publish correctly

Richard Langford2024-05-28T20:31:43Z

curl: (22) The requested URL returned error: 502
Offline (or the terminology server is down), unable to update. Exiting

Richard Langford2024-05-28T20:34:41Z

I have restarted the server. It should be up again soon.

David Otasek2024-05-28T20:53:13Z

sorted, thanks

Richard Langford2024-05-28T20:53:44Z

Hi Everyone,
New to this chat.
Working on running own copy of tx.fhir.org on ec2 instance and have all the configurations.
Previously was running version 3.3.10.
We are trying to get to latest version 3.4.6 but running into below error

2kb 2% FHIR Server 3.4.6 Windows/FreePascal, Production Build

14:03:20 00:00:00 1283kb 2% Running on "EC2AMAZ-1D44V9M": Windows NT 6 [6.2.9200]. 15.8 GB/ 34.5 GB memory
14:03:20 00:00:00 1283kb 2% Logging to C:\ProgramData\TerminologyServer\logs\tx-server.log. No Debugger. No Leak Dialog
14:03:20 00:00:00 1283kb 2% FHIR Server running as a Service
14:03:20 00:00:00 1283kb 2% Command Line Parameters: see https://github.com/HealthIntersections/fhirserver/wiki/Command-line-Parameters-for-the-server
14:03:20 00:00:00 1282kb 2% Loading Dependencies
14:03:20 00:00:00 1651kb 2% TimeZone: America/New_York @ -04:00
14:03:20 00:00:00 1651kb 2% Loaded
14:03:20 00:00:00 1651kb 2% Local config: C:\Program Files\TerminologyServer\fhirserver.ini (exists = True)
14:03:20 00:00:00 1651kb 2% Actual config: C:\ProgramData\TerminologyServer\tx-server-config.cfg
14:03:20 00:00:00 1689kb 2% Using Configuration file C:\ProgramData\TerminologyServer\tx-server-config.cfg
14:03:20 00:00:00 1691kb 2% Start Telnet Server on Port 44123
14:03:20 00:00:00 1698kb 2% Thread start Telnet Server 000015A4
14:03:20 00:00:01 1714kb 12% Run Number 1
14:03:20 00:00:01 1714kb 12% Load Terminologies
14:03:21 00:00:01 4Mb 96% load ucum-essence-2.0.1 from C:\ProgramData\TerminologyServer\ucum-essence-2.0.1.xml
14:03:21 00:00:01 5Mb 96% load loinc_274_a from C:\ProgramData\TerminologyServer\loinc_274_a.cache
14:03:21 00:00:01 5Mb 96% Error starting: ESQLite3Error: fdb_sqlite3_objects error: file is not a database

We were able to get 3.4.1 working with current config

This is the config for sql lite

image.png

Chirag Kular2024-08-21T21:07:50Z

what's the size of loing_274_a.cache?

Grahame Grieve2024-08-21T21:22:36Z

Grahame Grieve said:

what's the size of loing_274_a.cache?

The size is 178.3 MB

Chirag Kular2024-08-22T13:18:55Z

try deleting it. If it still doesn't work, can you open that file in the sqlite db browser?

Grahame Grieve2024-08-22T13:26:54Z

Deleted the config for the loinc and that part worked. Is the loinc cache required for the tx server ?

Chirag Kular2024-08-22T13:40:34Z

yes

Grahame Grieve2024-08-22T13:40:51Z

it'll be redownloaded

Grahame Grieve2024-08-22T13:40:56Z

Just to clarify, I'll keep remove the source (loinc file reference) from the config file for the loinc_274 and it will re-download ?
image.png

Chirag Kular2024-08-22T13:46:06Z

yes

Grahame Grieve2024-08-22T13:46:37Z

I'll try that. Thank you!

Chirag Kular2024-08-22T13:48:50Z

Trial 1:
We tried removing the source file under the loinc config but that didn't help. Got the below error

11:28:41 00:00:01 5Mb 100% Error starting: EFslException: Unable to find the loinc file ""

Trail 2:
We removed the source and also tried specifying the version 2.78, but it didn't download anything. But the server started fine and didn't return any error. There was no log w.r.t LOINC. It seemed to skip the loinc step.

Will you be able to provide an example of what the config look like where it can auto download the loinc cache and also if we want to download the latest version 2.78 of loinc, how do we specify the version in the config file ?

Thank you.

Chirag Kular2024-08-22T19:32:46Z

I don't see that we've processed LOINC 2.78 yet

Grahame Grieve2024-08-22T22:01:47Z

We tried removing the source file under the loinc config but that didn't help. Got the below error

I guess you can't do that

Grahame Grieve2024-08-22T22:02:29Z

LOINC 2.78 is now available (as of early this morning - my time).
@Chirag Kular @Grahame Grieve

Rob Hausam2024-08-29T21:39:11Z

Hello Everyone!

I am validating a mCode Primary Cancer Condition profile (with Inferno validator and locally hosted copy of tx.fhir.org) which resulted in this:
"Error from <terminology server> : Error:A definition for the value Set 'http://hl7.org/fhir/us/mcode/ValueSet/mcode-primary-cancer-disorder-vs|3.0.0' could not be found."

Though the Condition.code validates fine, missing valueset definition fails the resource. Tried to $expand mcode-primary-cancer-disorder-vs and its not found.
So, tried loading the mcode IG by adding "hl7.fhir.us.mcode#3.0.0" under the r4 packages in the tx-server-config.cfg. For some reason, as soon as I start the server with this config, the "hl7.fhir.us.mcode#3.0.0" entry is auto removed from the config before loading the terminologies.

How do I load the mCode IG? Am I missing something else?

Thanks for any help!

Jansi Mohan2024-10-20T05:20:20Z

if you are running a local copy of tx.fhir.org, it will be exactly the same as the master; you can't change the setup. You have to clone the set up if you want to do that

Grahame Grieve2024-10-20T09:26:48Z

but why is it trying to validate that on the server? Usually, the validator would handle that internally - can you change what inferno loads? (ask on #inferno?)

Grahame Grieve2024-10-20T09:27:28Z

Thank you. I have asked on #inferno.

Running the production release with local config file (of course, the first load was with zero config pulling the terminologies from tx.fhir.org).
I assumed I should be able to add or remove the packages in the local config file as needed.
If I need to load any other published IG, can't I do that with the local config?

Jansi Mohan2024-10-20T19:44:37Z
IPS-AU
#IPS
Grahame Grieve has drafted the Australian IPS (IPS-AU) to facilitate the adoption of the International Patient Summary (IPS) standard in Australia, intending to have it recognized as an HL7 Australia specification. The discussion also highlights the need for clarity around references to patient profiles, particularly regarding the inclusion of multiple patients in specific contexts like maternity cases, and the requirement for all resources in an IPS to conform to defined profiles.
66 comments
CS
RS
DD
DO

I've completed a draft of IPS-AU - the Australian IPS. I wrote it to support IPS Adoption in Australia; hopefully it will become an HL7 Australia spec, but I also wrote it to show countries how I think this should be done

Grahame Grieve2023-09-06T01:36:17Z

The spec is here:

Grahame Grieve2023-09-06T01:36:25Z

it's very literally a profile in IPS that does nothing but say, 'not only must this resource conform to IPS, it must also conform to the Australian Core profiles'

Grahame Grieve2023-09-06T01:37:40Z

the release of the validator that's about to come out supports this fully with the parameter -ips:au - just that parameter and the document file name, and it'll validate propoerly

Grahame Grieve2023-09-06T01:38:34Z

(so far the only additional constraint I've found from AU Core is that Condition.category is mandatory in AU Code and it isn't in IPS)

Grahame Grieve2023-09-06T01:39:35Z

I can add support for ips:XXeasily - countries just have to point me at the IPS profiles they wish to use in that case

Grahame Grieve2023-09-06T01:40:25Z

I'd be interested to see how practical the bindings are on Medication.code - if they're restricted to SNOMED CT codes that are in the IPS Terminology that may not provide sufficient coverage. Certainly, in NZ not all of our NZMT codes map to SNOMED CT medicinal products, so the alternative is to incur the wrath of the Validator or put the description in the text element of the Codeable Concept.

Peter Jordan2023-09-06T03:39:14Z

where would the wrath of the validator come from?

Grahame Grieve2023-09-06T04:39:57Z

Code System URI 'http://nzmt.org.nz' is unknown so the code cannot be validated. Actually, that generates an information message, so not really wrath-inducing. :)

The meds in my own IPS instance do map to SNOMED MP concepts in the IPS Terminology, so it validates fine against both the IPS and NZ Base IGs - but I'd get the above message if I slipped in an NZMT concept.

Peter Jordan2023-09-06T04:52:54Z

that generates an information message, so not really wrath-inducing. :)

hah. Might still produce some wrath :grinning:

Grahame Grieve2023-09-06T04:54:08Z

Only reference elements that with constrained referents in IPS are constrained in the new IG.
For example Allergy Intolerance (AU IPS).patient is constrained but Allergy Intolerance (AU IPS).encounter is not.
AU Core Allergy Intolerance.encounter is constrained to AU Core Encounter.
Is this intended?

Richard Townley-O'Neill2023-09-06T05:48:22Z

it is intended, but it's certainly something to discuss

Grahame Grieve2023-09-06T06:05:27Z

Must support is interesting here. AU IPS does not require systems to support all of the things that AU Core does. That might be useful, but it needs to be made clear.

Richard Townley-O'Neill2023-09-06T06:11:34Z

how does it not do that?

Grahame Grieve2023-09-06T06:21:11Z

The snapshot in https://build.fhir.org/ig/HealthIntersections/au-ips/StructureDefinition-AllergyIntolerance-au-ips.html does not have any must supports beyond those in AllergyIntoleranceUvIps.

So I take that as saying that MS is not incorporated from AU Core AllergyIntolerance

Richard Townley-O'Neill2023-09-07T05:29:41Z

you shouldn't

Grahame Grieve2023-09-07T06:26:24Z

Interested in people's thoughts on the use of the _summary=data request parameter which (if the Server implements it - not all do) results in all of the text elements (other than those within other elements such as CodeableConcept) being removed from a response. Should this be permissible within an IPS (or any Composition.section)?

Peter Jordan2023-09-11T04:24:29Z

no it shouldn't work in that context

Grahame Grieve2023-09-11T06:28:06Z

Most of the IPS-AU profiles only restrict references Patient to be references to au-core-patient (and some Practitioner, Org etc.). Most national profiles would do the same, I looked at NL, DE, UK, US a while ago and a lot of profiling is done on Patient, Practitioner, Organization and much less on others, except restricting those to xx-core-patient etc. That leads to a proliferation of profiles which all do more or less the same. Would it not be easier to state on IG level: all references to patient in this IG must be to xx-core-patient?

And thinking further: does it even make sense to restrict references in say Condition or Observation to be references to xx-core-patient? The Patient itself is already profiled to be only xx-core-patient, so the ecosystem behind the IG only allows xx-core-patients. Since all patients in the ecosystem already will be xx-core-patient, why add numerous profiles which only state that references to Patient must be to xx-core-patient - which all patients already will be.

Marc de Graauw2023-09-11T23:40:35Z

@Grahame Grieve. In that case, should servers ignore the Summary Type parameter or reject that request with an OperationOutcome stating that the parameter is invalid within the context?

Peter Jordan2023-09-12T00:29:38Z

One of the two. I don’t know which

Grahame Grieve2023-09-12T00:30:05Z

@Marc de Graauw this is a good question but I'm deferring to IPS, which doesn't have a position on this. I'll do whatever IPS does. @John D'Amore

Grahame Grieve2023-09-12T01:19:37Z

For the time being, I've decided to ignore it if the operation is $summary.

Peter Jordan2023-09-12T04:32:47Z

It looks like we need to decide what IPS will do with this. I'm happy to be corrected if all or part of what I say here is incorrect, but I believe that the situation that @Marc de Graauw describes where "the ecosystem behind the IG only allows xx-core-patients" would be true only if the IPS or IPS-AU Patient profile is based on xx-core-patient and is declared as 'global' in the IG. And at present neither IPS or IPS-AU are declaring any global profiles. So, unless that changes, I think if we want to ensure that the xx-core-patient profile will be used throughout the IG, then each reference to Patient in the other resource profiles within the IG will need to be explicitly constrained to xx-core-patient. We can certainly discuss what we think this should be in IPS - either (or both) on an upcoming call, or possibly have some initial discussion on it in our IPS quarter tomorrow Q3 in EHR (if there is time).
@John D'Amore @Grahame Grieve

Rob Hausam2023-09-12T06:00:13Z

Well, let’s keep away from “global” which is potentially problematic and just confine our language to what’s in the ips. Would we say that we want only one patient resource in the ips? I don’t think we can actually say that. But we could say that if there’s any patients they must be ips patients. Would we say that for all the other profiled resources?

Grahame Grieve2023-09-12T06:07:33Z

If we want to say that, I’ll think about how to say that

Grahame Grieve2023-09-12T06:08:56Z

Ok. And that is the question. We avoided specifically saying that before - I think to avoid being overly (unnecessarily) constraining. We can revisit that. And happy to hear how you think we can/should say that, if we do.

Rob Hausam2023-09-12T06:14:35Z

And I agree with keeping away from global profiles.

Rob Hausam2023-09-12T06:16:47Z

I think if we want to ensure that the xx-core-patient profile will be used throughout the IG, then each reference to Patient in the other resource profiles within the IG will need to be explicitly constrained to xx-core-patient

Not sure that is really true. In effect, the IPS IG describes a Bundle with a patient's IPS. If the Patient in the Bundle is xx-core-patient, and the IG for country xx requires the Patient in xx-IPS to be xx-core-patient, where is the need to ensure that xx-core-patient is used throughout the IG?

The drawback in lots of profiles which only constrain Reference to Patient, is that implementers still have to look at all profiles just to see what's in there. "Oh, just ref to xx-core-patient, which we already have, next one". We had a lot of trouble with proliferation of templates in CDA, which made it really hard on implementers. The situation with profiles is much better, since they have diffs, but it still seems unnecessary overhead. Happy to discuss this further.

Marc de Graauw2023-09-12T14:54:27Z

We do constrain Composition.subject as 1..1 Patient (IPS). And, given the FHIR Document rules, that does effectively constrain the references in the Bundle, as you say. So I agree with you on that. And maybe your earlier question of "why add numerous profiles which only state that references to Patient must be to xx-core-patient" also makes sense. But since I don't think we have (or will have) any profiles that "only state that references to Patient must be to xx-core-patient", I don't know if that's actually an issue?

Rob Hausam2023-09-12T15:38:53Z

that does effectively constrain the references in the Bundle, as you say

I don't think this is true. I can just add another patient resource, and reference that

Grahame Grieve2023-09-12T15:47:40Z

or I can just reference it and not add it to the IPS

Grahame Grieve2023-09-12T15:47:50Z

nothing about IPS says that the other resources have to reference the same resource as Composition.subject

Grahame Grieve2023-09-12T15:48:31Z

perhaps everyone just assumes that, but we should decide whether it's true and say it explicitly if we do

Grahame Grieve2023-09-12T15:49:13Z

Fair enough. You could do that, since the Bundle profile doesn't impose any constraints on Patient. So that's getting back toward my original thought. And, particularly in light of this discussion, we should try to make it explicit.

Rob Hausam2023-09-12T15:50:25Z

You guys are making my neurotransmitters salivate ... maybe this will become the first FHIR thing where I actually get into the weeds :smile:

See you in Q1!

Dave deBronkart2023-09-12T15:51:45Z

In the Dutch PS we do state that it's about a single patient. I think in the CDA IPS it will almost by default be about a single patient (does CDA even allow multiple patients in a single doc?). ISO 27269:2021 does not have cardinalities, but just a single required patient section. So it's fair to make explicit that the FHIR IPS is also about a single patient, which I believe should be true. (Would not be true if someone added say family history or child delivery to the IPS, but that's not the case now.)

Marc de Graauw2023-09-13T00:35:43Z

It seems reasonable to me, too, to make it clear and specify in the profile(s) that the iPS document is for a single patient. If someone ends up coming forward with a credible use case for a "multi-patient IPS", then I expect we could consider that. But that's a separate use case which I'm guessing probably isn't very likely - and if it would happen, it would make sense for that to be a different profile.

Rob Hausam2023-09-13T01:44:51Z

In the Dutch PS we do state that it's about a single patient.

is that the same as 'only one patient resource'? What about transplants etc

Grahame Grieve2023-09-13T02:03:38Z

does CDA even allow multiple patients in a single doc?

sure does, at every level

Grahame Grieve2023-09-13T02:03:54Z

Yes, in the Dutch PS we state it's about a single patient. We don't handle transplants (well, as a general Procedure but not with donor). Should have looked up CDA, silly question from me

Marc de Graauw2023-09-13T15:45:00Z

about a single patient

is not quite the same as 'only one patient resource' - is that an explicit rule?

Grahame Grieve2023-09-13T15:47:18Z

It's explicit in our functional docs. In FHIR we don't really say anything about it, but our PS is not a FHIR Document, just a bunch of queries which will constitute a PS. A bit what $summary does, but then with queries. None would normally return another Patient - at least not within what we specified in the functional specs. It's imaginable (and probably real) that say a caesarian would reference another Patient - not _include it though.

Marc de Graauw2023-09-13T16:22:46Z

The EN ISO 27269 standard defines the IPS as an electronic patient summary, which is defined as an electronic health record extract. A patient summary is defined as a health record extract [...] of a subject of care's health information and healthcare. With "a subject of care" it explicitly excludes more subjects of care. There are no references to other patients in the hierarchy of (up to) seven levels of data elements within an IPS section, so according to the EN ISO IPS standard there should be no reference to other patients in an IPS. Of course, the IPS is non-exhaustive, so additional information could be added, but it is also minimal, which means that there should be a well identified need (specialty- agnostic and condition-independent) to include references to other patients.

In short: In my mind it would be safe to assume that only one patient resource will appear in an IPS bundle.

Robert Stegwee2023-09-19T10:04:40Z

How about with maternity cases where the mother and unborn child are both present?
Should the unborn child(ren) be included? Along with the data relevant to those too? (medications/treatments of the unborn)

Brian Postlethwaite2023-09-19T17:43:52Z

Other than pregnancy status and brief history, I don't see IPS as the appropriate medium for exchanging detailed information about maternity cases. Certainly not based on my experiences in working on 3 different maternity systems during my career.

Peter Jordan2023-09-19T19:12:36Z

(Just a question only, not a request)

Brian Postlethwaite2023-09-19T19:41:09Z

If the subject of the procedure or medication administration is a group (and you can't have more than 1 patient without using Group), then I would guess these procedures would belong to the patient summaries of all those patients, and there would be no indication who where the other patients in that group?
If that is the correct logic for groups, then it would also apply in case one patient is inside the other.

Rutt Lindström2023-09-19T19:49:41Z

How about with maternity cases where the mother and unborn child are both present?

I think the conclusion I draw from this is that they are involved in each other's care and likely to appear as RelatedPerson in each other's summary, but not as Patient

And therefore we should be explicit about this: 1 patient resource only in the IPS

Grahame Grieve2023-09-19T20:02:24Z

So the mother's ips shouldn't have anything that is associated to the unborn patient resource. (that isn't directly related to her patient resource)
What about Observation where she's the subject but not the focus?

Brian Postlethwaite2023-09-20T13:59:37Z

We need to discuss and further think through the pregnancy situation (particularly current pregnancy, and also some pregnancy history details potentially) for IPS. That may lend to needing to revise the proposed "1 patient resource only" rule. The CHOICE group (which I participate in) may have some thoughts on this.

Rob Hausam2023-09-20T16:14:54Z

RelatedPerson in that case, surely?

Grahame Grieve2023-09-21T01:13:52Z

As an obstetrician, I can tell you the that clinically, the line between the maternal and fetal patient is very blurry. Quick example: who does the placenta belong to? However, if I understand IPS (and I probably don't), the I think that @Peter Jordan is probably on the right track re: pregnancy status and brief history. I think there is a working group in HL7 working on modelling the maternal / fetal relationship(s), they have likely spent some time thinking through this stuff and may have some insight.

EDIT: oops... I missed @Rob Hausam's comment as he already pointed out the CHOICE group. I would love to hear his thoughts, and CHOICE's thoughts.

Carl Severson2023-09-21T05:22:59Z

@Carl Severson I also agree that @Peter Jordan's comments are on the right track generally. But at the moment I am leaving open the possibility that in some cases there might be a need for some (not all) further details regarding pregnancy and the fetus in the patient summary context. The CHOICE call originally scheduled for Sept 26 needed to be cancelled, and the next one will be Oct 10. I should be able to bring this up then, and we could consider having some broader Zulip or email discussion beforehand.

Rob Hausam2023-09-21T13:33:51Z

I agree @Rob Hausam, there are likely cases where further details about the maternal patient, fetus, or the dyad, are needed. Just hard to figure out what those are! I have been stalking the CHOICE meeting minutes and keep an eye on the google doc, thanks for doing this important work.

Carl Severson2023-09-22T23:30:13Z

as a follow up to this, beyond patient, can we say that any Device, Medication, Organization, Practitioner, and PractitionerRole present in an IPS are required to conform to the IPS library profiles?

Grahame Grieve2023-09-28T05:13:26Z

So far (as of the IPS STU 1.1 publication), we do specify but do not require the use of the IPS library profiles for a conformant IPS document instance. The Bundle entry and Composition section.entry slices specify the IPS profiles (where they exist - not all of them do for a few of the optional sections). But the slicing rules are open. And the element level constraints on section.entry are to the base resource(s) plus also DocumentReference, which allows an IPS document to be a conformant IPS instance even if it contains a resource which is of the appropriate type but where that resource instance doesn't conform to the IPS-specific profile.

Whether that's what we should continue to do in the upcoming IPS 2.0 ballot and publication is another matter. If we would want to consider changing this, now would be the time to do it. So feedback on that is definitely welcome.

Rob Hausam2023-09-28T23:20:58Z

Right. it's allowed outside what's explicitly profiled. I believe that we should be clear in a way that the validator can test: all the resources have to conform to the profiles defined by IPS if it profiles the resources

Grahame Grieve2023-09-28T23:24:24Z

Would you allow for a DocumentReference "exception" - e.g., someone wants to use a PDF (rather than structured data in a resource) for one or more of the entries?

Rob Hausam2023-09-28T23:31:31Z

I'm not following how that would make sense. not allowed now, right?

Grahame Grieve2023-09-29T02:06:52Z

DocumentReference for the entries is explicitly included in the Composition section.entry slices, and it's always allowed anyway by the open slicing in the Composition and Bundle profiles. That was the outcome of some earlier discussions. I don't think anyone has actually asked for or implemented that, as far as I know - but the idea was about allowing as much flexibility as (reasonably?) possible and giving guidance (not requirements) on how to do it, particularly when an implementation may need to deal with legacy data. But, again, maybe it's time to revisit this?
@Grahame Grieve

Rob Hausam2023-09-29T16:39:08Z

well, i see that the IPS doesn't constrain DocumentReference, nor does it discuss that ramifications of providing a document reference in the section entries. I suppose that the intent is that we at least say that the document reference points at a logical equivalent of the logical entry alternatives

Grahame Grieve2023-09-30T04:00:57Z

I hope we can do that. And that means that a document reference can't be used for one of the kinds I listed above, right?

Grahame Grieve2023-09-30T04:01:34Z

@Grahame Grieve it appears as though IPS-AU is missing from the build server:

org.hl7.fhir.exceptions.FHIRException: The package 'hl7.fhir.au.ips' has no entry on the current build server

I think someone just needs to do an empty commit to get it back.

David Otasek2024-10-16T14:13:45Z

done

Grahame Grieve2024-10-16T14:32:32Z
The chat discusses the challenges and progress in generating Java data models for FHIR profiles, highlighting issues such as the generation of profiled data types and code sanitation. Participants express interest in further development and collaboration on the code generation efforts, particularly through related projects and tools like the FHIR Validator.
61 comments

What is the latest on the story of generating Java data models for profiles?

(I checked fhir-codegen but I see it has this issue)

Vadim Peretokin2024-10-04T11:53:28Z
Jens Villadsen2024-10-04T15:35:39Z

@Vadim Peretokin I might have a colleague that would like to pitch in some effort

Jens Villadsen2024-10-05T07:40:10Z

To the MS codegen project

Jens Villadsen2024-10-05T07:40:28Z

works, but there's some open issues with it

Grahame Grieve2024-10-05T08:34:01Z

What are those?

Vadim Peretokin2024-10-05T12:05:25Z

don't remember :-(

Grahame Grieve2024-10-05T13:10:25Z

@Grahame Grieve and this class here https://github.com/hapifhir/org.hl7.fhir.core/blob/master/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/profiles/PETests.java illustrates how it can be used, correct? It isn't wrapped in any executable or something like that already, right?

Jens Villadsen2024-10-05T15:25:32Z

that tests out the underlying engine.

Grahame Grieve2024-10-06T00:37:23Z

I don't think it tests out the generated code itself

Grahame Grieve2024-10-06T00:37:41Z

This is a great start!

I've played around with the code generation and found the following issues, sorted in priority:

  1. does not generate code for profiled FHIR datatypes (blocker for some implementations)
  2. doesn't sanitize field names, e.g. generates field names with dashes in them
  3. polymorphic types not supported
  4. generates code for r5 always even when running in r4 mode
  5. field comments are the profile description instead of field descriptions

Would you like me to file them so we can keep track? Both me and @Jens Villadsen agree this is something worth developing further, perhaps we can get some community traction on this :)

Vadim Peretokin2024-10-06T16:40:09Z

This is gonna be a fun ride!

Jens Villadsen2024-10-06T16:42:12Z
  1. Is it intentional that the generated classes do extend e.g. org.hl7.fhir.r4.model.Resource ?
  2. It doesn't seem like the ca.uhn.fhir.model.api.annotation.* are used in the generated results.
Jens Villadsen2024-10-06T20:12:51Z
  1. @Vadim Peretokin my observation in regarding 1) - I can get it to generate it, but the end result does not extend the actual datatype being extended :thinking: ?
Jens Villadsen2024-10-06T20:20:17Z
  1. Don't understand - it does, and the test case has data type profiles
  2. oops. Someone will have to fix that in the PEModel - I'll try and get to it
  3. example?
Grahame Grieve2024-10-07T01:13:31Z
  1. oh. Someone will have to fix that too
  2. example?
  3. I think so. It relates to how the generated classes fit into the HAPI framework
  4. which annotations do you care about?
  5. it's not ever going to be 'extend' - the generated code is a facade to the underlying type, not a specialization
Grahame Grieve2024-10-07T01:15:14Z

6 missed a 'not'. But you explained it in 8, so nvm

Jens Villadsen2024-10-07T06:34:14Z

@Vadim Peretokin how to reproduce #2?

Grahame Grieve2024-10-15T01:13:47Z

I'll have a look again. On the road atm, so it'll be in a few days. Thanks for checking it out

Vadim Peretokin2024-10-16T22:51:58Z

@Grahame Grieve try generate something for e.g. https://hl7.dk/fhir/core/StructureDefinition-dk-core-gln-identifier.html

Jens Villadsen2024-10-17T12:35:19Z
Jens Villadsen2024-10-17T12:36:35Z

hmm ... wait ... I'll share some code that can reproduce it ...

Jens Villadsen2024-10-17T12:47:40Z

I thought I set up for the validator to do the code generation, but I can't see that now

Grahame Grieve2024-10-17T12:50:33Z

where ?

Jens Villadsen2024-10-17T13:01:03Z

I didn't do it

Grahame Grieve2024-10-17T13:05:57Z

but what does this have to do with the validator?

Jens Villadsen2024-10-17T13:20:12Z

it has all the knowledge etc, so it can do the code generation

Grahame Grieve2024-10-17T13:21:28Z
java -jar validator.jar -codegen -ig x -ig y -profiles a,b,c -output {dir}
Grahame Grieve2024-10-17T13:22:25Z

mmmkay ...

Jens Villadsen2024-10-17T13:22:49Z

never tried that

Jens Villadsen2024-10-17T13:23:06Z

it doesn't work now. Cause I never did it

Grahame Grieve2024-10-17T13:23:19Z

lol

Jens Villadsen2024-10-17T13:23:31Z

I'll most likely do some wrapping of it as well and put it somewhere public

Jens Villadsen2024-10-17T13:24:51Z

but it will be a few days

Jens Villadsen2024-10-17T13:25:06Z

why not put it in the validator where everyone can use it?

Grahame Grieve2024-10-17T13:25:37Z

separation of concerns

Jens Villadsen2024-10-17T13:32:46Z

also ... I'd like to be using whatever libraries as I see fit

Jens Villadsen2024-10-17T13:33:49Z

also ... I do not know of the the release cycle of the validator

Jens Villadsen2024-10-17T13:34:24Z

rarely more than a week

Grahame Grieve2024-10-17T13:34:54Z

but if the code produced fits into the validator then I'll gladly make a PR

Jens Villadsen2024-10-17T13:35:06Z

it's the generation that goes in the validator, not the generated code

Grahame Grieve2024-10-17T13:35:24Z

yes

Jens Villadsen2024-10-17T13:35:41Z

("the code produced" -> the wrapping code that I'll be producing - not the generated code )

Jens Villadsen2024-10-17T13:40:48Z

I also consider building it as a maven plugin

Jens Villadsen2024-10-18T07:49:01Z

@Vadim Peretokin

polymorphic types not supported

is that:

Attempt to get children for an element that doesn't have a single type

?

Grahame Grieve2024-10-18T09:10:50Z

the next version of the validator will generate code on request:

--

The easiest way to generate code is to use the FHIR Validator, which can generate java classes for profiles. Parameters:

-codegen -version r4 -ig hl7.fhir.dk.core#3.2.0 -profiles http://hl7.dk/fhir/core/StructureDefinition/dk-core-gln-identifier,http://hl7.dk/fhir/core/StructureDefinition/dk-core-patient -output /Users/grahamegrieve/temp/codegen -package-name org.hl7.fhir.test

Parameter Documentation:

  • -codegen: tells the validator to generate code
  • -version {r4|5}: which version to generate for
  • -ig {name}: loads an IG (and it's dependencies) - see -ig documentation for the validator
  • -profiles {list}: a comma separated list of profile URLs to generate code for
  • -output {folder}: the folder where to generate the output java class source code
  • -package-name {name}: the name of the java package to generate in

Options

  • -option {name}: a code generation option, one of:

  • narrative: generate code for the resource narrative (recommended: don't - leave that for the native resource level)

  • meta: generate code the what's in meta
  • contained: generate code for contained resources
  • all-elements: generate code for all elements, not just the key elements (makes the code verbose)
Grahame Grieve2024-10-18T12:19:36Z

and it fixes a couple of those problems, though I have no doubt there's plenty more work to do

Grahame Grieve2024-10-18T12:20:14Z
Jens Villadsen2024-10-18T18:52:25Z

that looks funky

Jens Villadsen2024-10-18T18:52:33Z

nvm .... didn't use the version property before. Its kinda odd though. Why isnt' that property automatically set since the PECodeGenerator is already package specific?

Jens Villadsen2024-10-18T18:55:50Z

it is now

Grahame Grieve2024-10-18T20:45:20Z

its getting there now -> https://github.com/jkiddo/espresso

Jens Villadsen2024-10-20T22:17:33Z

So far it supports R4 and R5 (automatically detects the version), by default selects all profiles and it works as a maven plugin

Jens Villadsen2024-10-20T22:45:08Z

It supports IG's from the registries as well as any IG that has a public available package.tgz file

Jens Villadsen2024-10-20T22:47:37Z

and local files as well ofc

Jens Villadsen2024-10-20T22:47:54Z

let me know if you find other generation issues

Grahame Grieve2024-10-20T23:20:42Z
Jens Villadsen2024-10-21T09:25:56Z

you cant have -in the naming. ENTERED-IN-ERROR, // "Entered in Error" = http://hl7.org/fhir/observation-status#entered-in-error

Jens Villadsen2024-10-21T09:26:54Z
In the discussion, Joonatan Vuorinen expressed the desire to use ClinicalUseDefinition to model clinical particulars of medications without relying on a centralized substance register, highlighting the difficulties faced with local substance mappings and terminology. The conversation explored the potential benefits of using CodeableReference for greater flexibility in referencing substances while acknowledging concerns about the implications of breaking changes associated with the adoption of such a model in FHIR implementations.
42 comments

With ClinicalUseDefinition being able to model most of the clinical particulars a drug database might have, it'd be nice to be able to package that knowledge up and share it through CRMI. This'd be simpler if the subject could be a CodeableReference, as it'd allow terminology to be used in place of a shared substance register (likely included in or depended on by the package). For example, we have some 1500 substances with some 30000 interactions across them. An enormous package either way, but the Substance resources don't really add much value, given that we'd still have to fall back to terminology in order to map between any local substance register and them.

I suppose this is a case of a global / local problem, where the clinical knowledge is authored against a global (canonical) substance, and is then used against a local substance. For example, in Finland, prescribing is done through a combination of ATC codes and a package identifier called VNR. These are mapped to a local substance identifier. Now, both EMA and the Finnish Medicines Agency Fimea are working on centralised knowledge bases focusing on the FHIR medication definition -module. Neither seems to be directly tackling clinical particulars at the moment, leaving a need for third-party drug databases and CDS -services around them. One such example would be interactions, as mentioned above. So far, our approach for bridging this gap has been focused on terminology; through ValueSet (of, say ATC, RxNorm, and SNOMED CT codes) and/or ConceptMap resources for extracting the global substance from a local resource, like MedicationRequest. (As well as the administration routes, but that's a different discussion, and can be handled rather well with an extension on ClinicalUseDefinition.)

There was a previous discussion about using a code as the subject of a ClinicalUseDefinition being a direction people have been wanting to avoid. Am I missing some context or an obvious solution here? What's the alternative? A national substance register? A regional one, like the EMA SPOR SMS? A custom substance register for each drug database? A shared base CRMI package for canonical substances? Not trying to step on the toes of regulatory work and national knowledge bases, but from my point of view, terminology seems like an easier match for drug databases in the CDS context. Any previous work, ideas or discussions on the topic?

Joonatan Vuorinen2024-10-12T15:01:35Z

At the moment you could achieve this use a reference to a contained resource, that just had a code.

Rik Smithies2024-10-12T15:46:21Z

Sure, but is that going against the intended usage of the resource? I'm trying to understand why a resource reference is preferred. Most of this experimentation we're working on stems from seeing ClinicalUseDefinition on the CRMI IG roadmap, and trying to figure out how we might provide clinical particulars in that form.

Joonatan Vuorinen2024-10-12T16:33:36Z

Would you be able to search by a code that is in a contained resource? Not entirely sure, but I think you can't.

Rutt Lindström2024-10-12T16:41:15Z

Some (more) reasons why resource references are seen as preferred:

  • they are inherently typed, whereas code based solution would need e.g. comparison of content of .system value to string literals to achieve the same
  • they are uniform i.e. same ClinicalUseDefinition can be used to hold info about all the allowed variations of .subject
  • references between resources are designed to work in both directions (in "real" FHIR database, provided that appropriate search params etc. are implemented)
Kari Heinonen2024-10-12T16:56:21Z

It's not the first time we're discussing this, and inbetween current and previous discussion I've talked to other people struggling with the same problem: the resource looks like it would be great for an interaction catalogue, but usually we don't build them between resources, but between terminology concepts.

@Kari Heinonen, your arguments have a theoretical point. However, the resource allows CodeableConcept as the interactant. So... If you can have a concept from terminology as one interactant, why should it not be allowed for the other one (in subject)? Just to make searching more difficult?

So, I created a Jira ticket: https://jira.hl7.org/browse/FHIR-48630

Rutt Lindström2024-10-12T17:06:14Z

Yes. But a) is it explicitly prohibited to "repeat" the .subject reference resource(s) as an .interactant using CodeableConcept ? And b) references form a graph i.e. .subject could list references to multiple "targets" (forming links that can be back tracked) of different types - something that is much harder to accomplish with CodeableConcept semantics for codings contained within.

Kari Heinonen2024-10-12T17:18:23Z

Kari Heinonen said:

Yes. But a) is it explicitly prohibited to "repeat" the .subject reference resource(s) as an .interactant using CodeableConcept ? And b) references form a graph i.e. .subject could list references to multiple "targets" (forming links that can be back tracked) of different types - something that is much harder to accomplish with CodeableConcept semantics for codings contained within.

b)
There are many use cases where you'd find a reference is a better solution.
We're saying CodeableConcept should be allowed - CodeableReference would allow implementers to go with CodeableConcept OR Reference according to what they need to achieve.

a)
It's not explicitly prohibited but semantically it would make exactly zero sense. It would basically say the subject has an interaction with itself. :)

Rutt Lindström2024-10-12T17:25:33Z

Is there any implementation / material available where I could better understand what kind of (typed) subject graphs are used in practice? Or could you maybe summarise some experiences? I can't really see what kinds of different resource types a particular ClinicalUseDefinition might be pointing to. Not an expert on that, though, so I may well be missing something.

Our work covering indications, contraindications, interactions, risks, and various warnings tend to all be authored against substances (and administration routes, which don't seem to belong in the Substance resource either). Now the usage-side of things has the issue of whatever local prescribing system we're dealing with. So far, the best bet there has been terminology mapping, or using a ValueSet. (Edit: certainly, indications and contraindications have the Observation / Condition component to them as well, but those have been typically dealt with as terminologies too on our end.)

Joonatan Vuorinen2024-10-12T17:28:22Z

IMHO ClinicalUseDefinition is a part of much much bigger module that uses other Medication Definitional resources to form a self-standing graph/database. So not just Substances, it would e.g. have *Definition resources for both actual and abstract medical products. Each "product" resource instance having direct reference links (without searching as such) to backtrack to all relevant ClinicalUseDefinition instances.

Kari Heinonen2024-10-12T17:42:04Z

Additional issue that did come to my mind :smile: Concerning directly identifying .subject using terminology instead of reference - happens when multiple codings are needed to achieve the necessary level of fidelity. Doing the search directly on ClinicalUseDefinition might not (?) be that straightforward in FHIR. Of course, sometimes this is actually desired (thinking ATC here), sometimes some "custom known corrections and post search clean ups" are needed. In a way references "shift" this matching to happen on "target resource" side, based on their properties, for better or worse.

Kari Heinonen2024-10-12T18:03:03Z

AFAIK the bigger picture you outlined aligns with how the larger knowledge bases like EMA SPOR approach things. It is very reasonable, but there still seems to be a need to include third-party content for clinical particulars within that graph/database, if we are to have e.g. interaction checks, pharmacogenomics, etc. included. We'll need a way to publish compatible content, which can then be slotted into the graph. Hence the global/local problem I've been on about. We'd need to produce ClinicalUseDefinition resources (and other medication definition resources) that fit into the particular local knowledge base, preferably though CRMI. Maybe EMA SPOR streamlines this in the EU, and we might reference those as canonical. For a clinical knowledge author, it's a lot more manageable when the authoring can be done against a single canonical substance (or product) register. Now, in a perfect world, we'd get the definitional resources straight from the regulatory processes for the clinical particulars as well, but that's still a ways off, I'm afraid.

Perhaps it's still too early to see how things'll pan out. We're not really dead set on using terminologies, but we are very interested in trying to see if we could publish clinical particulars in a way that complements the existing (national) knowledge bases. In the short term, it's looking like terminology is the way.

Joonatan Vuorinen2024-10-12T18:14:30Z

I might be harassing :smile: you at this rather late hour with a solution where .subject contains, say, more product related references and .interactant is based on (global) terminology where some component or combination thereof of .subject product might be the actual .interactant given by code. And then have these referenced .subject product parts as contained, potentially unsearchable, resources with minimum data content (mainly identifiers). That would keep the core of ClinicalUseDefinition searchable using terminology concepts at the cost of making linking to product side more arduous ? Contained Med/Prod resources could possibly represent multiple local product registries (source identified by some property), if so needed, keeping the actual ClinicalUseDefinition core knowledge content intact and purely terminology based. Maybe ? <Insert Big Disclaimer Here>

Kari Heinonen2024-10-12T18:26:21Z

Yes. Every authorised product has a list of indications, contraindications and interactions, which in the future will hopefully be coded and distributed as ClinicalUseDefinition resources. That future is not just around the corner. It takes time.

However, even this would not help a clinician who is prescribing in a generic manner - not a product, but a substance or a virtual concept. The need for a more generic terminology-based decision support catalogue will remain.

For now, it would maybe be the easiest for you to use Medication resource - this would combine substance and route of administration. I do see the benefit of using a terminology with appropriate concept properties, though.
Going for a contained Medication, the searchability would have some limitations, but it should be workable (see this). Estonian attempt at the same thing can be seen here (it's a draft, don't trust too much).

Rutt Lindström2024-10-12T18:34:16Z

Thank you for the discussion, the pointers, and for making the Jira ticket! I'll be sure to give each a proper review as we move forward. ClinicalUseDefinition is one of the more exciting FHIR resources in recent memory, particularly for us dealing with MDR here in EU.

Joonatan Vuorinen2024-10-12T18:50:12Z

You're welcome, except that I lied. Medication resource doesn't have route of administration :)
MedicationKnowledge or AdministrableProductDefinition would have ingredient + route but neither of those resources is allowed to be referenced in .subject :D

Rutt Lindström2024-10-12T19:11:10Z

So needs more interlinked contained resources then :grinning_face_with_smiling_eyes: Plus there's the more serious issue of existing systems using FHIR R4, not R5, which has ClinicalUseDefinition among other potentially relevant definitional resources ...

Kari Heinonen2024-10-12T19:27:31Z

Hmmm, Looking into ePI interaction FHIR IG for Vulcan at
http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-ClinicalUseDefinition-interaction-uv-epi.html
gives me a strong impression that .subject and .interactant are intended to be/allow concepts at different levels of fidelity and having a CodeableReference might present some issues to enforce that. Former has description of "The medication, product, substance ..." and latter talks about "The specific medication ... that interacts" or "The specific substance that interacts" for CodeableConcept. But maybe I'm just splitting semantic hairs with this.

Kari Heinonen2024-10-12T19:58:00Z

For a definitional resource, there isn't really a way of including the specific interacting instance at authoring-time. A code can get us to a Ph. Eur. Monograph, a CAS number, or whatever level of specificity one might need for the global substance code. We'll likely start from SNOMED CT, and go from there.

We're looking at using an extension on ClinicalUseDefinition for the administration routes for now. We'll figure something out for interactions, where we need one for the interactant as well. For a CodeableReference, we'll have to evaluate whether it makes sense to include both the substance and the administration route or not. It'd certainly be useful if a particular ClinicalUseDefinition had multiple subjects. This isn't really the case for the knowledge we author, where each specific article is for a specific substance (or pair of substances). I suppose this is one of those places where we might be misusing the ClinicalUseDefinition resource if its' intended use is to point at a variety of subjects from a single resource. If that's the case, I'd like to hear more about how that actually works. I suppose it'd be useful for condensing something like a long list of subject substances interacting with grapefruit..

Joonatan Vuorinen2024-10-12T20:54:31Z

Joonatan Vuorinen said:

For a definitional resource, there isn't really a way of including the specific interacting instance at authoring-time.

In that context "specific" does not necessarily mean the resource instance per se. What IMO the spec is trying to say is that .subject (which, by the way, seem to have cardinality of 0..*) for example could be a product definition having multiple Ingredients and then .interactant "names" those that are relevant either using reference (and annoyingly needs to follow multiple links to make the "connection" to Ingredient as it is not directly allowed either) or terminology.

Kari Heinonen2024-10-12T21:18:15Z

Right, I get your point about specificity. Not so sure I understand the benefits of having both (re-)defined in a ClinicalUseDefinition if the interactant is more specific. I guess it'd make the graph more explicit, but also deconstructs information about the ingredients of a particular medicinal product into a different resource.

Joonatan Vuorinen2024-10-12T21:26:21Z

FHIR in general tends to do that sort of deconstructing a lot - and developers tend to push back either by adding numerous extensions to "bubble up" data elements from deeper layers of FHIR model and/or using contained resources :smile:

Kari Heinonen2024-10-12T21:30:56Z

Interesting. Just noticed that according to the official spec ClinicalUseDefinition does NOT define standard SearchParameter for interactant.item[x] at all ? I wonder if that is actually correct - this, of course, being something that can be remedied by custom FHIR server implementation.

Kari Heinonen2024-10-14T10:40:43Z

We could definitely improve the list of standard search parameters. I don't think we've had a lot of feedback on what people need to search on. In fact many standard servers allow custom search parameters, so in the short term it may not even need a custom server implementation.

Btw you can also often add a custom search parameter for contained resources. Searching contained resources is supported by FHIR but not well supported by current servers, I understand. But custom search parameters are well supported. The result is that in practice you can usually search into contained resources just fine. And of course an alterative to contained resources is "uncontained" (normal) resources. They work fine right now, but are just a little verbose.

The downside of changing subject from reference to CodeableReference is that it will break every current implementation.

At the moment, afaik, the Medication Definition resources can go from R5 to R6 with no breaking changes. This would be the thing that prevents that. Something to consider. Our implementers may not thank us. We are not in a position where breaking changes are not permitted, but we do have to consider all factors.

Rik Smithies2024-10-14T12:09:27Z

I don't think it's reasonable to refrain from changes in FMM2 resources out of fear of breaking implementations that are not even there yet. You are only starting to hear feedback from people who are implementing those resources.

CodeableReference only became available in R5, so with your logic, it should have never been used almost anywhere. But it is used, even on MedicationRequest and Procedure, which have way more implementers than ClinicalUseDefinition.

Obviously we can't expect every change request to be approved, but maturity level 2 resource should not avoid breaking changes if they bring value to new implementers.

Rutt Lindström2024-10-14T12:35:34Z

Just thinking aloud to double-check my understanding, please bear with me :smile: And shoot me cruelly down if needed.

Currently the impact is that 100% "out-of-the-box" searching to find interaction for given product(s) etc. would be solely based on resources referenced by .subject list. Soooo - would that mean that for example to represent interaction between,

  • on one side, mutually "different" brands of medicinal products A and B both containing substance X
  • on the other side, medicinal product C containing substances Y and Z
  • where X and Y are "the culprits"

Needs to
a) have at least 5 outgoing links in .subject to cover search both by product and substance plus
b) "duplicate" the two actually interacting substances (likely using code) as .interactants
c) potentially (i.e. without normal resources to reference) have a rather large bunch (depending on whether Medication or MedicinalProductDefinition etc. is used as search anchor in .subject) of contained, interlinked resources repeated in each ClinicalUseDefinition - provided that support does exist in server in the first place

IMHO that is a rather complex structure to maintain, at least in the scale of comprehensive FHIR interaction knowledge base.

Kari Heinonen2024-10-14T12:55:04Z

The one thing we would absolutely want to avoid is coupling the publishing process of an interaction catalogue with all of the local knowledge bases (read: substance & product registers) it interfaces with. Substances tend to have a publishing cadence of roughly up to four times a year. Local registers update much more frequently, as I understand the biweekly cadence of the Finnish basic register is on the slower side of things. If we had to map each of the products as subjects for each ClinicalUseDefinition, it'll be a no-go for now. Us producing our own generic substance register and distributing that as a part of, say, an interaction catalogue is a workaround that might work fine -- but it still disconnects the references made by this third-party knowledge about clinical particulars from the actual graph a particular local knowledge base has built for itself.

(Edit: This is especially important for CDS services operating under MDR, where it just isn't possible to publish biweekly; much less daily. Quarterly would work fine, if we can defer the local mappings to terminologies that we can handle separately.)

Joonatan Vuorinen2024-10-14T13:08:01Z

@Kari Heinonen re a) Why would you use subjects of substances when you already have that substance in the product ingredient. Products can already linked to their ingredient substances.
@Joonatan Vuorinen are you saying you only want to map to substances and not products? That is allowed. No one is forcing you to use products I think.

Rik Smithies2024-10-14T13:32:31Z

Rik Smithies said:

re a) Why would you use subjects of substances when you already have that substance in the product ingredient. Products can already linked to their ingredient substances.

Because depending on where you start on product side there are multiple and more importantly different "hoops" to go through to associate product and substance - some use Substance directly, some go Ingredient/SubstanceDefinition route; some references, so to say, "go this way and some that way" in relation to where one wants the search to be directed. That is not particularly nice from developer perspective.

Kari Heinonen2024-10-14T13:44:09Z

@Rik Smithies Yes. If we were doing this with terminologies, we'd have, say SNOMED CT 386963006 as a subject, which is the Ph. Eur. Monograph 2769 and the INN 6539. We've had success automatically mapping from the Finnish basic register to these substances through the product identifiers or ATC codes used in prescribing today.

If there eventually is some substance register that does this, and to which we can point a canonical reference, it'd work for us. AFAIK, EMA SPOR SMS is aiming to be that in the EU, but I haven't found how that would work in practice. Then there's the relation to a local knowledge base, such as the one Fimea is working on in Finland. Would we still reference SMS substances, or something else?

Granted, these are early days, and I'm sure there are still many things to see through. Just trying to give context around how terminology would make this easier for us at present.

Joonatan Vuorinen2024-10-14T13:47:54Z

EMA SPOR SMS is available and I'm quite sure that FIMEA and KELA both have mappings to it, so in a way it makes sense to use it.
However, it's still a code system, and more difficult to use than SNOMED CT as it's still quite raw.

Rutt Lindström2024-10-14T14:16:05Z

@Rik Smithies Also, given the critical nature of the information itself, controlled amount of data redundancy might not be a bad thing. To be able to check that .interactant substance matches one of the referenced, referenced substance does in fact belong to some of the referenced product etc. Simply to catch obvious errors that are otherwise buried much deeper within the FHIR model.

And then there's the case of interacting Substance without it being an ingredient of any medicinal product - either the product does not currently belong to (national) product registry or it is out-of-scope of medicinal products altogether. I seem to recall there being some quite well known cases of that - and if .interactants can not be searched directly based on terminology that usually do have these ...

Kari Heinonen2024-10-14T14:18:43Z

@Kari Heinonen the models allow different levels of detail in some places e.g. just a code for an ingredient or a reference to a bigger structure. But a given implementation would not generally use both methods. So it is uncommon to have to write code for two methods and you don't tend to get "go this way and some that way" in actual use.

I don't personally like the idea of de-normalizing the data to avoid a somewhat complicated search. That duplicated data may itself be confusing for clients. But if that is your choice you are free to do so, but you would also have to accept your own consequences of making the data larger, redundant, and more complex to maintain.

You could always create a custom operation to make searching easier.

Rik Smithies2024-10-14T15:04:38Z

That does not cover the use case of @Joonatan Vuorinen where the "operational medicinal product database" is NOT governed by the same organization supplying the interaction knowledge, correct ? So ClinicalUseDefinition would have only rather limited idea at what level/path between medicinal resources is used in the environment where it is integrated to. Hence preference for using de-normalization or "lowest common denominator" for any medicinal registry.

Kari Heinonen2024-10-14T15:22:22Z

I suppose if you are pointing at data that in effect has different implementations within it, then yes you will need to allow for that.

I would imagine you would know what data you were pointing at before hand, and would notice if the implementation changed (anything could change in theory - they may start using contained resources one day ;-) ).

But ultimately yes there is some flexibility in the method/level of detail that all FHIR resources capture (e.g. dumb example, but someone's name may be found via reference.reference or in reference.display, so you need to code for both in theory).

So, unless you are able to constrain one of the versions out, then you will need to accommodate both. If it is too hard for your clients you could add an operation the does the hard work behind the scenes (and still allow more sophisticated clients to do it the "vanilla" way).

I would not clone the data to make that work. There is no need. But if you want a different workaround then feel free.

Rik Smithies2024-10-14T17:38:40Z

The longer this topic has gotten, the more I feel this is a relevant question:

Is the medication definition module intended to be used such that a ClinicalUseDefinition implements a third-party drug database for decision support? I.e. is it fundamentally designed to be such that a single (national) implementer builds the graph and that's it -- or is it supposed to support a scenario where multiple clinical content providers add to that graph?

Looking at the current documentation, I get the impression that what is marked as "prescribing support" is exactly the kind of thing I've been trying to describe. Is that the case, or have I mistaken the intended purpose? If I am mistaken, then perhaps some rewording of the docs might help avoid further confusion, especially around the CRMI roadmap, which otherwise aligns with the kind of knowledge we author around clinical reasoning.

We have no real trouble with using a Substance for now, whether it be a contained resource or not. We could reference some canonical substance, if and when such a register exists and is accessible both to us and the prescribing system (e.g. an EHR). Sounds like EMA SPOR SMS is just an export for non-regulatory actors. What to reference, then, if we'd like to make a ClinicalUseDefinition for SMS_ID 100000092656 (which is the example INN I used earlier)? The actual substance we are pointing to is known to the molecular structure at authoring-time. How a particular local system decides to build their own registers isn't. I cannot read between the lines whether we are doing something that is simply wrong.

We're not trying to be difficult here, and if it turns out that what we're trying to do is fundamentally incompatible with the module, then we'll find another way of modelling CDS for medications, and leave the FHIR integration to something like a CDS Hooks API.

Joonatan Vuorinen2024-10-14T18:08:47Z

It is for all such uses. Basicially any situation where you need to talk about indications, interactions etc. Resources are data oriented. Whenever you have that data, in any setting, or architecture, you use that resource. We don’t always predict or document all use cases, but that doesn't mean it is not appropriate.

Rik Smithies2024-10-14T20:01:23Z

At this point I'll play the "That's a good question" card :big_smile: and see myself out. Maybe the obvious should also be noted: resource ids essential to creating references are server dependent (and I don't think we are going to have canonicals for all substances, medications etc.). Sorry for dragging this discussion on.

So the 3rd party CDS content package needs to be somehow "imported" into the prescribing system UNLESS the ids that ClinicalUseDefinition use in references come from that same system (so that CDS content can be directly POSTed to server endpoint). Which kinda speaks for an architecture of a central medication database with real-time API for EHRs instead of "publishing and distributing CDS content" separately. Alternatively the CDS content package must contain big and detailed enough fragment of its own relevant FHIR resource graph to allow the client to figure out the mapping.

Kari Heinonen2024-10-14T20:43:08Z

Right but there is nothing to stop you using the id (and server address) of a resource on another server, pre-allocated by that server. Obviously you need to know what that id is, before referencing it. But that applies to clients making references to resources on your "own" server also. Naturally if your system involves several servers you will need some assurances that the resources are going to stick around, but that is a business level problem.

Rik Smithies2024-10-14T21:24:06Z

Here are two examples, one that Rutt provided earlier, and one from Finland. These are the kinds of "local registers" we want to interface with:

  1. EETISMedicationEPC
  2. Kanta MedicationListMedication

Both of these are drafts of the Medication resources that a prescribing system and a national medication list would use. You might say that these are the resources that a ClinicalUseDefinition should refer to as a subject, but I'd like to underline that for any medical device under MDR, the lead time from a notified body alone is easily over a month. As such, there's no chance we could have a satisfactory publishing cadence with these resources being the subject. The authored knowledge is tied to substances, and for any region using Ph. Eur., those change three times a year. INN lists have similar cadences, as well. Local product registers might change daily. There's a massive discrepancy, regardless of how efficient we might try to be. Sure, this could be a moot point, if we could somehow determine that CDS based on these resources isn't a medical device -- but i'd rather not dive into that ditch here.

Neither example has a Substance resource defined at all. The Estonian example points to a separate CodeSystem containing the substances, and the Finnish example seems to just go by ATC. As such, there is no substance register (i.e. FHIR server accessible to both us and the prescribing system) to reference.

It is possible for us to map from either of these resources to our own Substance definition, i.e. to a SNOMED CT code, or some other precise definition. For the Estonian example, it's a mapping from this CodeSystem, likely with a ConceptMap. For the Finnish example, it's a mapping from either the ATC code or the product identifier (VNR). The product identifier can be mapped to an internal substance id (like the Estonian one) from a separate database export that Fimea publishes. From there, we can build similar ConceptMap resources. With terminology, we can integrate with both local systems today.

Without a CodeableReference, we'll have to publish our own Substance register as a part of our drug databases. It isn't a huge deal, but it really is just an extra step with little added value. Every clinical content provider has to provide their own, given that there is no incentive to share these canonical substance registers. And even if we do share, the connection to any local register still happens through terminology or some external id, losing the nice property of being able to navigate the graph through references.

Furthermore, EMA SPOR SMS doesn't seem to provide a FHIR server that non-regulatory actors (i.e. clinical content providers and EHRs) can access, and that we could then point canonical Substance references to. The Finnish medication knowledge base (lääketietovaranto, described in Finnish here) doesn't directly mention a FHIR server for substances either. It may well end up such that both provide CSV and/or XML exports, like they do today, even when the project is completed in ~2026 or onwards. This leaves us with terminologies in that case as well.

I hope I could illustrate the benefits of using a CodeableReference as the subject. I get that it's a tradeoff, and the negative side of the breaking change is something that has to weighed, as well.

Joonatan Vuorinen2024-10-15T08:00:16Z

hi Joonatan

Thanks. It is easy to see that someone may want to refer to external content that doesn't have a Substance resource defined.

Currently, in R5 (which is likely to be the only version with software support for a couple more years, and so will represent a significant amount of implementations), you would need to create a "dummy" resource to be able to reference this.

This is verbose, but since no user ever sees it, and data is large and verbose anyway, it doesn't seem to matter all that much. The resource can be contained, or not. There isn't much advantage in using contained. It may look slightly neater, but how neat things look isn't all that important. I would really not call this "making your own substance catalogue". It's just some plumbing - a shim. The data is full of such connections.

The advantage of this approach is that it works now and all references will be the same (in your system and in others that do define their own substances). Searching will work just fine, out of the box.

I can see that using a direct "code reference" has some advantages, but it won't be practical for a couple of years probably, because of the timeline for R6, and the fact that software support tends to have a significant time lag after a version of FHIR is developed. Any solution based on this code reference would likely never be able to exchange these resources with systems that exist or are in development now (until the R5 system was updated - and if R6 has no big functional advantage, the effort, including migrating all the existing data, would be unlikely to ever happen, imho).

Consequently a single, well intentioned, change like this may be responsible for splitting the world's data into two incompatible versions.

Rik Smithies2024-10-15T10:24:29Z

Thank you all for the discussion once more. I don't really have much more to add. For now, we will extract our own canonical Substance definitions into a separate FHIR package, which will then be a dependency for all of our drug databases containing ClinicalUseDefinition resources.

Joonatan Vuorinen2024-10-15T10:44:21Z
The discussion revolves around an issue with observation-based population in a FHIR implementation, where the expected answer field is absent in the returned questionnaire response. Participants provide insights on required extensions for proper functionality, suggest alternative implementations, and discuss the necessity of making certain fields mandatory to improve clarity and usage.
36 comments
DH

I am trying to make a minimal example using observation-based population, I created patient, got id=2, and then created observation, questionnaire (got id =6) as follows, and then GET request to base url/Questionnaire/6/$populate?subject=2, get a questionnaireResponse back, however the item did not include answer field. Any help are appreciated @Brenin Rhodes and others!

patient

{
    "resourceType": "Patient",
    "meta": {
        "profile": [
            "http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient|7.0.0"
        ]
    },
    "name": [
        {
            "family": "Shaw",
            "given": [
                "Amy"
            ]
        }
    ]
}

observation

{
    "resourceType": "Observation",
    "id": "f002",
    "status": "final",
    "code": {
      "coding": [
        {
          "system": "http://loinc.org",
          "code": "21112-8",
          "display": "Birth Date"
        }
      ]
    },
    "subject": {
      "reference": "Patient/2"
    },
    "effectivePeriod": {
      "start": "2013-04-02T10:30:10+01:00",
      "end": "2013-04-05T10:30:10+01:00"
    },
    "issued": "2013-04-03T15:30:10+01:00",
    "valueDateTime": "1970-01-01"
  }

questionnaire

{
    "resourceType": "Questionnaire",
    "id": "questionnaire-sdc-no_obs_window",
    "meta": {
        "profile": [
            "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-pop-obsn"
        ]
    },
    "url": "http://hl7.org/fhir/uv/sdc/Questionnaire/questionnaire-sdc-profile-example-ussg-fht",
    "version": "1.0.0",
    "name": "questionnaire-sdc-no_obs_window",
    "title": "Questionnaire with no Observation Window",
    "status": "active",
    "subjectType": [
        "Patient"
    ],
    "item": [
        {
            "linkId": "1",
            "definition": "http://loinc.org/fhir/DataElement/21112-8",
            "code": [
                {
                    "system": "http://loinc.org",
                    "code": "21112-8"
                }
            ],
            "text": "Date of Birth",
            "type": "dateTime"
        }
    ]
}

got
questionnaireResponse

{
  "resourceType": "QuestionnaireResponse",
  "id": "6-2",
  "contained": [
    {
      "resourceType": "Questionnaire",
      "id": "6",
      "meta": {
        "source": "#KTMtHdFc0t1W48aK",
        "profile": [
          "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-pop-obsn"
        ]
      },
      "url": "http://hl7.org/fhir/uv/sdc/Questionnaire/questionnaire-sdc-profile-example-ussg-fht",
      "version": "1.0.0",
      "name": "questionnaire-sdc-no_obs_window",
      "title": "Questionnaire with no Observation Window",
      "status": "active",
      "subjectType": [
        "Patient"
      ],
      "item": [
        {
          "linkId": "1",
          "definition": "http://loinc.org/fhir/DataElement/21112-8",
          "code": [
            {
              "system": "http://loinc.org",
              "code": "21112-8"
            }
          ],
          "text": "Date of Birth",
          "type": "dateTime"
        }
      ]
    }
  ],
  "extension": [
    {
      "url": "http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-questionnaireresponse-questionnaire",
      "valueReference": {
        "reference": "#6"
      }
    }
  ],
  "questionnaire": "http://hl7.org/fhir/uv/sdc/Questionnaire/questionnaire-sdc-profile-example-ussg-fht",
  "status": "in-progress",
  "subject": {
    "reference": "Patient/2"
  },
  "item": [
    {
      "linkId": "1",
      "definition": "http://loinc.org/fhir/DataElement/21112-8",
      "text": "Date of Birth"
    }
  ]
}
Lei Zhou2024-10-15T20:20:58Z

The Clinical Reasoning module implementation of $populate available in the JPA Starter Server only supports Expression based population.

Brenin Rhodes2024-10-15T20:49:11Z

super thanks @Brenin Rhodes ! Is there any implementation of this or Structuremap based population that you know of, if HAPI did not support?

Lei Zhou2024-10-15T20:54:24Z

LHC-Forms from this list support observation based

Lei Zhou2024-10-15T21:11:15Z

I think the csiro renderer can do it to.

Brian Postlethwaite2024-10-15T21:12:21Z

And my server has support too.

Brian Postlethwaite2024-10-15T21:12:36Z

Your questionnaire definition is missing the extension at the root to indicate to perform an obs pre-pop.

Brian Postlethwaite2024-10-15T21:14:22Z

@Brian Postlethwaite besides the following, what extension do I need? thanks!

"meta": {
        "profile": [
            "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-pop-obsn"
        ]
    }
Lei Zhou2024-10-15T21:37:34Z

You need the one that indicates the period of observations to scan.

Brian Postlethwaite2024-10-15T22:17:08Z

(I need to look up what it is)

Brian Postlethwaite2024-10-15T22:17:21Z

Observation LinkPeriod

Brian Postlethwaite2024-10-15T22:18:23Z

thanks! good to know, I thought it is optional

Lei Zhou2024-10-16T00:29:45Z

https://build.fhir.org/ig/HL7/sdc/populate.html#observation-based-population
Bullet point 3. is the section to refer to in the spec to see that.

Brian Postlethwaite2024-10-16T00:31:19Z

thanks @Brian Postlethwaite ! Just to learn more, is there any reason that not making this field a required field in this, if it does not work without it?

Lei Zhou2024-10-16T02:02:30Z

That's actually a really good idea, can you log that as a change request?

Brian Postlethwaite2024-10-16T02:03:27Z

would love to. I am really new to FHIR, could you let me know how to do that

Lei Zhou2024-10-16T02:04:43Z

Excellent, at the bottom of the spec page you referenced above there's a link to peopose a change that you follow then fill out the fields.
If you don't have a user account in jira there, I believe there's a link to create a new account. (@Lloyd McKenzie )

Brian Postlethwaite2024-10-16T02:06:26Z

Then you can post the jira issue number back here so we can follow it up easily.

Brian Postlethwaite2024-10-16T02:06:58Z

thanks! will do

Lei Zhou2024-10-16T02:07:04Z

If you have any troubles, let us know and we can assist.

Brian Postlethwaite2024-10-16T02:07:28Z

the jira ticket created

Lei Zhou2024-10-16T17:15:53Z

Thanks.

Brian Postlethwaite2024-10-16T21:04:03Z

Brian Postlethwaite said:

That's actually a really good idea, can you log that as a change request?

If you make observationLinkPeriod required in Populatable Questionnaire, then wouldn't it be required to have the extension on every item in the Questionnaire?

Paul Lynch2024-10-16T22:46:26Z

We could require it with an invariant that allows the value at the root to inherit

Lloyd McKenzie2024-10-16T22:47:51Z

You're right, I've misread things.
But I do think that should be at the root.

Brian Postlethwaite2024-10-16T22:48:13Z

There should be at least 1 in the questionnaire.

Brian Postlethwaite2024-10-16T22:48:42Z

Lloyd McKenzie said:

We could require it with an invariant that allows the value at the root to inherit

In the Questionnaires where I've used observationLinkPeriod, I only wanted a couple of questions to be prepopulated, not all of the questions in the Questionnaire.

Paul Lynch2024-10-16T22:52:43Z

Do you need a linkPeriod if you're happy regardless of how old the data is?

Lloyd McKenzie2024-10-16T22:54:56Z

Lloyd McKenzie said:

Do you need a linkPeriod if you're happy regardless of how old the data is?

Yes. observationLinkPeriod is the signal that you want Observation-based prepopulation to occur for the item.

Paul Lynch2024-10-16T22:58:09Z

So my proposal for tomorrow would be to include an invariant to need that extension somewhere, and also permit it at the root of questuonnaire (which then applies to any)

Brian Postlethwaite2024-10-16T22:59:16Z

What would the convention be for saying "I don't care about the period"?

Lloyd McKenzie2024-10-16T22:59:46Z

99years?

Brian Postlethwaite2024-10-16T23:01:10Z

There are at least some patients for whom that's not old enough.

Lloyd McKenzie2024-10-16T23:05:35Z

I hope to be one of them (eventually)...

David Hay2024-10-16T23:21:12Z

Lloyd McKenzie said:

There are at least some patients for whom that's not old enough.

Which is I why I use 100 years, not just 99. :-) You could always pick 1000 years.

Paul Lynch2024-10-16T23:25:51Z

Re-reading the spec, it already states:

For observations where how recent they are does not matter (e.g. blood type), simply set the duration to a long period of time - e.g. 200 years.

https://hl7.org/fhir/uv/sdc/STU3/populate.html#obs-pop

Brian Postlethwaite2024-10-16T23:28:23Z
Canada Health Infoway is analyzing different architectural approaches to managing language translations in FHIR to develop best practices for Canada, while seeking input on successful strategies from other jurisdictions, particularly related to terminology and non-coded elements. Participants discussed various practices regarding the handling of display names, language translations, and the storage and maintenance of terminology in different coding systems across different countries.
30 comments

Canada Health Infoway is preparing an analysis of the different architectural approaches to managing language translations in FHIR, including making recommendations around best practices for use in Canada. We plan to share the document in case others find it useful.

As part of that work, we're interested in learning what approaches other jurisdictions have taken and what's worked well/not so well with those approaches. The project is particularly focused on language support for terminology, but information about language support for non-coded elements is also welcome. Specific questions include:

  • Are display names sent in instances, or are clients and servers expected to look up displays from terminologies?
  • If display names are included in instances, does the client control what they are, and if so, how do they do so?
  • Are systems expected to store and retain display names they receive?
  • Who is responsible for maintaining language translations for codes for different code systems?
  • Are translations maintained in FHIR, and if so, do you use ValueSet, CodeSystem or CodeSystem supplements to do so?
  • Any other insights/advice?

If you don't feel comfortable sharing your comments publicly, private messages are also welcome.

Lloyd McKenzie2024-03-10T15:07:54Z

@Giorgio Cangioli @Oliver Egger @Rutt Lindström @João Almeida

Jose Costa Teixeira2024-03-10T18:48:47Z

We have a central national clinical data repository and central terminology management. A lot of the terminology is coded locally and only available in Estonian. Of course, we use international terminologies as well, and they are always translated into Estonian. All data recorded in the national EHR repository must be available in Estonian.

Are display names sent in instances,
Yes
or are clients and servers expected to look up displays from terminologies?
They could, but not sure they have the habit.

If display names are included in instances, does the client control what they are, and if so, how do they do so?
Display names and additional designations are published in central value sets. These have been published as csv files so far, but are now also available in FHIR format (not in production yet, but nearly there).

Are systems expected to store and retain display names they receive?
The source of truth is the central repository. Local processing of data is not under our control.

Who is responsible for maintaining language translations for codes for different code systems?
This differs by code systems. Normally, the translations made by the original publisher are used by other systems as well.

Are translations maintained in FHIR, and if so, do you use ValueSet, CodeSystem or CodeSystem supplements to do so?
In FHIR, the translations are given in CodeSystems and CodeSystem Supplements. Supplements are used when a) the CodeSystem is maintained outside our reach (like HL7 code systems); b) when ValueSet is determined to use translations that are unacceptable in the CodeSystem (e.g. extreme abbreviations of terms of SNOMED CT concepts). All ValueSets use Estonian display names.
I find it cumbersome to use supplements, I would prefer to have translations in the original CS or straight in the VS. We try to avoid supplements, but we still have plenty. :)

Any other insights/advice?
I'm not sure what it means to "maintain translations in FHIR", so maybe my answers went offtopic a bit.
We have CodeSystems where the translations are authored/maintained in a dedicated system and FHIR is just used for publishing. But we also have a basic tool for authoring/maintaining specifacally FHIR terminology, and it also supports multiple languages. It's designed so that we can use it for creating FHIR resources from existing non-FHIR sources, but also actively maintain existing FHIR terminology resources.

Happy to give a demo of our free-range CSV to FHIR migration work or the new authoring tool if anyone's interested. Or explain any other aspects further.

Rutt Lindström2024-03-10T19:48:16Z

What I really like is the possibility in R5 to define default properties to be included in the ValueSet expansion.
And what I really miss is the similar option for designations. I would like to include certain types of designations in the default expansion, but those types would be different for every value set, so I would like to have it configurable like I can do it with properties.

Rutt Lindström2024-03-10T20:11:58Z

I think you can

Grahame Grieve2024-03-10T20:18:41Z

In that case, let me rephrase my issue: "I wish I was smarter".
I don't want to hijack the thread with my issue though.

Rutt Lindström2024-03-10T20:21:15Z

Let me split my answers in two how this is done/plan to be done in the European Cross-border services (MyHealth@EU) and some personal considerations.
Please consider that MyHealth@EU services are based on some specific assumptions that doesn't apply for all the cases.

Giorgio Cangioli2024-03-11T08:28:03Z

Are display names sent in instances, or are clients and servers expected to look up displays from terminologies?

MyH@EU display names are recorded in the exchanged instances. During the exchange the used designations are checked against the information maintained in a central terminology server.
No additional expectations on the receiver side.

my opinion: as told, MyHealth@EU is a very special case. IMO, in general, display names should be recorded in the instances allowing the receiver to lookup designations against terminology services if able to do so.

Giorgio Cangioli2024-03-11T08:28:54Z

If display names are included in instances, does the client control what they are, and if so, how do they do so?

MyH@EU: no specific expectations.

my opinion: The behavior should be flexible, because it strongly depends on the context of use and on the capabilities of the receivers. A simple display tool may rely on the information included in the instances; a receiving system operating in a mature infrastructure integrated with terminology services may take advantage of the capabilities offered by this context.

Giorgio Cangioli2024-03-11T08:30:13Z

Are systems expected to store and retain display names they receive?

MyH@EU: no expectations beside the capability of displaying the content by using the translated information included on the exchanged instance (with one exception)

my opinion: if provided, the original designations should be somehow kept

Giorgio Cangioli2024-03-11T08:30:50Z

Who is responsible for maintaining language translations for codes for different code systems?

MyH@EU: EU Member States
my opinion: depends on the context

Giorgio Cangioli2024-03-11T08:31:46Z

Are translations maintained in FHIR, and if so, do you use ValueSet, CodeSystem or CodeSystem supplements to do so?

MyH@EU: not for the time being, even though the used Terminology Server support the concept of ValueSet and CodeSystem. Plan to provide support to FHIR in the next future.

my opinion: this is what I expect it should happen

Giorgio Cangioli2024-03-11T08:32:40Z

Any other insights/advice?

Enhance somehow the capability of instances to support different kinds of designations, because real systems are not always connected to terminology services.

Giorgio Cangioli2024-03-11T08:33:11Z

In Belgium, for the moment, there are no carved-in-stone rules for the use of different languages. However, there is the real concern to have the "orginal at the time of entry" description available, because that is considered to be the legally valid one if problems arise. So next to the current "display" for a code, which has no real status linked to it and can be in any language, people are requesting here to have next to display a field that contains the description "as it was at the time of the data entry" and is also marked as such.

Bart Decuypere2024-03-14T16:14:36Z

.display is supposed to be the "defined by the dictionary" value. Shouldn't the CodeableConcept.text represent "as it was at time of entry"?

Daniel Venton2024-03-14T17:23:32Z

Lloyd McKenzie said:

for :flag_switzerland:

Are display names sent in instances,

yes

or are clients and servers expected to look up displays from terminologies?

yes if they want to translate to other languages

If display names are included in instances, does the client control what they are, and if so, how do they do so?

the display names for the different languages are provided, so the client should not control, however currently we raise only a warning during validation

Are systems expected to store and retain display names they receive?

For the Swiss EPR yes (implicitly), otherwise there are no requirements up till now

Who is responsible for maintaining language translations for codes for different code systems?

eHealth Suisse, a government organization which is responsible to translate for SNOMED CT and CodeSystem / ValueSets for the national patient record

Are translations maintained in FHIR, and if so, do you use ValueSet, CodeSystem or CodeSystem supplements to do so?

For SNOMED eHealth Suisse works with other countries for translations, for other CodeSystem (or until they are integrated with SNOMED CT) we use CodeSystem supplements and ValueSets

Oliver Egger2024-03-14T20:32:14Z

Daniel Venton said:

.display is supposed to be the "defined by the dictionary" value. Shouldn't the CodeableConcept.text represent "as it was at time of entry"?

Well, maybe, but if I read the definition of ".text", it captures two things:
1) the original text at the point of data entry
2) some specification if the chosen entry does not fully cover the intent of the practitioner.

This might be difficult if you have both needs at the same time. Concatenation of both needs could be a solution, but it is highly unelegant. A separate field for the original text at the point of data entry (maybe by means of an extension) would be preferable.

Bart Decuypere2024-03-15T07:52:32Z

why would you need both at the same time? How would you know what the intent is if it's not the text entered by the practitioner? (If there's no text, then you get to ask that question)

Grahame Grieve2024-03-15T09:32:40Z

One case is: a valueset with an "other"-like value: there you would want to specify which choice you made (in fact the color was 'blue'), and you would want to know what the original phrasing was in the original language. There are subtle differences between "neither" and "none" as "other"-like values in English as a source language. Or for the discovery of false encodings: e.g. in French the difference between "variole" et "varicelle" is little when choosing from a drop down list. If there is an additional spec for what is exactly affected, you have the combination of both items. (I believe the same is true in English for smallpox and chickenpox). This type of mistakes are at this moment in time being discussed in the SNOMED on FHIR workgroup.

Bart Decuypere2024-03-15T10:03:12Z

CodeableConcept.text is what the user saw or typed when the concept was selected. It might be one of the formal displays for one of the codings, or it might be something else.

Lloyd McKenzie2024-03-15T14:34:45Z

OK, that means that if you need both
1) the original text at the point of data entry
2) some specification if the chosen entry does not fully cover the intent of the practitioner.
you have to concatenate the two values. If that is what the standard says, it be so.

Bart Decuypere2024-03-15T15:09:25Z

In France, the situation is very close to the Estonian description, thanks @Rutt Lindström :)

I have a related question : In a local profile (another language than en), when we want to refer to an international CS/VS (in whole), what is the best way to keep these int. CS/VS while adding local display codes ?

For example, say we want to add local display to maritalStatus : code M = marié.
We can :

  • update the int. CS v2-0002 (OID 2.16.840.1.113883.18.179) with the french display in the designation part of each codes, like it has been done for the german language. Then the FR profile could use the int. CS/VS without adding anything new.
  • Keep the CS unmodified and create a new VS for the FR profile containing the local display codes. But the main drawback is the creation of a new VS just for this purpose. Moreover, as several countries uses french, it ends with multiples VS but with the same purpose.

A lot of CS/VS are in that configuration. It could be very efficient to reduce the total number of the resources designing the same concepts by adding the localized codes, imho.

Frédéric Laurent2024-03-17T11:00:09Z

The terminology validation rules state that the only display values allowed in an instance are those defined in the original code system or those defined in a CodeSystem supplement that's available to the validator. Displays introduced in a value set can't be used in an instance.

Lloyd McKenzie2024-03-17T14:37:52Z

Thanks @Lloyd McKenzie for the supplement point that I forgot.

I reformulate my question concerning to the best practice to have localized CS/VS (I suppose this is a question in many countries).

If in a local profile we refer to a international CS/VS (say v2-002 for the sample) but with the need of having the localized displays, we have 2 main options :

  • Create a supplement, e.g a new CS resource referencing the Intl. CS v2-002 with all the localized displays. Create a new VS resource referencing this supplement : 2 new resources. The translated terms are in the CS, which can be reused in other VS
  • Create a new VS resource referencing the Intl. CS and define the translated terms in the VS resource : 1 new resource. The translated terms are in the VS, and have to be repeated if we need another VS using the CS.

Is there a best place to put the translated codes ?

Another point, if only 1 local language is required : we can set the translated terms in the display of each code and use the global language attribute, or add a designation on each code.

Is there a best practice ?

Frédéric Laurent2024-03-21T19:11:27Z

for me, best practice is :

  • put the displays in a language supplement
  • don't put the displays in the value set unless they are value set specific
  • use designations - it's clearer
Grahame Grieve2024-03-21T20:35:57Z

Lloyd McKenzie said:

Canada Health Infoway is preparing an analysis of the different architectural approaches to managing language translations in FHIR, including making recommendations around best practices for use in Canada. We plan to share the document in case others find it useful.

@Lloyd McKenzie, was this analysis you mentioned ever published or shared by Infoway? I did a bit of googling but haven't been able to find anything. I'd be interested to read it if it's available somewhere!

Rob Nickerson2024-10-16T15:37:51Z

Thanks for the poke @Rob Nickerson. The final 'pretty' version isn't posted anywhere that I'm aware of, but the near-final content can be found here: https://docs.google.com/document/d/12Qb2Eu5dNk85TspFjgLSVxiY3Ygzejpt36ODnJt07NE

Lloyd McKenzie2024-10-16T16:13:14Z

Much appreciated @Lloyd McKenzie , this looks really helpful!

Rob Nickerson2024-10-16T16:19:50Z

this is not quite true:

The ValueSet resource contains a similar concept.designation element to that found in CodeSystem and it serves a similar purpose.  However, while CodeSystem can define designations in various languages, ValueSet only exposes those already defined.  It cannot introduce new designations.

Grahame Grieve2024-10-16T21:55:20Z

"It cannot introduce new designations allowed to appear in instances" I guess would be the correct framing?

Lloyd McKenzie2024-10-16T22:59:13Z
Deepak Tiwari sought clarification on the applicability of search parameter constraints to different operations (read, search, create, update, delete) in the context of FHIR scopes, highlighting concerns about server performance and implementation complexities. Josh Mandel and others discussed the potential for combining these constraints across operations, emphasizing the need for server-side checks while recognizing that different servers might support varied subsets of scope logic.
30 comments
DT

Hello everyone,
I have few questions around Section 2.2.2.3 which is related to Finer-grained resource constraints using search parameters.

  1. As I can't find any examples of this anywhere, are these constraints also applicable to read (.r) operations or are they only specific to search (.s) operations?
    For an exapmle, below scope

patient/Observation.rs?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory

Should we consider it to be:

patient/Observation.r
patient/Observation.s?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory

Or this:

patient/Observation.r?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory
patient/Observation.s?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory

patient/Observation.rs?category=laboratory

is this a valid scope? Or should we only support code values when requested with url like

patient/Observation.rs?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory

  1. Are these constraints also valid for .c, .u & .d operations? Are we expecting any mandate for supporting these constraints on write scope in future?
Deepak Tiwari2024-06-25T18:09:34Z

These constraints can be used with any combination of cruds. They limit the subset of resources on which these interactions can be invoked.

Josh Mandel2024-06-25T18:18:29Z

Thanks Josh for clarifying that.
That makes this scope

patient/Observation.rs?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory

as:

patient/Observation.r?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory
patient/Observation.s?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory

Is this correct?

Deepak Tiwari2024-06-25T18:52:32Z

That's right. Scopes can be combined or exploded on "cruds" interactions when everything else is identical.

Josh Mandel2024-06-25T18:53:39Z

Understood. Also It would be great if you could check the second question as well and clarify it.

Deepak Tiwari2024-06-25T18:54:39Z

One more thing,
When requested with scope

patient/Observation.rs?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory

If Observation 1 is of category laboratory and Observation 2 is of category exam
In this case, GET Observation/1 should give out valid response whereas GET Observation/2 will throw Not Authorized (Invalid request) kind of response. Is this correct?

Deepak Tiwari2024-06-25T19:01:02Z

Basically, yes. We don't mandate what kind of error response the server returns, but generally it is good practice not to reveal information about whether a resource exists if the caller is not authorized to see it, so a 404 could be a good recommendation here.

Josh Mandel2024-06-25T19:03:38Z

Hello @Josh Mandel. I'd like to raise these important concerns about applying FHIR search parameter logic within SMART scopes for create, update, and delete operations and highlight significant considerations regarding FHIR server performance, resource validation, and the practical implementation of access control mechanisms.

I understand the requirements to limit the searched resources for some categories of Observations or Condition because it's a very broad and contextual resources. As you and @Dan Cinnamon mentioned here:#smart>SMART 2 Fine-Grained Scopes with search parameters shouldn't be overstated.

However, following this approach from the FHIR Server perspective to process deletion — for example, [base url]/Observation/[id] with the scope [user|patient|system]/Observation.d?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory — the system needs to perform the following actions under the hood:

  1. Find the requested resource with the defined scope parameter.
  2. If the resource matches, then perform the deletion.

So, we always double the actions on the FHIR server side.

Another issue I see is using the same scope parameter for the "c" (create) scope. To achieve this we need to move resource validation from the FHIR API to precede scope evaluation, which is what we call FHIR profile validation. Another issue encountered here is: who will guarantee the consistency of the combination of scope parameters and it's values? The FHIR specification defines what the FHIR system should do if search parameters are incorrect, but not for some string linked with & applying to create resources.

I'd like to ask @Grahame Grieve  and @Lloyd McKenzie : What are your thoughts about applying search parameters logic and the FHIR search specification as SMART scope parameters for create, delete, or update operations?

Andrew Krylov2024-10-15T16:02:32Z

Hmm, are you proposing a change to the grammar or just calling out that servers may only want to support a subset of the scope language that makes sense in their context of use?

Josh Mandel2024-10-15T16:15:26Z

My interpretation of the above mentioned syntax leads to that basically all requests ends up being conditionally executed :thinking:

Jens Villadsen2024-10-15T17:19:33Z

Serverside that is

Jens Villadsen2024-10-15T17:19:43Z

That would be pretty bummer to do dynamically ...

Jens Villadsen2024-10-15T17:24:25Z

Because you need human-friendly language, icons etc., I would expect the mapping between the SMARTv2 scopes and the set of criteria you use to share data under that scope would happen at dev time, not at run time. I can't imagine how you could possibly create a user-friendly authorization page based on fully dynamic SMARTv2 scopes.

Cooper Thompson2024-10-15T17:25:09Z

Who determines what user friendly is?

Jens Villadsen2024-10-15T17:28:32Z

Just visiting any slightly popular website these days users need to navigate in all kinds of weird cookie T&C's about what they are willing to share and how they are tracked (or not)

Jens Villadsen2024-10-15T17:30:14Z

That didnt really seem to be an issue even though the user experience is totally tanked

Jens Villadsen2024-10-15T17:30:46Z

What I mean is that when you have a user making a decision to approve a scope or not, you'd want this:

Vital Signs - Information about basic diagnostic measurements including heart rate, temperature, and blood pressure, such as the type, status, date, and value of the measurement and any associated comments by your care provider.

not this:

Observation.rs?category=vitalsigns

Cooper Thompson2024-10-15T17:31:56Z

This (scope descriptions and user-facing language) is a side issue, but FWIW I think there are reasonable and scalable ways to present user-friendly authz screens from standardized scope language expressions. These approaches involve some work, but you can have a base of "common" scopes covering your 80%, then generate algorithmic descriptions of a wider class of additional scopes, expanding the common set over time based on real-life usage.

At baseline these (fallback) algorithmic descriptions could be based on terminologies and FHIR metadata (e.g., concatenating strings from resource, search param, and terminology metadata); and depending on your perception of the trade-offs, these could potentially augmented with 1) showing users any data in their current record that matches the scopes, and 2) using LLMs to generate best-effort friendly descriptions.

Overall, servers that want to generate the friendliest possible user-facing descriptions have plenty of things they can try. Servers that don't want to don't have to.

Josh Mandel2024-10-15T17:35:17Z

I'm not sure how servers could generally generate algorithmic descriptions, since the human-semantic meaning of scopes could be based on codes from value sets that the server may not have access to at run-time. I agree this is a side issue, but if it ends up being true that you always need a dev-time assessment of SMARTv2 scopes, than that seems to avoid some of the problems being presentd.

Cooper Thompson2024-10-15T17:47:01Z

meaning of scopes could be based on codes from value sets that the server may not have access to at run-time

This technique depends on the (authz) sever having access to the terminologies that are used in the (fhir) server. This may not be something you have automatically or for free, but it's not an exotic requirement -- and it's not all/nothing. It scales down... so to put it in a "glass half full" perspective, this technique works for any scopes that use terminology you do have access to.

Josh Mandel2024-10-15T17:56:17Z

Jens Villadsen said:

My interpretation of the above mentioned syntax leads to that basically all requests ends up being conditionally executed :thinking:

One trick that I can share from Firely Server is that we evaluate these scopes against an in-memory repository. So we index the resources (in case of an update or create), check if the authorization system would allow the execution of the action (incorporating the fine-granular scopes in that decision) and then execute the operation against the real database. Yes, it doesn't come for free, but it's not super slow either.

Alexander Zautke2024-10-15T18:06:46Z

Andrew Krylov said:

Another issue I see is using the same scope parameter for the "c" (create) scope. To achieve this we need to move resource validation from the FHIR API to precede scope evaluation, which is what we call FHIR profile validation. Another issue encountered here is: who will guarantee the consistency of the combination of scope parameters and its values? The FHIR specification defines what the FHIR system should do if search parameters are incorrect, but not for some string linked with & applying to create resources.

In case you want to support arbitrary scopes, you need to check the syntax with some kind of parser. I personally gave up checking in the authorization server to see if the value is allowed for the search parameter. Everything else is doable. In any case it's not a requirement that the request already fails at auth time, you could also leave it up the FHIR server to reject the scope.

Alexander Zautke2024-10-15T18:13:33Z

Alexander Zautke said:

Jens Villadsen said:

My interpretation of the above mentioned syntax leads to that basically all requests ends up being conditionally executed :thinking:

Yes, it doesn't come for free, but it's not super slow either.

I agree ... It wont come for free, thats for sure.

Jens Villadsen2024-10-15T18:23:35Z

@Alexander Zautke Could you explain or share more details (like a step-by-step algorithm) on how we can perform a request for DELETE /Observation/123 with the scope <scope level>/Observation.d?category=laboratory? I understand that we should:

  1. Fetch/Find/Navigate to the target resource.
  2. Parse the scope expression and perform a check for scopes.
  3. If it matches, delete the target resource.

With this parameter, we generally perform three steps instead of one without scopes. Am I right?

Andrew Krylov2024-10-15T20:48:35Z

@Josh Mandel This scope parameter <scope level>/Observation.crd?category=laboratory should be applied to all actions listed in the scope. From this example, if we perform a create interaction, do we need to apply the expression category=laboratory for create as well as for read and delete? So, in my example, d is the last action in the scope, then the parameter follows. And this parameter doesn't relate only to d; it is also applied to c and r?

Andrew Krylov2024-10-15T20:54:27Z

Yes. These are the steps. I was saying that when we perform a match of the scopes in our server, we 1) retrieve the resource 2) index the resource in-memory 3) Execute the matching against that in-memory resource, by essentially seeing if a virtual search request using the parameters from the scopes would match the resource 3) execute the delete

Alexander Zautke2024-10-15T20:55:41Z

Yes, the parameters apply to all the interactions that you include in your scope. If you need to apply different parameters to different interactions you would break up the scope accordingly (e.g. decomposing into one patient/Observation.cr?... and one patient/Observation.d?...).

Josh Mandel2024-10-15T21:03:42Z

Jens Villadsen said:

My interpretation of the above mentioned syntax leads to that basically all requests ends up being conditionally executed :thinking:

Yes, but applying these conditions is not part of the generic FHIR specification for servers. Everything is possible. Applying these FHIR search criteria for search requests is okay—the cost of these requests will be identical to the initial client request. The client asks for a search, and the server performs the search by just changing search parameters following the scopes. But for creation, update, delete, or history requests, the server needs to fetch the request data (the client doesn't ask about it but has to "pay"—wait for the response, utilize infrastructure) and then perform some checks to apply the search parameter logic. And for creating a new resource, it will be another approach. Imagine you have 100,000,000 Observations or even 100 mln x10 (it absolutely real) that in the database. Implementing these requirements on the server will be too costly for the clients.

Andrew Krylov2024-10-15T21:05:05Z

Thank you @Alexander Zautke and @Josh Mandel for the clarification

Andrew Krylov2024-10-15T21:06:12Z

@Andrew Krylov what do you mean? There's a lot of 'conditionals' in the spec: https://build.fhir.org/http.html- which can be inferred server side based on whatever token was handed out to the client and eventually resolved server side which can then be embedded for evaluation.

Jens Villadsen2024-10-15T21:20:23Z
Jens Villadsen inquired about the support for the backport of the ObservationDefinition.component extension to FHIR R4, encountering issues with snapshot generation due to a defined type conflict. Grahame Grieve acknowledged the problem as a bug in his code and mentioned that cross-version extensions are still being developed, with Gino Canessa focusing on resolving these issues.
24 comments

@Grahame Grieve is http://hl7.org/fhir/5.0/StructureDefinition/extension-ObservationDefinition.component supported as backport extension to R4? Sushi seems to allow it but the IGP chokes in the snapshot generation:

Publishing Content Failed: Error generating snapshot for /Users/jkiddo/work/thp-core-ig/fsh-generated/resources/StructureDefinition-THPObservationDefinition(THPObservationDefinition): Unable to generate snapshot for http://thp.trifork.com/fhir/core/StructureDefinition/THPObservationDefinition in /Users/jkiddo/work/thp-core-ig/fsh-generated/resources/StructureDefinition-THPObservationDefinition because StructureDefinition http://hl7.org/fhir/5.0/StructureDefinition/extension-ObservationDefinition.component at Extension.extension.value[x]: invalid constrained type @ObservationDefinition.qualifiedValue from base64Binary, boolean, canonical, code, date, dateTime, decimal, id, instant, integer, markdown, oid, positiveInt, string, time, unsignedInt, uri, url, uuid, Address, Age, Annotation, Attachment, CodeableConcept, Coding, ContactPoint, Count, Distance, Duration, HumanName, Identifier, Money, Period, Quantity, Range, Ratio, Reference, SampledData, Signature, Timing, ContactDetail, Contributor, DataRequirement, Expression, ParameterDefinition, RelatedArtifact, TriggerDefinition, UsageContext, Dosage, Meta in http://hl7.org/fhir/5.0/StructureDefinition/extension-ObservationDefinition.component (00:00.206 / 00:54.603, 484Mb)
                                                                                                     (00:00.002 / 00:54.605, 484Mb)
Use -? to get command line help                                                                      (00:00.000 / 00:54.606, 484Mb)
                                                                                                     (00:00.000 / 00:54.606, 484Mb)
Stack Dump (for debugging):                                                                          (00:00.000 / 00:54.606, 484Mb)
java.lang.Exception: Error generating snapshot for /Users/jkiddo/work/thp-core-ig/fsh-generated/resources/StructureDefinition-THPObservationDefinition(THPObservationDefinition): Unable to generate snapshot for http://thp.trifork.com/fhir/core/StructureDefinition/THPObservationDefinition in /Users/jkiddo/work/thp-core-ig/fsh-generated/resources/StructureDefinition-THPObservationDefinition because StructureDefinition http://hl7.org/fhir/5.0/StructureDefinition/extension-ObservationDefinition.component at Extension.extension.value[x]: invalid constrained type @ObservationDefinition.qualifiedValue from base64Binary, boolean, canonical, code, date, dateTime, decimal, id, instant, integer, markdown, oid, positiveInt, string, time, unsignedInt, uri, url, uuid, Address, Age, Annotation, Attachment, CodeableConcept, Coding, ContactPoint, Count, Distance, Duration, HumanName, Identifier, Money, Period, Quantity, Range, Ratio, Reference, SampledData, Signature, Timing, ContactDetail, Contributor, DataRequirement, Expression, ParameterDefinition, RelatedArtifact, TriggerDefinition, UsageContext, Dosage, Meta in http://hl7.org/fhir/5.0/StructureDefinition/extension-ObservationDefinition.component
    at org.hl7.fhir.igtools.publisher.Publisher.generateSnapshots(Publisher.java:6888)
    at org.hl7.fhir.igtools.publisher.Publisher.loadConformance(Publisher.java:5672)
    at org.hl7.fhir.igtools.publisher.Publisher.createIg(Publisher.java:1227)
    at org.hl7.fhir.igtools.publisher.Publisher.execute(Publisher.java:1066)
    at org.hl7.fhir.igtools.publisher.Publisher.main(Publisher.java:13615)
Caused by: org.hl7.fhir.exceptions.FHIRException: Unable to generate snapshot for http://thp.trifork.com/fhir/core/StructureDefinition/THPObservationDefinition in /Users/jkiddo/work/thp-core-ig/fsh-generated/resources/StructureDefinition-THPObservationDefinition because StructureDefinition http://hl7.org/fhir/5.0/StructureDefinition/extension-ObservationDefinition.component at Extension.extension.value[x]: invalid constrained type @ObservationDefinition.qualifiedValue from base64Binary, boolean, canonical, code, date, dateTime, decimal, id, instant, integer, markdown, oid, positiveInt, string, time, unsignedInt, uri, url, uuid, Address, Age, Annotation, Attachment, CodeableConcept, Coding, ContactPoint, Count, Distance, Duration, HumanName, Identifier, Money, Period, Quantity, Range, Ratio, Reference, SampledData, Signature, Timing, ContactDetail, Contributor, DataRequirement, Expression, ParameterDefinition, RelatedArtifact, TriggerDefinition, UsageContext, Dosage, Meta in http://hl7.org/fhir/5.0/StructureDefinition/extension-ObservationDefinition.component
    at org.hl7.fhir.igtools.publisher.Publisher.generateSnapshot(Publisher.java:6969)
    at org.hl7.fhir.igtools.publisher.Publisher.generateSnapshots(Publisher.java:6886)
    ... 4 more
Caused by: org.hl7.fhir.exceptions.DefinitionException: StructureDefinition http://hl7.org/fhir/5.0/StructureDefinition/extension-ObservationDefinition.component at Extension.extension.value[x]: invalid constrained type @ObservationDefinition.qualifiedValue from base64Binary, boolean, canonical, code, date, dateTime, decimal, id, instant, integer, markdown, oid, positiveInt, string, time, unsignedInt, uri, url, uuid, Address, Age, Annotation, Attachment, CodeableConcept, Coding, ContactPoint, Count, Distance, Duration, HumanName, Identifier, Money, Period, Quantity, Range, Ratio, Reference, SampledData, Signature, Timing, ContactDetail, Contributor, DataRequirement, Expression, ParameterDefinition, RelatedArtifact, TriggerDefinition, UsageContext, Dosage, Meta in http://hl7.org/fhir/5.0/StructureDefinition/extension-ObservationDefinition.component
    at org.hl7.fhir.r5.conformance.profile.ProfileUtilities.checkTypeDerivation(ProfileUtilities.java:2996)
    at org.hl7.fhir.r5.conformance.profile.ProfileUtilities.updateFromDefinition(ProfileUtilities.java:2827)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processSimplePathWithOneMatchingElementInDifferential(ProfilePathProcessor.java:688)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processSimplePath(ProfilePathProcessor.java:251)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processPaths(ProfilePathProcessor.java:181)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processPathWithSlicedBaseDefault(ProfilePathProcessor.java:1227)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processPathWithSlicedBase(ProfilePathProcessor.java:1016)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processPaths(ProfilePathProcessor.java:187)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processSimplePathWithEmptyDiffMatches(ProfilePathProcessor.java:888)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processSimplePath(ProfilePathProcessor.java:248)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processPaths(ProfilePathProcessor.java:181)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processPaths(ProfilePathProcessor.java:155)
    at org.hl7.fhir.r5.conformance.profile.ProfileUtilities.generateSnapshot(ProfileUtilities.java:750)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processSimplePathWithOneMatchingElementInDifferential(ProfilePathProcessor.java:613)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processSimplePath(ProfilePathProcessor.java:251)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processPaths(ProfilePathProcessor.java:181)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processSimplePathDefault(ProfilePathProcessor.java:379)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processSimplePath(ProfilePathProcessor.java:255)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processPaths(ProfilePathProcessor.java:181)
    at org.hl7.fhir.r5.conformance.profile.ProfilePathProcessor.processPaths(ProfilePathProcessor.java:155)
    at org.hl7.fhir.r5.conformance.profile.ProfileUtilities.generateSnapshot(ProfileUtilities.java:750)
    at org.hl7.fhir.igtools.publisher.Publisher.generateSnapshot(Publisher.java:6961)
    ... 5 more
Jens Villadsen2024-10-15T11:05:12Z

I don't know. weird error. how would I reproduce?

Grahame Grieve2024-10-15T11:17:18Z

I'll make a sample IG for you ...

Jens Villadsen2024-10-15T11:47:23Z
Jens Villadsen2024-10-15T11:55:37Z

but you can't do this:

Grahame Grieve2024-10-15T12:34:38Z

it's not a valid R5 extension definition

Grahame Grieve2024-10-15T12:34:47Z

the exception isn't sensible, but what you're doing is not sensible

Grahame Grieve2024-10-15T12:34:59Z
Jens Villadsen2024-10-15T12:36:54Z

cross version extensions aren't published yet

Grahame Grieve2024-10-15T12:38:09Z

So how would I know whats 'sensible'?

Jens Villadsen2024-10-15T12:39:12Z

well, Observation.component exists in both R4 and R5, so it's not a valid cross-version extension

Grahame Grieve2024-10-15T12:39:46Z

This is ObservationDefinition not Observation

Jens Villadsen2024-10-15T12:40:25Z

oh so it is

Grahame Grieve2024-10-15T12:40:50Z

let me check again

Grahame Grieve2024-10-15T12:40:56Z

no, this is just a bug in my code. I'll put it on my list to fix

Grahame Grieve2024-10-15T12:58:39Z

Any branch I could watch for?

Jens Villadsen2024-10-16T10:40:59Z

I'm not sure how quickly I'll get to it. Depends on @Gino Canessa because it's dead code once he starts producing a revised set of cross-version extensions

Grahame Grieve2024-10-16T10:49:55Z

But its the snapshot generation that fails :thinking:

Jens Villadsen2024-10-16T11:04:10Z

so what's your point?

Grahame Grieve2024-10-16T11:22:21Z

you're saying the extensions will change definition?

Jens Villadsen2024-10-16T11:34:52Z

the definition of the cross-version extension is the problem. I'm defining it wrongly

Grahame Grieve2024-10-16T11:37:38Z

Got it

Jens Villadsen2024-10-16T11:37:56Z

Getting this done is my primary focus right now, so hopefully not too long ( :fingers_crossed: ). The last round of decisions invalidated large swaths of my previous iteration, so it's a bit of a grind at the moment.

Gino Canessa2024-10-16T15:04:50Z
Bart Decuypere seeks clarification on the impact of different CodeSystem content modes on validation, noting that both the "#fragment" and "#example" modes generate errors but differ in severity. Grahame Grieve confirms that while "#complete" should treat unknown codes as errors, both "#fragment" and "#example" should primarily result in warnings, suggesting a clearer error messaging is needed.
17 comments
AG

Hi,

One of my implementers is thinking about his codesystems/valuesets, and he finds himself in trouble deciding which CodeSystem content mode to use (https://hl7.org/fhir/R4/valueset-codesystem-content-mode.html).

He would like to know what the influence of each of the content modes is on validation. What are the error - warning - information conditions for each of the values in the content mode. Based on that, he would like to make his decision. Is there some documentation on that? Could someone draw the table of all combinations?

Bart Decuypere2023-12-14T12:42:15Z

If content is complete, unknown codes are treated as errors

Grahame Grieve2023-12-14T12:49:45Z

For fragments and examples, it’s a hint

Grahame Grieve2023-12-14T12:50:00Z

I don’t think it makes a difference otherwise

Grahame Grieve2023-12-14T12:50:12Z

Both #fragment and #example produce errors, but different ones, and #example far more than #fragment.
#fragment: https://build.fhir.org/ig/hl7-be/mycarenet/qa.html
#example: https://build.fhir.org/ig/hl7-be/mycarenet/branches/issue-93/qa.html

Bart Decuypere2023-12-14T13:46:29Z

@Grahame Grieve A table might be necessary to bring some light into the darkness...

Bart Decuypere2023-12-14T13:47:45Z

well, this combination does not make me happy:

Grahame Grieve2023-12-14T15:18:41Z
Grahame Grieve2023-12-14T15:18:47Z

@Grahame Grieve How do we proceed? Do I make a Jira-issue?

Bart Decuypere2023-12-14T16:06:59Z

well, that one should be just one warning - the error is spurious

Grahame Grieve2023-12-14T16:19:24Z

How do you feel about these, #example should only produce warnings, shouldn't it? Why is it nagging about #complete?
image.png

Bart Decuypere2023-12-14T16:23:12Z

well, it's not complete because it's just an example. But (a) the message could be clearer and (b) that's supposed to be a warning too

Grahame Grieve2023-12-15T08:50:49Z

thanks for drawing those to my attention

Grahame Grieve2023-12-15T08:57:48Z
Bart Decuypere2023-12-19T11:52:08Z

@Grahame Grieve I have follow up question over here. If i want to validate a CodeSystem and the content mode is "Example" or "fragment" the ideal validation result would be with warnings?

Incase i want to expand or look up for code inside the CodeSystems via Valueset, should that be a problem?

Eg. http://hl7.org/fhir/ValueSet/service-type - This Value includes https://www.hl7.org/fhir/R4/codesystem-service-type.json.html as the CodeSystem. How should it behave ideally?

Abhishek garg2024-10-17T09:26:54Z

sure you should get warnings for that

Grahame Grieve2024-10-17T09:44:46Z

and lookup and expand should work, sure

Grahame Grieve2024-10-17T09:44:56Z
new channels
#Announcements
Several new channels have been created by various members, including #PACIO Personal Functioning and Engagement by Dave Hill and #Babylon (Aggregate FHIR terminology) by Nikolai Ryzhikov. Other notable channels include #HL7 CAM by Alejandro Benavides and #FHIR for Pets by Grahame Grieve.
15 comments

Dave Hill created a new channel #PACIO Personal Functioning and Engagement.

Notification Bot2024-05-24T21:29:17Z

Nikolai Ryzhikov created a new channel #Babylon (Aggregate FHIR terminology).

Notification Bot2024-05-28T11:30:27Z

Jean Duteau created a new channel #Da Vinci PR.

Notification Bot2024-06-04T20:59:22Z

Sanja Berger created a new channel #german/dguv.

Notification Bot2024-06-05T08:45:11Z

Alejandro Benavides created a new channel #HL7 CAM.

Notification Bot2024-06-11T13:59:38Z

Biswaranjan Mohanty created a new channel #Enhancing Oncology.

Notification Bot2024-07-16T03:29:07Z

Abbie Watson created a new channel #fsh-tooling.

Notification Bot2024-07-23T21:17:48Z

deadwall created a new channel #google-cql-engine.

Notification Bot2024-08-25T20:47:17Z

Artur Novek created a new channel #FHIRest.

Notification Bot2024-09-03T10:51:04Z

Aaron Nusstein created a new channel #US Behavioral Health Profiles.

Notification Bot2024-09-04T13:16:45Z

Nagesh Bashyam created a new channel #UDS-Plus.

Notification Bot2024-09-21T13:07:32Z

Grahame Grieve created a new channel #FHIR Foundation.

Notification Bot2024-09-22T10:49:37Z

Grahame Grieve created a new channel #FHIR for Pets.

Notification Bot2024-10-09T11:14:41Z

Koray Atalag created a new channel #Digital Twins on FHIR.

Notification Bot2024-10-17T09:40:54Z

Preston Lee created a new channel #Meld.

Notification Bot2024-10-18T17:27:25Z
The discussion revolves around the utility of RESTful APIs in FHIR, with Alexander Breusov suggesting a more unified operation approach could simplify implementation and usage, while Rik Smithies and others argue that the established HTTP verbs like PUT, GET, and POST effectively support FHIR's needs, and that replacing them could hinder interoperability due to the familiarity and widespread adoption of REST. The consensus leans towards maintaining the current REST framework, as it has proved successful and stable over the years, while recognizing the role of operations for more complex interactions.
11 comments
  1. Standard means unification, but since $operations introduction there are two levels for operation name: HTTP verb, i.e. PUT/DELETE/etc. and URL part, i.e. $validate/$submit/etc., which is actially OPERATION on $operation like POST $submit
    Unified solutution may include $put/$delete/etc. as part of FHIR API, while HTTP REST verbs like GET and POST are only necessary on transport level.

  2. Standard means unification, so far future versions of resource oriented FHIR may use resources for API as well, like Request with operationName, operationParameter properties and Response, while HTTP (or other transport protocols) may be used for requests/responses transportation only.

Alexander Breusov2024-10-10T09:58:41Z

hi Alexander, interesting ideas but I am not seeing the advantages.
Part of what makes FHIR successful is that people (and software) already know HTTP and REST. Why replace PUT with $put when HTTP (and all the tools etc) support PUT already?
What do you mean by "only necessary on transport level"? Is GET transport level but $put not somehow?
Operations are intended for the things that HTTP doesn't support out of the box.
What would the advantage of replacing the basic REST verbs with these other things?
Are you trying to do SOA, where everything is a named operation?
REST seems like a race to the bottom in terms of sophistication (a few dumb verbs), but it was successful.
Some other paradigm will come along, but it would need to be a popular one if FHIR was to get leverage from it as it has from REST.

Rik Smithies2024-10-10T10:26:12Z
  1. While not prohibited, hopefully people are hopefully not defining operations to do things exactly equivalent to what can be done via a simple RESTful interaction. I generally delineate 'simple' interactions for REST and more complicated requests for operations. For example, when creating a Bulk Data Export request we could have designated a resource that is POSTed with a request and used to track progress, but the community chose to generally model those things as operations instead of as discrete request data objects.
    -
    Arguments could be made over which is better, purer, etc., but I think we have a pretty good balance between the simplicity of RESTful calls for 'general' interactions and good frameworks for the more complicated stuff.
    -
    Note that none of this prevents you from defining a different paradigm / API surface / etc., and even proposing it for inclusion in the spec. But given the normative state of those areas of the specs and the adoption they have seen, I would discourage something that is a mostly a modification to the existing REST API (I doubt it would get enough support to be core and thus would only hurt interop instead of expanding it).

  2. I am not sure exactly what you are driving towards here. We already have other transport paradigms in FHIR (e.g., Messaging). Since RESTful calls are ambiguous without the verb, it is included in the resources used (Bundle.entry.request.method).
    -
    I agree that it could have been done differently (e.g., by using URL segments as you describe, headers, other elements, etc.), but it would be a very breaking change to a lot of implementations to modify that today. If there is a compelling reason (e.g., as Rik talks about), it does not hurt to describe it. There is text around a few different approaches on the FHIR Services page (see Implementation Approaches). I will also note the Orchestration, Services, and Architechture Work Group (formerly Service-Oriented Architecture) which (I think =) covers some of these types of interests.

Gino Canessa2024-10-10T14:22:34Z

The one area where I see operations as being superior to REST is if you want to avoid having to do orchestration of multiple REST APIs for something that needs to be done atomically. So if you need several resources and other information like an event code that must to be handled as a unit, operations a good alternative to REST (alongside batches, transactions, and messages).

Cooper Thompson2024-10-10T14:32:16Z

Hi Rik, Gino, Cooper, thank you for willing to answer to my question. I see I must clarify myself.
1. Unification of operation placement may simplify FHIR server implementation, usage and support. As far as I know, out of the box HTTP PUT is rarely used and can only write file to filesystem, so, anyway special software for FHIR specific things like validation, database manipulation must be developed. So, I don't see simplicity, contrarily, I see server configuration for PUT, more complex operation resolving, more complex PUT based user client instead of simple GET/POST based web browser. The same for other verbs. I can imagine REST API with operation as verb and parameters as URL like POST CoverageEligibilityRequest + GET CoverageEligibilityResponse. I can imagine SOA API with verb as transportation method (with or without body) and URL as operation+parameters like POST Patient/$put or GET Patient/$delete, but I cannot understand the idea of combined REST+SOA API with both DELETE Patient and POST CoverageEligibilityRequest/$submit. Even backward compatibility looks like irrelevant for FHIR.
2. Keeping all the data about request/response together in a single json may simplify these data manipulation. Using Bundle with .timestamp, .entry.request.method, .entry.request.url, etc. is really good solution.

Alexander Breusov2024-10-13T15:57:15Z

hi Alexander

I don't know why you would say that PUT is rarely used. Do you mean because a single resource update is not useful? I agree that other orchestrations may be needed, and that is where operations do come in. But PUT is useful it seems.

PUT writes to the FHIR server. PUT is not limited to some sort of first level commit, as might be suggesting. However you choose to let clients update data, the server will need to do the same work (be it filesystem, database etc), so I don't yet know why PUT would not be sufficient.

Also the server can already do whatever validation it chooses to, on a PUT.

So I don't yet see any rationale for change based on these factors.

Rik Smithies2024-10-13T17:15:55Z

We use the base HTTP verbs without operations when the semantics fit - create, update and delete. We use operations for things that don't fit the semantics of the HTTP verbs. $submit is not the same thing as 'create'. No resource is created. No resource id is returned. No existing instance is revised. There are a lot of situations that don't fit into the limited CRUD semantics of the HTTP verbs. But that doesn't mean we should avoid using those verbs when we can. I'd say that 75% plus of FHIR interoperability is over the base HTTP verbs. Custom operations is 15-20% and the rest is messaging exchanges that don't involve HTTP at all. As soon as you get into the operation space, there's the challenge of standardizing the input and output arguments. The benefit of the HTTP verbs is that there's no possibility for customization. What goes in and what comes out is quite nailed down. That may feel limiting, but it's great in terms of robust interoperability (which is our primary objective).

Lloyd McKenzie2024-10-14T03:22:27Z

As a side note, FHIR's approach to REST has been in use for over 10 years and is pretty widespread, so an alternative would have to have a huge upside to have a hope of justifying the transition effort to the market. At the moment, I'm not seeing it in what you've proposed.

Lloyd McKenzie2024-10-14T03:24:08Z

Hi Rik
Rik Smithies said:

I don't know why you would say that PUT is rarely used. Do you mean because a single resource update is not useful?

PUT is just a sample. Unlike FHIR, most HTTP servers serve browsers' requests GET and POST, while other verbse are not in use. REST is rarely used, and, as we see, REST does not cover all FHIR requirements, so $operations are necessary.

Also the server can already do whatever validation it chooses to, on a PUT.

Sure, FHIR servers are as they are already created. But I care about FHIR servers' creation process itself.

Alexander Breusov2024-10-20T07:28:19Z

Hi LLoyd
Lloyd McKenzie said:

As a side note, FHIR's approach to REST has been in use for over 10 years and is pretty widespread, so an alternative would have to have a huge upside to have a hope of justifying the transition effort to the market. At the moment, I'm not seeing it in what you've proposed.

This "side note" looks like the main point. I completely agree that rebuilding steady working things is a bad idea, but I think that FHIR is not so far from the beginning. It's already clear that REST is not enough for API, while more features will be added. And I'm sure, many new FHIR servers will be developed, while existing ones will be redeveloped once as a part of regular cycle. Anyway, I also agree that everything should be done at the right moment.

Thank you for the answer.

Alexander Breusov2024-10-20T08:09:12Z

hi @Alexander Breusov maybe you have the answers you need now but I don't really understand your reply to my points.

You say "REST is rarely used".

If you mean that FHIR rarely uses REST then I don't think that is true. If the argument hinges on this then it would be good to understand why you say this.

It is true that FHIR APIs often add operations to plain REST, to round out the API. So 100% REST FHIR may not be all that common (e.g. $validate is often used, which is not REST, arguably). I don't see why that would mean it is better not to use the existing HTTP primitives and replace them with something that no one is familiar with.

Rik Smithies2024-10-20T12:43:51Z
Ardon Toonstra inquired about creating a datatype profile for CodeableConcept that includes a binding at the root level, which led to a discussion on the limitations of current tools like Forge and FSH regarding this approach. Ewout Kramer noted that binding at the root is forbidden per the specification, but suggested an alternative method for achieving similar functionality, highlighting the need for potential changes to the FHIR specification.
11 comments
EK

I would like to create a datatype profile on the CodeableConcept datatype that includes a binding on CodeableConcept level itself, not the .coding. This would prevent me from having to add the binding in the profile that will use this CodeableConcept profile.

Is this (or should this be) possible?

Ardon Toonstra2024-10-01T07:11:19Z

I think so

Grahame Grieve2024-10-01T09:40:31Z

I can't add the binding within Forge on the root of the CodeableConcept , also don't seem to be able to do this with FSH.

Ardon Toonstra2024-10-01T12:57:34Z

You can do it in FSH, but you need to drop into the caret syntax to do it:

Profile: MyBoundCodeableConcept
Parent: CodeableConcept
* . ^binding.strength = #required
* . ^binding.valueSet = Canonical(MyValueSet)

Ideally, it would be nice if you could say * . from MyValueSet inside the CodeableConcept profile, but it seems SUSHI does not like that, probably because the root element does not have a type.

Chris Moesel2024-10-01T13:17:30Z

@Chris Moesel thanks. That seems to work.
@Ward Weistra we should perhaps deep dive into why this is not supported by Forge.

Ardon Toonstra2024-10-01T15:31:52Z

Bumped into other problems further down the line. The java and the .net validator do not pick up the valueset binding.

When generating a snapshot in Forge or using the HL7 Validator, the binding from the dataset profile is ignored and reverts to the default from the base resource.

Got some test data attached in a zip file here :)

test-datatype-profile-with-binding-on-root.zip

Ardon Toonstra2024-10-09T07:58:40Z

The reason we erase it is that it is forbidden to put a binding on the root, see here: https://hl7.org/fhir/elementdefinition.html#interpretation

Ewout Kramer2024-10-17T09:01:14Z

Column "Constraint definition, first element", row "binding".

Ewout Kramer2024-10-17T09:01:43Z

I'm not saying the usecase isn't valid, and it would not even be hard to implement, but it would require a change to the spec.

Ewout Kramer2024-10-17T09:03:08Z

Thanks Ewout for pointing to the right place in the spec...

As I really think this is a nice-to-have for profilers, I have submitted: https://jira.hl7.org/browse/FHIR-48664

Ardon Toonstra2024-10-17T09:27:26Z

Oh. Good find, @Ewout Kramer! For required bindings, I think profilers could approximate this constraint by doing an open slicing on CodeableConcept.coding by value and specifying a 1..1 slice with the bound value set. It's not pretty, but it might get the job done.

Chris Moesel2024-10-17T12:28:23Z
The discussion centers on using definition-based extraction for a questionnaire in FHIR, specifically how to correctly set the definition field for extracting resource data with extensions. Participants suggest incorporating extensions in FHIRPath and discuss challenges with the Android SDK's limitations regarding extraction of these fields, with a proposal to raise a tracker item for clarification in the specification.
11 comments
KJ
NS

When using definition based extraction to extract resources, what will be the right way to add definition for a questionnaire where resource can be extracted with extensions.

Ex. Following is an sample questionnaire
{
"type" : "Questionnaire",
...
"item":[
{
"type": "choice",
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",
"valueCodeableConcept": {
"coding": [
{
"system": "http://hl7.org/fhir/questionnaire-item-control",
"code": "drop-down",
"display": "Drop Down"
}
],
}
}
],
"definition" : "???????",
"linkId": "religion",
"text": "Religion",
"answerOption": [
{
"valueCoding": {
"code": "1013",
"display": "Christian",
"system": "http://terminology.hl7.org/CodeSystem/v3-ReligiousAffiliation"
}
},
{
"valueCoding": {
"code": "1023",
"display": "Islam",
"system": "http://terminology.hl7.org/CodeSystem/v3-ReligiousAffiliation"
}
},
]
}
]

}

Patient(http://build.fhir.org/ig/WorldHealthOrganization/smart-anc/StructureDefinition-anc-patient.html) resource has field patient-religion which is an extension.
Now I wanted to know what value I need to put in the definition field(??????), to get the answer extracted?

Let me know if there are any working examples which I can look at. anc-patient.PNG

Nitin Sabale2022-03-22T11:49:17Z

I don't think we've talked about this. My leaning would be for the FHIRPath to allow the 'extension' element - so you could use extension('whatever').value. Can you submit a tracker item for us to talk about this and make it explicit in the spec?

Lloyd McKenzie2022-03-22T13:39:48Z

It's the value from the elementdefinition.id in the referenced StructureDefinition isn't it?

Brian Postlethwaite2022-03-22T20:44:13Z

If you use that form and create some a QR you can try out the $extract on that server.

Brian Postlethwaite2022-03-22T20:49:04Z

Lloyd McKenzie said:

I don't think we've talked about this. My leaning would be for the FHIRPath to allow the 'extension' element - so you could use extension('whatever').value. Can you submit a tracker item for us to talk about this and make it explicit in the spec?

Hi @Lloyd McKenzie , should we raise a tracker item in Jira?

Kashyap Jois2022-03-24T08:54:30Z

Brian Postlethwaite said:

It's the value from the elementdefinition.id in the referenced StructureDefinition isn't it?

Thanks, the example that you shared with the server works! We did some debugging and found that the implementation of the extraction piece in android fhir sdk is restricted to fields present in the resource .java:class (i.e. org.hl7.fhir.r4.model.*) . So that means extensions cant be extracted using splicing since it is not supported in the SDK.

cc: @Jing Tang

Kashyap Jois2022-03-24T11:09:29Z

@Kashyap Jois - yes please

Lloyd McKenzie2022-03-24T16:17:55Z

Wondering if the android SDK was updated to support this now?
I believe that the SMILE one now supports it.
I've also just updated my server (via the open source dotnet Q validator) to validate the Definition property too - which is called by the form tester in the fhirpath lab...

Brian Postlethwaite2024-10-16T00:56:51Z
David Jaffe is encountering a validation failure when using an open-choice QuestionnaireResponse in R4, specifically when submitting a valueString, which is expected to either match a coding option or be a free-text entry. The discussion highlights ongoing confusion regarding the handling of open-choice types, with Brian Postlethwaite clarifying that R4 allows for both coded answers and free-text, while Jaffe seeks workarounds due to potential delays in HAPI FHIR's support for updates.
12 comments

I have a QuestionnaireResponse with a contained Questionnaire that I'm getting back a validation failure when answering with a valueString against the contained Questionnaire's item[x].type being set as open-choice. When validating against validator.fhir.org R4 4.0.1, I get back "Option list has no option values of type string".

Below is a trimmed down example failing validation. From reading other discussions here, it sounds like this is supported in R4 and the open-choice is the correct type on the question item, I just haven't found an example of how to properly build this. I assume the Questionnaire being a contained resource on the QuestionnaireResponse shouldn't matter.

Hopefully unrelated - the itemControl code we are using does not belong in the ValueSet (known issue with a third party).

{
   "id":"9bb747d7-2666-47f2-9c79-20bc05198448",
   "meta":{
      "versionId":"5"
   },
   "contained":[
      {
         "id":"ed364266b937bb3bd73082b1",
         "item":[
            {
               "extension":[
                  {
                     "url":"http://hl7.org/fhir/StructureDefinition/questionnaire-itemControl",
                     "valueCodeableConcept":{
                        "coding":[
                           {
                              "code":"editableDropdown"
                           }
                        ]
                     }
                  }
               ],
               "id":"specimen-source",
               "answerOption":[
                  {
                     "valueCoding":{
                        "code":"U",
                        "display":"Urine"
                     }
                  },
                  {
                     "valueCoding":{
                        "code":"B",
                        "display":"Blood"
                     }
                  },
                  {
                     "valueCoding":{
                        "code":"S",
                        "display":"Saliva"
                     }
                  }
               ],
               "code":[
                  {
                     "code":"specimen-source"
                  }
               ],
               "linkId":"specimen-source",
               "text":"Source of specimen",
               "type":"open-choice"
            }
         ],
         "name":"Test Open Choice question",
         "status":"active",
         "subjectType":[
            "Patient"
         ],
         "resourceType":"Questionnaire"
      }
   ],
   "item":[
      {
         "answer":[
            {
               "valueString":"spinal tap"
            }
         ],
         "linkId":"specimen-source",
         "text":"Source of specimen"
      }
   ],
   "questionnaire":"#ed364266b937bb3bd73082b1",
   "status":"in-progress",
   "subject":{
      "display":"Test Patient",
      "identifier":{
         "value":"4"
      },
      "reference":"Patient/4",
      "type":"Patient"
   },
   "resourceType":"QuestionnaireResponse"
}
David Jaffe2024-10-13T17:53:31Z

That looks valid to me.

Brian Postlethwaite2024-10-13T21:36:57Z

why? The definition says it has a list of values that are of type Coding, but the answer has a type of string

Grahame Grieve2024-10-13T21:48:57Z

open-choice is a set of either codes from the referenced set, or a string if no value is appropriate from the set.

Brian Postlethwaite2024-10-13T23:08:50Z

This was changed in R5, but is valid in R4/R4B

Brian Postlethwaite2024-10-13T23:09:29Z

https://hl7.org/fhir/r4/codesystem-item-type.html#item-type-open-choice

Answer is a Coding drawn from a list of possible answers (as with the choice type) or a free-text entry in a string (valueCoding or valueString).

Brian Postlethwaite2024-10-13T23:10:21Z

The choice type matches the description you've desribed.

Brian Postlethwaite2024-10-13T23:13:26Z

The 2 control types that often use this type are a combo-box that has an edit control, or an auto-complete style search control.

Brian Postlethwaite2024-10-13T23:14:18Z

ok. I missed that. fixed next release

Grahame Grieve2024-10-14T00:59:52Z

Where's that code so I can do a review on it to see which parts are missing (and compare to my validation)

Brian Postlethwaite2024-10-14T02:57:11Z

Any ideas for workarounds to save this? We're on HAPI FHIR 6.8.0, and I assume this would be something that will be a while to make it all the way through the pipeline for HAPI to consume. I was thinking just adding the provided valueString answer into the Questionnaires answer options list just to pass validation, but that feels very wrong. I'm not sure if HAPI allows overriding base HL7 rules.

Interestingly, HAPI has support for open-choice to override validation, but all the code is commented out. I can post to the github to find out why.

David Jaffe2024-10-14T15:52:11Z

@Grahame Grieve I just saw the fix and release, we'll test it out today

David Jaffe2024-10-14T16:07:52Z
Task status
#workflow
In the chat, participants discuss the appropriate task status to indicate that a task is available but not yet assigned or acted upon, with opinions differing on whether "ready" or "requested" is the correct designation. Ultimately, it is clarified that "requested" is suitable for undirected tasks where no acceptance is needed, while "ready" indicates a task is awaiting action within a more structured workflow.
10 comments

task "ready" says: The task is ready to be performed, but no action has yet been taken. Used in place of requested/received/accepted/rejected when request assignment and acceptance is a given.

Jose Costa Teixeira2024-10-18T05:57:35Z

what does that last part mean?
a) "when request assignment and acceptance are part of the workflow but are not yet done"
b) "when there is no need for such a thing as request assignment and workflow"

Jose Costa Teixeira2024-10-18T05:58:50Z

in other words, how do I do "here is a task for someone to maybe pick up"? I would assume it's "ready" but given the above description, I am not so sure

Jose Costa Teixeira2024-10-18T05:59:38Z

b

Lloyd McKenzie2024-10-18T06:05:03Z

You use it when the filler doesn't get the option to say "yes" or "no".

Lloyd McKenzie2024-10-18T06:05:20Z

what of the cases of "i don't need to care if there is a filler to accept this or not, right now I just want to say perhaps this should be done"?

Jose Costa Teixeira2024-10-18T06:10:03Z

For "here is a task for someone to maybe pick up", wouldn't Task.status="requested"?

Andy Bond2024-10-18T06:45:17Z

i think so, but that is not what i read from the description. especially the "maybe pick up"

Jose Costa Teixeira2024-10-18T06:51:15Z

"The task is ready to be acted upon and action is sought."

Your use of status will depend on the workflow you are supporting, i.e. directed tasks, undirected claimed tasks, fulfilment offers, etc. For diag orders, we use requested, accepted, in-progress, completed but that is a directed/undirected model that might also involve the claiming of fulfilment based on patient choice.

Andy Bond2024-10-18T06:59:03Z

If the Task isn't directed but is available for someone to claim, it would have a status of 'requested' and 'owner' would be empty.

Lloyd McKenzie2024-10-18T14:19:21Z
During the discussion about the SQL on FHIR event, René Spronk suggested that scheduling for three continents often leads to issues, advocating for optimization for two continents with recordings available for the third. This prompted lighthearted banter, including a humorous reference to "Null Island" and geographical inclusions.
8 comments

Given the timing of the event (evening/night in europe), will there be any recodings? @Nikolai Ryzhikov 🐬

René Spronk2024-10-13T10:02:41Z

René Spronk said:

Given the timing of the event (evening/night in europe), will there be any recodings? Nikolai Ryzhikov 🐬

Sure

Nikolai Ryzhikov 🐬2024-10-13T20:17:48Z

Sorry for such timing - we tried to cover 3 continents :/

Nikolai Ryzhikov 🐬2024-10-15T16:23:54Z

IMHO covering 3 continents never works - better to optimize for 2 out of 3 (and have recordings for the 'lost' continent ;-) ).

René Spronk2024-10-16T06:27:57Z

Which TZ is Atlantis in again? ;-)

Gino Canessa2024-10-16T15:17:41Z

Same as Washington D.C.

David Pyke2024-10-16T15:18:26Z
René Spronk2024-10-16T17:35:51Z

René Spronk said:

IMHO covering 3 continents never works - better to optimize for 2 out of 3 (and have recordings for the 'lost' continent ;-) ).

North America, South America, Europe and Africa - at one time - is a possibility. Asia and Oceania - remains the Exclusion Zone.

Peter Jordan2024-10-16T18:22:08Z
CDS Hooks
#social
Sanjay Murali is seeking guidance on integrating his CDS Hooks application with Epic, specifically on creating CDS Hook requests and understanding how to utilize the patient-view and order-select hooks. Lloyd McKenzie and others suggest reaching out to Epic support and clarify that CDS Hook invocation involves HTTP POST to provide decision support at specific workflow points within the EHR.
7 comments

Hello everyone,

I have a question regarding the implementation of CDS Hooks in Epic. I have developed a CDS service application that supports the patient-view, order-select, and order-sign hooks. How can I integrate this with Epic?

So far, I have created an application in Epic where the intended audience is clinicians and administrative users. I have selected all the necessary APIs and checked the "Uses CDS Hooks" option.

However, I am now looking for guidance on how to create the CDS Hook request in Epic and how to interact with the CDS hooks application that I built. I have reviewed the Epic documentation, but I couldn't find specific instructions on how to use or implement CDS Hooks in an Epic app.

Could you please explain how the CDS Hooks implementation works within Epic and the steps I should take to complete the integration?

Thanks

Sanjay Murali2024-09-09T02:43:33Z

Best place to seek Epic support is to email open@epic.com

Lloyd McKenzie2024-09-09T03:26:15Z

Hi @Lloyd McKenzie

In the Epic documentation, I noticed that Epic supports three CDS hooks. I would like to understand how to use this feature. Specifically, how can I utilize the patient-view and order-select CDS hooks in Epic?

Thanks

Sanjay Murali2024-09-09T08:51:32Z

This forum is focused on FHIR, not on any vendor/profuct specific problems or issues. As Lloyd stated: best place to seek Epic support is to email open@epic.com

René Spronk2024-09-09T08:53:54Z

Hi,
I am new to the CDS hooks. I have started CDS hooks service development. Can any one helps me to understand on the core functionalities ?

  1. For prefetch, how server can understand if the i pass prefetch template (fhir expression) and prefetch resource data (resource data). or it is part of deployment agreement.
  2. is it possible to mention 2 order-select cds hooks with different set of prefetch template. example one order select contains patient and service request, another order select contains patient and medication request ? or based on different cds hooks prefetch is fixed and and it is universally truth.
  3. does these hooks name (patient-view, order-select, order-sign etc. ) define only the work flow of the hooks? or it provides something related to others?
  4. if someone calls my cds hooks then i am expecting the data communication should happen by rest api end points, why its being called as hook. does it required any websoket implementation in server end or only the rest api implementation is fine ?
  5. If payer system is ready to share fhir resources as input into te cds hooks services, then what is the usage of patient view cds hooks ? because data is already there as resource ?

it will be very helpful if someone helps and provides some thoughts on this.

Rakesh Das2024-10-14T08:38:38Z

@Rakesh Das - there is a #cds hooks channel where you might get answers to your questions.

John Silva2024-10-14T16:02:05Z
  1. Not sure what you mean. When you first connect to a hook service, you'll invoke the discovery mechanism, which will tell you what prefetches are desired. There's no 'standard' deployment agreement mechanism. Obviously consenting parties could choose to bypass discovery and just pre-determine by agreement what the prefetches should be, but that would be less flexible. (The discovery mechanism can be updated to request different things over time)
  2. No. Prefetch is defined for a particular hook type. There's no way to vary it by hook type + focal resource. (In part because when the hook is invoked, you might send multiple resource types at once).
  3. The hook name indicates the point(s) in the client's workflow where the hook should be triggered and also lets the service decide what types of information should be returned
  4. CDS hook invocation always involves an HTTP POST to the configured endpoint. It's called a 'hook' because it's a location where an external service can inject decision support into an EHR's regular workflow.
  5. Patient view hooks are to allow decision support to be returned whenever someone brings up a patient's record. An example where this might be useful might be "Patient is due for a pap smear".
Lloyd McKenzie2024-10-14T18:34:26Z
Alaya Ben-Belkacem is seeking an alternative package to use the Communication.payload.content[x]:contentCodeableConcept element from the R5 specification in their R4 implementation, as the required package is currently unavailable. In response, various participants discuss creating a custom extension with a compatible URL and ID format, while Gino Canessa indicates further changes are needed before providing definitive answers on the new content.
7 comments
PE
LS

Hello,

I need to use the Communication.payload.content[x]:contentCodeableConcept element, which is part of the pre-adopted R5 specification, in our R4 implementation. According to http://hl7.org/fhir/R5/versions.html#extensions I'd need to add the package hl7.fhir.extensions.r4:4.0.1, but I'm not able to find it (the link to this package on the aforementioned page does not resolve).

Is there an alternative package or solution that would allow me to handle this scenario?

Thanks!

Alaya Ben-Belkacem2024-10-02T09:30:12Z

not right now - work in progress

Grahame Grieve2024-10-02T09:33:32Z

@Grahame Grieve For now we decided to create a custom extension, mimicking the extension url as much as possible (we use nictiz.nl instead of hl7.org in the url), so that it can be replaced easily by the core extension as soon as the package becomes available. Since the element path contains brackets, is it correct to assume that the url of the core extension will be http://hl7.org/fhir/5.0/StructureDefinition/extension-Communication.payload.content%5Bx%5D:contentCodeableConcept (i.e. with the brackets url escaped)?

Moreover we would like to mimic the id as much as possible. How will the corresponding id be constructed, since it's not allowed to include characters such as [, ], % and : in an id? Currently we have omitted the content[x]: part altogether and use extension-Communication.payload.contentCodeableConcept as id.

Thanks in advance!

Luud Slagter2024-10-04T09:31:08Z

@Gino Canessa

Pieter Edelman2024-10-04T10:57:22Z

Regarding the cross-version extensions generally, we made a lot of great progress during the connectathon and WGM. The ball is in my court to implement all of those changes and generate the next pass of definitions for review. That will take some time on the order of weeks (1-4?).

Gino Canessa2024-10-07T17:28:41Z

@Gino Canessa Is it okay to base the id of the extension like this: extension-Communication.payload.contentCodeableConcept, where we omit the brackets and other special characters since they aren't allowed in anid? Additionally, for the url of the extension, would it be correct to assume: http://hl7.org/fhir/5.0/StructureDefinition/extension-Communication.payload.content%5Bx%5D:contentCodeableConcept, where the brackets are URL-encoded? Thanks!

Alaya Ben-Belkacem2024-10-17T10:19:56Z

That does not look quite right to me, but I have not gotten to reconciling changes in URL and structure yet (working on changes in differentiation right now).

I need to get to that section of changes before I can give an answer on the new content.

Gino Canessa2024-10-17T14:02:40Z
Powered by Health Samurai | 2022