AidboxForm BuilderSQL on FHIRCCDA -> FHIRValidator
Report 2024-11-08

FHIR Digest

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

In a recent conversation, Grahame Grieve and Michael Lawley discussed the ongoing development and testing of terminology server interfaces for FHIR, addressing challenges related to validation, various test cases, and inter-server compatibility, particularly between Ontoserver and Snowstorm. They focused on issues such as response formatting, the handling of extensions, and the accuracy of validation results, emphasizing the need for clear testing parameters and collaboration among stakeholders to resolve discrepancies in expected outcomes.
450 comments
ML
JS

@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

@Bart Decuypere so @Michael Lawley and I have been iterating on this in our dev versions, and we've resolved things and Ontoserver is back to 100% pass rate, but now we have to go through our various release processes, so it won't be immediately there for everyone, sorry

Grahame Grieve2024-10-22T07:44:28Z

(and thanks @Michael Lawley!)

Grahame Grieve2024-10-22T07:44:35Z

@Grahame Grieve and @Michael Lawley , a sincere thanks for your follow up. I'll expect a ping with version number if there are compatible versions available for both softwares.

Bart Decuypere2024-10-22T09:25:57Z

the next release of the validator, which will be 6.4.0

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

though I don't know when that'll be.. sometime later this week?

Grahame Grieve2024-10-22T10:01:38Z

I can't speak for Ontoserver

Grahame Grieve2024-10-22T10:01:42Z

It will be after the validator is released, hopefully not long

Michael Lawley2024-10-23T05:18:38Z

@Bart Decuypere the pre-release version of Ontoserver deployed at https://r4.ontoserver.csiro.au/fhir passes all tests - you need to call it with: -mode flat -mode ontoserver

Michael Lawley2024-10-31T12:55:41Z

thanks @Michael Lawley and I'm glad we sorted that.

@Bart Decuypere so that things are clear, the tests present somewhat of a challenge that we're still thinking about, because in order to test the API, the tests require the server to support features that are not required in a server

in particular, the tests work by including specific code system(s) that the operations use in order to ensure that the outputs from the operations are predictable and testable. But this requires that a server support the feature of supporting ad-hoc code systems to be provided as a parameter to the request, and that is a not a mandatory feature for code system specific servers.

But I don't have budget cover to writing (and constantly rewriting) specific code system tests where the outputs change as the new versions of the code systems are released.

Grahame Grieve2024-10-31T20:22:08Z

@Michael Lawley @Grahame Grieve Thanks for your efforts. I'll thoroughly go through them after my holidays. It's a pity with regard to the temporary nature of the results / unofficial feature used as it defeats in some way the purpose of the tests, viz. defining an official API.

Bart Decuypere2024-11-01T07:32:04Z

Ontoserver® v6.21.0 passed all HL7 terminology service tests (modes flat;ontoserver, tests v1.6.0, runner v6.4.0)

I don't believe this is a temporary result; we would not expect later versions of Ontoserver to fail the v1.6.0 test suite unless a spec-violating bug is found in those tests.

Michael Lawley2024-11-02T00:24:03Z

all good until the next issue ;-)

Grahame Grieve2024-11-02T00:30:51Z

The Agence du Numérique en Santé (ANS) Terminology Server is now part of the terminology eco-system, authoritative for https://smt.esante.gouv.fr* and https://mos.esante.gouv.fr*

Grahame Grieve2024-11-03T19:34:02Z

@Michael Lawley @Grahame Grieve I ran the tests with the new validator_cli.jar (6.4.0) and the latest commit on master of the fhir-test-cases (269cf3a5), and I still get one error:

{
          "name" : "big-echo-no-limit",
          "status" : "fail",
          "message" : "Response Code fail: should be '4xx' but is '200'"
        }
Bart Decuypere2024-11-05T09:50:59Z

against what server?

Grahame Grieve2024-11-05T09:52:18Z

I ran with these options:

Params: -txTests -source ./tx -tx https://tx.ontoserver.csiro.au/fhir -mode flat -mode snowstorm
Bart Decuypere2024-11-05T09:52:36Z

@Michael Lawley this is for you, I think

Grahame Grieve2024-11-05T10:00:41Z

@Bart Decuypere you need -mode ontoserver not -mode snowstorm

Michael Lawley2024-11-05T10:01:47Z

of course... I definitely need a new pair of glasses! Thanks a lot for the effort!

Bart Decuypere2024-11-05T10:04:43Z

When is the Ontoserver release scheduled?

Bart Decuypere2024-11-05T10:05:49Z

It happened on the weekend - 6.21.0 is now out

Michael Lawley2024-11-05T10:06:17Z

I'll ask our team to upgrade! Thanks again!

Bart Decuypere2024-11-05T10:07:13Z

(deleted)

Daniel Venton2024-11-05T14:26:56Z
New Publication
#Announcements
Multiple new publications related to HL7 FHIR® Implementation Guides have been announced, including several updates and new editions across various domains such as vital records, quality measures, and consumer-directed healthcare. Notably, these publications include the release of STU versions for numerous guides, aiming to enhance interoperability in healthcare data exchange.
233 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

STU Publication of HL7 CDA® R2 Implementation Guide: Healthcare Associated Infection Reports, Release 4, STU 3 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=570

Lynn Laakso2024-10-30T12:54:28Z

STU Errata Publication of HL7 CDA® R2 Implementation Guide: Public Health Case Report - the Electronic Initial Case Report (eICR), Release 3.1.1 - US Realm: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=436

Lynn Laakso2024-10-30T13:23:41Z

STU Errata Publication of HL7 FHIR® Implementation Guide: Electronic Case Reporting (eCR), Release 2.1.2 - US Realm: http://hl7.org/fhir/us/ecr/STU2.1

Lynn Laakso2024-10-30T22:24:23Z

STU Publication of HL7 FHIR® Implementation Guide: Quality Measures, Edition 1 STU 5 - US Realm: http://hl7.org/fhir/us/cqfmeasures/STU5

Lynn Laakso2024-11-04T21:28:14Z

Normative Retirement Publication of HL7 Service-Aware Interoperability Framework: Canonical Definition Specification, Release 2: https://www.hl7.org/implement/standards/product_brief.cfm?product_id=3

Lynn Laakso2024-11-05T21:43:28Z
In a discussion about generating Java data models for FHIR profiles, participants identified existing issues in the code generation process, including blocks related to profiled FHIR datatypes and polymorphic types. They expressed enthusiasm for community collaboration to improve the project, with plans to share fixes and enhancements while addressing the challenges of ensuring compatibility across different FHIR versions.
191 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

image.png
-all those annotations are not available in R4.

Jens Villadsen2024-10-21T12:02:33Z
Jens Villadsen2024-10-21T12:03:58Z
Jens Villadsen2024-10-21T12:04:51Z

@Grahame Grieve I'm working from your 2024-10-gg-tx-server-auth-branch so you can make your modifications there and I'll try it out right away

Jens Villadsen2024-10-21T12:14:36Z

updated for the easy changes. Will try and get to the others tomorrow, but it will help if you say what you generated to get the errors

Grahame Grieve2024-10-21T12:20:00Z

I'm taking all structuredefs from https://hl7.dk/fhir/core/3.2.0/

Jens Villadsen2024-10-21T12:56:43Z

I can make the plugin generate an equivalent validator syntax if that helps :see_no_evil:

Jens Villadsen2024-10-21T14:17:42Z

You may wanna change the .'s in the enums to _ as well:
image.png

Jens Villadsen2024-10-21T15:10:39Z

There also seems to be some funkyness when profiled datatypes are generated (such as https://hl7.dk/fhir/core/StructureDefinition-dk-core-gln-identifier.html) and the use in the parent resources

Jens Villadsen2024-10-21T18:28:14Z

try again. what's 'funkiness'? I kind of like https://www.youtube.com/watch?v=uE-itlGNap4

Grahame Grieve2024-10-21T18:49:22Z

This is the equivalent: java -jar validator_cli.jar -codegen -version 4.0.1 -ig hl7.fhir.dk.core#3.2.0 -output target/generated-sources/java -package-name org.hl7.fhir.example.generated -profiles http://hl7.dk/fhir/core/StructureDefinition-dk-core-patient,http://hl7.dk/fhir/core/StructureDefinition-NotFollowedAnymore,http://hl7.dk/fhir/core/StructureDefinition-dk-core-gln-identifier,http://hl7.dk/fhir/core/StructureDefinition-ConditionLastAssertedDate,http://hl7.dk/fhir/core/StructureDefinition-dk-core-basic-observation,http://hl7.dk/fhir/core/StructureDefinition-dk-core-observation,http://hl7.dk/fhir/core/StructureDefinition-dk-core-cpr-identifier,http://hl7.dk/fhir/core/StructureDefinition-dk-core-sor-identifier,http://hl7.dk/fhir/core/StructureDefinition-dk-core-cvr-identifier,http://hl7.dk/fhir/core/StructureDefinition-dk-core-condition,http://hl7.dk/fhir/core/StructureDefinition-dk-core-producent-id,http://hl7.dk/fhir/core/StructureDefinition-dk-core-related-person,http://hl7.dk/fhir/core/StructureDefinition-dk-core-authorization-identifier,http://hl7.dk/fhir/core/StructureDefinition-dk-core-kombit-org-identifier,http://hl7.dk/fhir/core/StructureDefinition-dk-core-practitioner,http://hl7.dk/fhir/core/StructureDefinition-dk-core-x-ecpr-identifier,http://hl7.dk/fhir/core/StructureDefinition-dk-core-d-ecpr-identifier,http://hl7.dk/fhir/core/StructureDefinition-dk-core-organization,http://hl7.dk/fhir/core/StructureDefinition-dk-core-municipalityCodes,http://hl7.dk/fhir/core/StructureDefinition-dk-core-RegionalSubDivisionCodes

Jens Villadsen2024-10-21T21:53:29Z

when those generated classes are compilable then I'll stop bugging you ... for a while ...

Jens Villadsen2024-10-21T21:56:20Z

:big_smile:

Jens Villadsen2024-10-21T21:56:33Z

you can use -profile http://hl7.dk/fhir/core/* in the parameters now.

Grahame Grieve2024-10-21T22:16:00Z

they should be copilable now

Grahame Grieve2024-10-21T22:16:09Z

I don't see that you have made any commits that fixes the reported issues - did you forget to push?

Jens Villadsen2024-10-22T04:23:56Z

everything up to date.

Grahame Grieve2024-10-22T06:36:56Z

yea ok ... let me be specific. The generated code does not compile due to the issues raised.

Jens Villadsen2024-10-22T08:17:55Z

which issues - it compiles for me using the code in that branch

Grahame Grieve2024-10-22T08:25:23Z

Yea ... It must be some local caching/deps resolution that doesn't work locally. I just tried out the validation.cli and it looks good so far.

Jens Villadsen2024-10-22T17:28:24Z

Okay ... I found the issue ... https://github.com/hapifhir/org.hl7.fhir.core/blob/8bc1f493c01db4e819344de2267d34e29a073f69/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/services/ValidationService.java#L856 is using the PECodeGenerator from the r5 package eventhough its generating for R4. Whats that about?

Jens Villadsen2024-10-22T20:35:03Z

Whats the purpose of the PECodeGenerator in the r4 then good for? Because the r4 instance is still generating classes that do not compile.

Jens Villadsen2024-10-22T20:36:20Z

the purpose of it is to create dual work for me, and the opportunity to forget to keep it in sync.

Grahame Grieve2024-10-22T20:44:31Z

Why not just delete it if serves no genuine purpose?

Jens Villadsen2024-10-22T20:47:14Z

Grahame Grieve said:

the purpose of it is to create dual work for me, and the opportunity to forget to keep it in sync.

Which falls short of the intention, which is combinatorial work for Grahame ;-)

Gino Canessa2024-10-22T20:48:15Z

no that wasn't a serious answer. The real reason is because I think that there'll be people who are just using r4, and would find using R5 to do the generation an unnecessary impost,

Grahame Grieve2024-10-22T20:48:18Z

so I decided that I'd maintain all the Profile model code in both R4 and R5.

Grahame Grieve2024-10-22T20:48:52Z

I got the sarcasm part ( im a dane you know) but why would anyone care in which package the code is if it does what its supposed to?

Jens Villadsen2024-10-22T20:49:58Z

... and a new finding:

var workerContext = SimpleWorkerContext.fromPackage(new FilesystemPackageCacheManager.Builder().build().loadPackage("hl7.fhir.dk.core","3.2.0"));
        var dkCoreOrganization = new DkCoreOrganization().setEANID(new GLNIdentifier().setValue(UUID.randomUUID().toString()));
        dkCoreOrganization.build(workerContext);

Try to run that piece of code from the generated samples ... while it compiles, it fails runtime.

Jens Villadsen2024-10-22T20:55:53Z

because of what you have to do to feed the code. It works for me to use the R5 code because the validator is entirely R5 internally, but that comes with a fair bit of work internally both in terms of having R4 <-> R5 conversions (which are part of the code) and also in terms of the work to set up the context.

Grahame Grieve2024-10-22T20:55:56Z
org.hl7.fhir.exceptions.FHIRException: No children with the name 'EANID'

    at org.hl7.fhir.r4.profilemodel.PEInstance.byName(PEInstance.java:149)
    at org.hl7.fhir.r4.profilemodel.PEInstance.children(PEInstance.java:129)
    at org.hl7.fhir.r4.profilemodel.PEInstance.clear(PEInstance.java:185)
    at org.hl7.fhir.example.generated.DkCoreOrganization.save(DkCoreOrganization.java:277)
    at org.hl7.fhir.example.generated.DkCoreOrganization.build(DkCoreOrganization.java:232)
    at PluginTest.testDoStuff(PluginTest.java:41)
Jens Villadsen2024-10-22T20:56:28Z

... and the example becomes a bit weird as there you actually have to use a SimpleWorkerContext from r4 ... :face_with_raised_eyebrow:

Jens Villadsen2024-10-22T20:57:49Z

ok. I will investigate

Grahame Grieve2024-10-22T21:01:37Z

But the question remains: Should I use the PEGenerator in the r4 package for R4 IGs or should I use the one from r5?

Jens Villadsen2024-10-22T21:03:32Z

r4.

Grahame Grieve2024-10-22T21:06:35Z

You are fully aware that the corrections you did on the R5 you also need to do on R4 - in terms on enums and '-' in enums?

Jens Villadsen2024-10-27T14:04:55Z

If you would like to see a new bunch of errors for R5 packages then you can run: java -jar validator_cli.jar -codegen -version R5 -ig hl7.fhir.uv.emedicinal-product-info#1.0.0 -output target/generated-sources/java -package-name org.hl7.fhir.example.generated -profiles http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-MedicinalProductDefinition-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-SubstanceDefinition-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-PackagedProductDefinition-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-ClinicalUseDefinition-indication-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-RegulatedAuthorization-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-ClinicalUseDefinition-interaction-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-Composition-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-Ingredient-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-ClinicalUseDefinition-warning-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-AdministrableProductDefinition-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-Bundle-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-ClinicalUseDefinition-contraindication-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-ManufacturedItemDefinition-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-Organization-uv-epi,http://hl7.org/fhir/uv/emedicinal-product-info/StructureDefinition-ClinicalUseDefinition-undesirableEffect-uv-epi

Jens Villadsen2024-10-27T14:18:39Z

Also - I'm moving https://github.com/jkiddo/espresso to an HL7 repo if thats something the community would like to have : :man_shrugging:

Jens Villadsen2024-10-27T15:26:53Z

@Jens Villadsen compiles ok for me:

Grahame Grieve2024-10-27T20:33:47Z

I'm moving https://github.com/jkiddo/espresso to an HL7 repo if thats something the community would like to have

no, it shouldn't be an HL7 repo, it should be in http://github.com/FHIR - I would welcome it there.

Grahame Grieve2024-10-27T20:36:33Z

Okay - wasn't aware you made a new branch. With that, the r4 stuff works now. The R5 stuff however does not. Just tried again from the new branch and double-tried it with the validation CLI as well. Same result: end result does not compile.

Jens Villadsen2024-10-27T22:43:38Z

that's all in the R5 base master - what I committed against.

Grahame Grieve2024-10-27T22:45:59Z

do I think it does compile, but if you want to progress this, please be specific about what doesn't compile

Grahame Grieve2024-10-27T22:46:16Z
Jens Villadsen2024-10-27T22:48:12Z

which class is that in?

Grahame Grieve2024-10-27T22:52:49Z

RegulatedAuthorizationUvEpi

Jens Villadsen2024-10-27T22:53:15Z
Jens Villadsen2024-10-27T22:54:35Z

BundleUvEpi

Jens Villadsen2024-10-27T22:54:50Z

you don't see those issues locally?

Jens Villadsen2024-10-27T22:55:43Z

weird. I can't generate that

Grahame Grieve2024-10-27T22:56:37Z

definition not found

Grahame Grieve2024-10-27T22:56:45Z

I don't know what that means

Jens Villadsen2024-10-27T23:01:29Z
Grahame Grieve2024-11-01T12:43:04Z

you may wanna look into this error:

[ERROR] Failures:
[ERROR]   DateTimeUtilTests.testToHumanDisplayLocalTimezone:76 expected: <04-Feb-2002 00:00:00> but was: <4 Feb 2002, 00:00:00>
[ERROR]   DateTimeUtilTests.testToHumanDisplayLocalTimezone:76 expected: <04-Feb-2002 00:00:00> but was: <4 Feb 2002, 00:00:00>
[ERROR]   DateTimeUtilTests.testToHumanDisplayLocalTimezone:76 expected: <04-Feb-2002 00:00:00> but was: <4 Feb 2002, 00:00:00>
[INFO]
[ERROR] Tests run: 724, Failures: 3, Errors: 0, Skipped: 5
Jens Villadsen2024-11-01T16:16:19Z

@Grahame Grieve this is however worse:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile (java-compile) on project org.hl7.fhir.r4: Compilation failure
[ERROR] /Users/jkiddo/work/org.hl7.fhir.core/org.hl7.fhir.r4/src/main/java/org/hl7/fhir/r4/profilemodel/PEInstance.java:[301,36] error: cannot find symbol
[ERROR]   symbol:   class DataType
[ERROR]   location: class PEInstance
[ERROR]
Jens Villadsen2024-11-01T16:20:34Z

look into this error:

that's a jvm issue. It passes on the ci-build jvm. We don't know how to test that without getting dependent on different responses from different jvms

Grahame Grieve2024-11-01T20:31:13Z

I can ignore the tests - I cant ignore compilation errors

Jens Villadsen2024-11-01T21:01:46Z

Try again then

Grahame Grieve2024-11-01T23:20:04Z

I'm sorry if my opinion won't please anyone. However, discussions in critical infrastructure areas are for a continuous improvement process. I think code generation is a serious cybersecurity threat. software literature, especially from Bertrand Meyer, should be considered regarding extension and modification practices.

Felipe Soriano2024-11-02T02:40:37Z

I really can't understand why software development isn't based on science. Software is present in all technologies and yet it is developed in-house. There is no interoperability without considering Tenembaum definitions

Felipe Soriano2024-11-02T02:52:45Z

@Grahame Grieve it sort of compiles now (gonna check the rest of the generation now) - after I removed some occurences of DebugUtilities and some test code. I just realized, none of the github actions runs on branches - is that intentional? This line of compilation issues could have been identified earlier on if there were actions on branches.

Jens Villadsen2024-11-02T08:40:50Z

I have no idea what you're talking about there? What actions?

Grahame Grieve2024-11-02T08:52:53Z

but in this case, I committed it without checking and went kayaking

Grahame Grieve2024-11-02T08:53:08Z

Github actions

Jens Villadsen2024-11-02T08:55:21Z

they all run, I just didn't look at the outcome

Grahame Grieve2024-11-02T08:55:41Z

None of https://github.com/hapifhir/org.hl7.fhir.core/actions seems to highlight the compilation issues I encountered

Jens Villadsen2024-11-02T08:57:34Z

sorry ... thats me being blind

Jens Villadsen2024-11-02T08:58:01Z

they did encounter the exact same issues

Jens Villadsen2024-11-02T08:58:10Z

indeed. they only work when I get around to looking at them though

Grahame Grieve2024-11-02T08:58:44Z

I was confused by the naming of the action though ...

Jens Villadsen2024-11-02T08:58:57Z

I would expect OWASP and License check to identify compilation issues

Jens Villadsen2024-11-02T08:59:47Z

would != wouldnt

Jens Villadsen2024-11-02T09:00:07Z

they do. I don't know why, I've never cared :grinning:

Grahame Grieve2024-11-02T09:03:35Z

we are back to naming and cache invalidation then .... the two most important parts of software engineering ... :wink:

Jens Villadsen2024-11-02T09:08:14Z

anyways ... R5 packages from a first glance seem to work fine ...

Jens Villadsen2024-11-02T09:13:41Z

R4 has some issues ...

java.lang.AbstractMethodError: Receiver class org.hl7.fhir.r4.hapi.ctx.HapiWorkerContext does not define or inherit an implementation of the resolved method 'abstract java.util.List fetchResourcesByType(java.lang.Class)' of interface org.hl7.fhir.r4.context.IWorkerContext.

    at org.hl7.fhir.r4.fhirpath.FHIRPathEngine.<init>(FHIRPathEngine.java:273)
    at org.hl7.fhir.r4.fhirpath.FHIRPathEngine.<init>(FHIRPathEngine.java:266)
    at org.hl7.fhir.r4.hapi.fluentpath.FhirPathR4.<init>(FhirPathR4.java:31)
    at org.hl7.fhir.r4.hapi.ctx.FhirR4.createFhirPathExecutor(FhirR4.java:56)
    at ca.uhn.fhir.context.FhirContext.newFhirPath(FhirContext.java:859)
    at org.hl7.fhir.contrib.CodeGeneratorFactory.<init>(CodeGeneratorFactory.java:53)
Jens Villadsen2024-11-02T09:14:40Z

this time not in the generated code though ... :thinking:

Jens Villadsen2024-11-02T09:15:06Z

no hapi will need some changes in R4 to deal with the upgrades to FHIRPath that make the PE code work

Grahame Grieve2024-11-02T09:58:22Z

I'm not the one responsible for that

Grahame Grieve2024-11-02T09:58:35Z

Should I run a git blame on that?

Jens Villadsen2024-11-02T10:36:47Z

on what? No, I added some routines to IWorkerContext, but someone else has to add them to the HAPI implementaiton

Grahame Grieve2024-11-02T10:40:05Z

no blame there

Grahame Grieve2024-11-02T10:40:08Z

No blame, no one responsible - okay

Jens Villadsen2024-11-02T11:08:22Z

I didn't say no one. It's the HAPI team - they do it when they upgrade the version of core that underlies HAPI. If you want to accelerate that, maybe it's you

Grahame Grieve2024-11-02T11:21:27Z

after some seriously jank class shadowing I got it working - so no compile time issues. Now its on to runtime issues - and signatures

Jens Villadsen2024-11-02T11:54:47Z

Doing e.g. :

Jens Villadsen2024-11-02T11:55:08Z
var patient = new DkCorePatient(context).setDEcpr(new DkCoreDeCprIdentifier().setSystem(DkCoreDeCprIdentifier.DkCoreDeCPRValueSet.URNOID122081761613).setValue(UUID.randomUUID().toString()));

        var pat = patient.build(context);

results in

org.hl7.fhir.exceptions.DefinitionException: The discriminator path 'system' has no fixed value - this is not supported by the PEBuilder

    at org.hl7.fhir.r4.profilemodel.PEBuilder.makeSliceExpression(PEBuilder.java:585)
    at org.hl7.fhir.r4.profilemodel.PEDefinitionElement.fhirpath(PEDefinitionElement.java:74)
    at org.hl7.fhir.r4.profilemodel.PEInstance.children(PEInstance.java:131)
    at org.hl7.fhir.example.generated.DkCorePatient.load(DkCorePatient.java:165)
    at org.hl7.fhir.example.generated.DkCorePatient.<init>(DkCorePatient.java:128)
Jens Villadsen2024-11-02T11:55:39Z

and the syntax is odd. If you feeded the DkCorePatient constructor with the context, why would I need to pass it again in build?

Jens Villadsen2024-11-02T11:56:31Z

if you feeded the DkCorePatient constructor with the context, why would I need to pass it again in build?

I don't know. There is a parameter-less constructor, but it's still an odd thing. I'm not sure I did that?

Grahame Grieve2024-11-02T12:12:50Z

try my updated code, anyway

Grahame Grieve2024-11-02T12:21:18Z

hmmm ... didn't seem to change a thing

Jens Villadsen2024-11-02T13:13:11Z

you should have:

Grahame Grieve2024-11-02T13:35:33Z
/**
* Build a instance of the underlying object based on this wrapping object
*
*/

public Patient build(IWorkerContext context) {

workerContext = context;

return build();

}

/**
* Build a instance of the underlying object based on this wrapping object
*
*/

public Patient build() {

Patient theThing = new Patient();

PEBuilder builder = new PEBuilder(workerContext, PEElementPropertiesPolicy.EXTENSION, true);

PEInstance tgt = builder.buildPEInstance(CANONICAL_URL, theThing);

save(tgt, false);

return theThing;

}
Grahame Grieve2024-11-02T13:35:53Z

wait ... those classes are namespaced to R5 ...

Jens Villadsen2024-11-02T13:58:16Z

Grahame Grieve said:

the purpose of it is to create dual work for me, and the opportunity to forget to keep it in sync.

are we back to this then?

Jens Villadsen2024-11-02T14:00:01Z

(that quote is gonna haunt you like a cat chasing a mouse)

Jens Villadsen2024-11-02T14:01:38Z

oh yes ... code signature is updated for R5 classes with the new build() method. No update on R4 ... :(

Jens Villadsen2024-11-02T14:07:27Z

are we back to this then?

indeed. Updated

Grahame Grieve2024-11-02T20:44:34Z

Update updated the signature - all good. Still have the problem though:

org.hl7.fhir.exceptions.DefinitionException: The discriminator path 'system' has no fixed value - this is not supported by the PEBuilder

    at org.hl7.fhir.r4.profilemodel.PEBuilder.makeSliceExpression(PEBuilder.java:592)
    at org.hl7.fhir.r4.profilemodel.PEDefinitionElement.fhirpath(PEDefinitionElement.java:74)
    at org.hl7.fhir.r4.profilemodel.PEInstance.children(PEInstance.java:131)
    at org.hl7.fhir.example.generated.DkCorePatient.load(DkCorePatient.java:165)
    at org.hl7.fhir.example.generated.DkCorePatient.<init>(DkCorePatient.java:128)
    at PluginTest.testDefaultR4MojoGoal(PluginTest.java:44)
...
Jens Villadsen2024-11-03T08:05:10Z

what's the code to reproduce that?

Grahame Grieve2024-11-03T08:39:34Z

Jens Villadsen said:

var patient = new DkCorePatient(context).setDEcpr(new DkCoreDeCprIdentifier().setSystem(DkCoreDeCprIdentifier.DkCoreDeCPRValueSet.URNOID122081761613).setValue(UUID.randomUUID().toString()));

        var pat = patient.build(context);

results in

org.hl7.fhir.exceptions.DefinitionException: The discriminator path 'system' has no fixed value - this is not supported by the PEBuilder

    at org.hl7.fhir.r4.profilemodel.PEBuilder.makeSliceExpression(PEBuilder.java:585)
    at org.hl7.fhir.r4.profilemodel.PEDefinitionElement.fhirpath(PEDefinitionElement.java:74)
    at org.hl7.fhir.r4.profilemodel.PEInstance.children(PEInstance.java:131)
    at org.hl7.fhir.example.generated.DkCorePatient.load(DkCorePatient.java:165)
    at org.hl7.fhir.example.generated.DkCorePatient.<init>(DkCorePatient.java:128)

Jens Villadsen2024-11-03T08:45:19Z

ok. how does that discriminator work?

Grahame Grieve2024-11-03T09:46:05Z

From https://hl7.dk/fhir/core/3.2.0/StructureDefinition-dk-core-patient.html - I assume its the identifier slicing here thats causing issues.

Jens Villadsen2024-11-03T10:43:11Z

( Im not near a computer)

Jens Villadsen2024-11-03T10:43:34Z

Getting back into this - what is the best way to test the latest version of codegen?

Vadim Peretokin2024-11-04T10:12:54Z
Grahame Grieve2024-11-04T11:58:17Z

no fix for the runtime exception yet, correct?

Jens Villadsen2024-11-04T14:22:42Z

no. why is it happening?

Grahame Grieve2024-11-04T18:11:47Z

I'll see if I can find time this evening to have a look - but the stacktrace remains the same:

org.hl7.fhir.exceptions.DefinitionException: The discriminator path 'system' has no fixed value - this is not supported by the PEBuilder

    at org.hl7.fhir.r4.profilemodel.PEBuilder.makeSliceExpression(PEBuilder.java:585)
    at org.hl7.fhir.r4.profilemodel.PEDefinitionElement.fhirpath(PEDefinitionElement.java:74)
    at org.hl7.fhir.r4.profilemodel.PEInstance.children(PEInstance.java:131)
Jens Villadsen2024-11-04T18:24:52Z
Jens Villadsen2024-11-04T19:42:32Z
Jens Villadsen2024-11-04T19:42:52Z

by system ...

Jens Villadsen2024-11-04T19:43:01Z

@Grahame Grieve So to me it seems like the fhirpath construction goes bad as it does not take into account that there's some cardinality check missing.

Jens Villadsen2024-11-04T19:59:09Z

If your tests show that its working then please point me to one

Jens Villadsen2024-11-04T20:38:02Z

oh no it fails for me

Grahame Grieve2024-11-04T22:06:24Z

I just haven't spent the time debugging it yet. Maybe you can?

Grahame Grieve2024-11-04T22:06:37Z

well, I spent the time and :

The discriminator path 'system' has no fixed value - this is not supported by the PEBuilder

turns out that's exactly a statement of truth. It has no fixed value

Grahame Grieve2024-11-04T23:26:43Z

cause it has a binding. I added support for that (in r5)

Grahame Grieve2024-11-04T23:46:40Z

Arh ... Now I understand!

Jens Villadsen2024-11-05T07:04:14Z

Arh ... Now I understand!

Jens Villadsen2024-11-05T07:04:21Z

Will it be backported?

Jens Villadsen2024-11-05T07:08:34Z

sure

Grahame Grieve2024-11-05T07:15:42Z

Seems like it works now ...

Jens Villadsen2024-11-05T22:44:12Z

now time to throw it at the lions - aka. client side consumers :grimacing:

Jens Villadsen2024-11-05T22:45:02Z

when's the 6.4.1 version of core expected to hit the rails?

Jens Villadsen2024-11-05T22:51:49Z

new release sometime this wek

Grahame Grieve2024-11-06T07:45:56Z
Mikael Rinnetmäki expressed concerns about the lack of business identifiers in the AuditEvent and Provenance resources on a FHIR server that requires identifiers for conditional creates, while John Moehrke explained that this design choice was made due to the absence of a compelling need for such identifiers and suggested the possibility of creating standardized extensions. The discussion highlighted usability challenges and the need for clarity on the purpose and implementation of identifiers in these specific FHIR resources.
76 comments

Is there a specific reason why AuditEvent and Provenance don't have business identifiers?

I noticed their absence as I was working with a FHIR server that only supports conditional creates with identifiers. I.e., an identifier is the only thing it allows me to specify as the value for the ifNoneExist rule.

Mikael Rinnetmäki2024-10-02T20:02:49Z

And yes, I'd like to only create a Provenance resource in the case it does not already exist.

Mikael Rinnetmäki2024-10-02T20:03:22Z

There was not a compelling equiviant business artifact that we needed to have identifier linkage. The guidance from modeling is that we include elements only where there is not an 80% need, expecting that extensions are easy. Can you provide examples of business identifiers to non-fhir artifacts? I don't think there is a compelling reason to reject. If we are still unclear, we could at least create a core extension so that everyone does it the same way.

John Moehrke2024-10-21T16:51:05Z

An extension would not help in my case. My problem is that I cannot do a conditional create of a Provenance resource on a server (Google Healthcare API), as it only supports conditional creates based on an identifier.

Mikael Rinnetmäki2024-10-21T23:22:00Z

then help us understand the "existing system" that has a business identifier that you need to place into AuditEvent.identifier or Provenance.identifier.

John Moehrke2024-10-22T11:44:04Z

image.png
Use agent for “who”, activity or outcome for “what”.

Felipe Soriano2024-10-22T15:26:49Z

Agent has “who” referred an a resource with Identifier (Patient, Device…..)

Felipe Soriano2024-10-22T15:30:33Z

It’s like centralize identifiers in actors and not in actions.

Felipe Soriano2024-10-22T15:32:19Z

@Felipe Soriano is this a new topic? It does not seem to relate to the existing topic, as for references Provenance and AuditEvent does use the Reference datattype that does have that support. This topic is about a root level .identifier in Provenance and AuditEvent.

John Moehrke2024-10-22T15:38:35Z

John Moehrke said:

Felipe Soriano is this a new topic? It does not seem to relate to the existing topic, as for references Provenance and AuditEvent does use the Reference datattype that does have that support. This topic is about a root level .identifier in Provenance and AuditEvent.

Hey @John Moehrke,

I think that both Resources contain reference properties to Resources with identifiers.

if access is from user or root, it’s implementation rule.

In my opinion always start with security row levels. Root access doesn’t change implementation.

Root access is analyzed action. User access is operational action.

Systems operation never can down.

What you think about it?

tks

Felipe Soriano2024-10-22T16:17:06Z

That is not a problem. That is not what this stream is discussing. This stream is about a business identifier for an AuditEvent instance, or Provenance instance.

John Moehrke2024-10-22T17:48:09Z

BasedOn?

Felipe Soriano2024-10-22T23:22:36Z

It's a action based in event and actors, ok? For event there is basedOn, for actor there is agente..

Felipe Soriano2024-10-22T23:24:50Z

For Resource 'what' there is Entity

Felipe Soriano2024-10-22T23:26:41Z

@John Moehrke I was thinking of something like this:

{
  "resource": {
    "resourceType": "Bundle",
    "type": "transaction",
    "entry": [
      {
        "request": {
          "ifNoneExist": "identifier=bundle-test-observation",
          "method": "POST",
          "url": "Observation"
        },
        "fullUrl": "urn:uuid:eb09e61a-e0c9-41b7-a412-d36daa873665",
        "resource": {
          "resourceType": "Observation",
          "identifier": [
            {
              "assigner": {
                "display": "Sensotrend Oy",
                "identifier": {
                  "system": "urn:ietf:rfc:3986",
                  "value": "https://www.sensotrend.com/"
                }
              },
              "use": "official",
              "system": "urn:ietf:rfc:3986",
              "value": "urn:uuid:4e20b340-6477-592f-9d8e-bfb7395e61b9"
            }
          ],
          "status": "final",
          "code": {
            "coding": [
              {
                "code": "2344-0",
                "display": "Glucose [Mass/volume] in Body fluid",
                "system": "http://loinc.org"
              }
            ],
            "text": "Interstitial glucose"
          }
        }
      },
      {
        "request": {
          "ifNoneExist": "identifier=provenance-for-4e20b340-6477-592f-9d8e-bfb7395e61b9",
          "method": "POST",
          "url": "Provenance"
        },
        "fullUrl": "urn:uuid:9aa87028-6b8f-421f-9524-2e0ffac8f002",
        "resource": {
          "identifier": [
            {
              "assigner": {
                "display": "Sensotrend Oy",
                "identifier": {
                  "system": "urn:ietf:rfc:3986",
                  "value": "https://www.sensotrend.com/"
                }
              },
              "use": "usual",
              "value": "identifier=provenance-for-4e20b340-6477-592f-9d8e-bfb7395e61b9"
            }
          ],
          "agent": [
            {
              "type": {
                "coding": [
                  {
                    "code": "assembler",
                    "display": "Assembler",
                    "system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type"
                  }
                ],
                "text": "Assembler"
              },
              "who": {
                "display": "My FHIR App"
              }
            }
          ],
          "recorded": "2024-09-25T23:00:44.044+03:00",
          "resourceType": "Provenance",
          "target": [
            {
              "type": "Observation",
              "reference": "Observation/urn:uuid:eb09e61a-e0c9-41b7-a412-d36daa873665"
            }
          ]
        }
      }
    ]
  }
}
Mikael Rinnetmäki2024-10-23T13:11:34Z

The "existing system" being my FHIR app.

Mikael Rinnetmäki2024-10-23T13:12:10Z

Mikael Rinnetmäki said:

John Moehrke I was thinking of something like this:

{
  "resource": {
    "resourceType": "Bundle",
    "type": "transaction",
    "entry": [
      {
        "request": {
          "ifNoneExist": "identifier=bundle-test-observation",
          "method": "POST",
          "url": "Observation"
        },
        "fullUrl": "urn:uuid:eb09e61a-e0c9-41b7-a412-d36daa873665",
        "resource": {
          "resourceType": "Observation",
          "identifier": [
            {
              "assigner": {
                "display": "Sensotrend Oy",
                "identifier": {
                  "system": "urn:ietf:rfc:3986",
                  "value": "https://www.sensotrend.com/"
                }
              },
              "use": "official",
              "system": "urn:ietf:rfc:3986",
              "value": "urn:uuid:4e20b340-6477-592f-9d8e-bfb7395e61b9"
            }
          ],
          "status": "final",
          "code": {
            "coding": [
              {
                "code": "2344-0",
                "display": "Glucose [Mass/volume] in Body fluid",
                "system": "http://loinc.org"
              }
            ],
            "text": "Interstitial glucose"
          }
        }
      },
      {
        "request": {
          "ifNoneExist": "identifier=provenance-for-4e20b340-6477-592f-9d8e-bfb7395e61b9",
          "method": "POST",
          "url": "Provenance"
        },
        "fullUrl": "urn:uuid:9aa87028-6b8f-421f-9524-2e0ffac8f002",
        "resource": {
          "identifier": [
            {
              "assigner": {
                "display": "Sensotrend Oy",
                "identifier": {
                  "system": "urn:ietf:rfc:3986",
                  "value": "https://www.sensotrend.com/"
                }
              },
              "use": "usual",
              "value": "identifier=provenance-for-4e20b340-6477-592f-9d8e-bfb7395e61b9"
            }
          ],
          "agent": [
            {
              "type": {
                "coding": [
                  {
                    "code": "assembler",
                    "display": "Assembler",
                    "system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type"
                  }
                ],
                "text": "Assembler"
              },
              "who": {
                "display": "My FHIR App"
              }
            }
          ],
          "recorded": "2024-09-25T23:00:44.044+03:00",
          "resourceType": "Provenance",
          "target": [
            {
              "type": "Observation",
              "reference": "Observation/urn:uuid:eb09e61a-e0c9-41b7-a412-d36daa873665"
            }
          ]
        }
      }
    ]
  }
}

Hi @Mikael Rinnetmäki ,

In my opinion Provenance is stronger Resource. I think it's for ensure digital assign, so property 'who' is a physical person and not a simple log system.

IMHO!

Tks

Felipe Soriano2024-10-23T23:54:20Z

the Provenance.agent is any kind of agent. Not limited to physical person. This can definitely be a system, Device. An example is when content is created by an AI algorithm running on a specific model. That can be defined in Device and recorded as Provenance.agent.

John Moehrke2024-10-24T14:04:08Z

@Mikael Rinnetmäki it sounds like a bizarre FHIR server

Jens Villadsen2024-10-24T17:08:41Z

I dont think I understand the business need for identifiers on AuditEvents or Provenance

Jens Villadsen2024-10-24T17:10:59Z

I mean - there is always the case where you use FHIR as a proxy in front of multiple existing systems ( e.g. multiple existing legscy auditlogging systems) and you need to represent those in a lossless coherent setup in which case identifiers could be used to label where the events origin from ( given you dont use meta.source )

Jens Villadsen2024-10-24T17:17:43Z

Then you need identifiers

Jens Villadsen2024-10-24T17:18:00Z

But that is a general argument for having Identifiers on all resources

Jens Villadsen2024-10-24T17:19:07Z

( which would feel wrong since there actually is a meta.source)

Jens Villadsen2024-10-24T17:21:21Z

I think it is a perfectly valid optimization choice. See https://cloud.google.com/healthcare-api/docs/how-tos/fhir-resources#conditionally_create_a_fhir_resource

In the Cloud Healthcare API v1, conditional operations exclusively use the identifier search parameter, if it exists for the FHIR resource type, to determine which FHIR resources match a conditional search query.

Mikael Rinnetmäki2024-10-24T17:34:52Z

We use uuid5 identifiers in conditional creates for observations, with all FHIR servers we work with. Just plain data deduplication.

Mikael Rinnetmäki2024-10-24T17:36:00Z

Jens Villadsen said:

Mikael Rinnetmäki it sounds like a bizarre FHIR server

Perhaps @Paul Church cares to comment?

Mikael Rinnetmäki2024-10-24T17:37:16Z

This is just one of the compromises that were necessary to reach the scale that we're operating at. The search index is not transactional with the primary storage (to keep the tail latencies down) so conditional ops on arbitrary search criteria aren't atomic, which makes them almost useless. We looked at what customers actually needed and this satisfied the most common use cases, so we built a transactional index just for identifiers.

Unfortunately this doesn't cover the resource types that don't have identifiers - we would certainly be in favour of having a repeated identifier field on all resource types (it would be really useful for this and also for Healthcare Data Engine's entity reconciliation) but that's a big change.

Paul Church2024-10-24T18:23:20Z

This is the one I was also thinking about. It seems like a very different reason for which the .identifier element exists elsewhere. I would have preferred that the .src would have been defined better as that exists everywhere.

John Moehrke2024-10-24T18:36:13Z

Using meta has it own kinds of problems The metadata about a resource. This is content in the resource that is maintained by the infrastructure. Changes to the content might not always be associated with version changes to the resource. aka. meta on historic versions may/may not reflect the actual history meta data

Jens Villadsen2024-10-24T21:00:24Z

maybe not so bizzare after all :wink: How many resource types do not have Identifiers after all? ~5%?

Jens Villadsen2024-10-24T21:04:03Z

Paul Church said:

This is just one of the compromises that were necessary to reach the scale that we're operating at. The search index is not transactional with the primary storage (to keep the tail latencies down) so conditional ops on arbitrary search criteria aren't atomic, which makes them almost useless. We looked at what customers actually needed and this satisfied the most common use cases, so we built a transactional index just for identifiers.

Unfortunately this doesn't cover the resource types that don't have identifiers - we would certainly be in favour of having a repeated identifier field on all resource types (it would be really useful for this and also for Healthcare Data Engine's entity reconciliation) but that's a big change.

I agree, ID is an agnostic data, so it’s should be controlled by data store and not from specification. Specification allows many methods for this.

Felipe Soriano2024-10-24T22:00:01Z

@Paul Church just out of curiosity, would you perhaps be willing to consider supporting indices for resources without an identifier if a standard extension would exist for them, for this purpose?

That is, if there would be an identifierExtension that would be specified to support deduplication of resource types that do not have an identifier.

Mikael Rinnetmäki2024-10-25T15:04:53Z

My immediate use case is conditional create for the Provenance resource. Ideally in a batch Bundle. See also discussion in topic Bundles all the way down.

Mikael Rinnetmäki2024-10-25T15:10:58Z

We have given this some thought - perhaps a Google-specific extension on resources that don't have an identifier field, and an "identifier" search parameter that uses this extension and also participates in the index for conditional operations. The details would be a bit tricky. So far this has not gone past the stage of idle speculation.

Paul Church2024-10-25T19:55:37Z

Paul Church said:

We have given this some thought - perhaps a Google-specific extension on resources that don't have an identifier field, and an "identifier" search parameter that uses this extension and also participates in the index for conditional operations. The details would be a bit tricky. So far this has not gone past the stage of idle speculation.

Are the searches done directly against the element or using the searchparameter specification? If it's the latter, you could create an identifier extension, then use an identifier searchparam to search by it, making it look like searching for auditevents is the same as with any other resource.

Elliot Silver2024-10-25T20:18:47Z

Actual searches are done using the SearchParameter spec (with some preprocessing but basically our built-in search and custom search are doing the same thing) but the transactional index used for conditional operations is completely different and doesn't work with custom search parameters.

Conceptually you are right but in this particular case, with our particular implementation details, defining that search parameter won't accomplish what Mikael wants.

Paul Church2024-10-25T20:29:24Z

Guys, are you allow me to propose an argument for this discussion?

How can a resource for this depend on an extension?

In other words, is it an unusable resource without an extension?

@Grahame Grieve ?
@Lloyd McKenzie ?

Felipe Soriano2024-10-25T22:57:00Z

Is there a specific reason why AuditEvent and Provenance don't have business identifiers?

I noticed their absence as I was working with a FHIR server that only supports conditional creates with identifiers. I.e., an identifier is the only thing it allows me to specify as the value for the ifNoneExist rule.

Mikael Rinnetmäki2024-10-02T20:02:49Z

And yes, I'd like to only create a Provenance resource in the case it does not already exist.

Mikael Rinnetmäki2024-10-02T20:03:22Z

There was not a compelling equiviant business artifact that we needed to have identifier linkage. The guidance from modeling is that we include elements only where there is not an 80% need, expecting that extensions are easy. Can you provide examples of business identifiers to non-fhir artifacts? I don't think there is a compelling reason to reject. If we are still unclear, we could at least create a core extension so that everyone does it the same way.

John Moehrke2024-10-21T16:51:05Z

An extension would not help in my case. My problem is that I cannot do a conditional create of a Provenance resource on a server (Google Healthcare API), as it only supports conditional creates based on an identifier.

Mikael Rinnetmäki2024-10-21T23:22:00Z

then help us understand the "existing system" that has a business identifier that you need to place into AuditEvent.identifier or Provenance.identifier.

John Moehrke2024-10-22T11:44:04Z

image.png
Use agent for “who”, activity or outcome for “what”.

Felipe Soriano2024-10-22T15:26:49Z

Agent has “who” referred an a resource with Identifier (Patient, Device…..)

Felipe Soriano2024-10-22T15:30:33Z

It’s like centralize identifiers in actors and not in actions.

Felipe Soriano2024-10-22T15:32:19Z

@Felipe Soriano is this a new topic? It does not seem to relate to the existing topic, as for references Provenance and AuditEvent does use the Reference datattype that does have that support. This topic is about a root level .identifier in Provenance and AuditEvent.

John Moehrke2024-10-22T15:38:35Z

John Moehrke said:

Felipe Soriano is this a new topic? It does not seem to relate to the existing topic, as for references Provenance and AuditEvent does use the Reference datattype that does have that support. This topic is about a root level .identifier in Provenance and AuditEvent.

Hey @John Moehrke,

I think that both Resources contain reference properties to Resources with identifiers.

if access is from user or root, it’s implementation rule.

In my opinion always start with security row levels. Root access doesn’t change implementation.

Root access is analyzed action. User access is operational action.

Systems operation never can down.

What you think about it?

tks

Felipe Soriano2024-10-22T16:17:06Z

That is not a problem. That is not what this stream is discussing. This stream is about a business identifier for an AuditEvent instance, or Provenance instance.

John Moehrke2024-10-22T17:48:09Z

BasedOn?

Felipe Soriano2024-10-22T23:22:36Z

It's a action based in event and actors, ok? For event there is basedOn, for actor there is agente..

Felipe Soriano2024-10-22T23:24:50Z

For Resource 'what' there is Entity

Felipe Soriano2024-10-22T23:26:41Z

@John Moehrke I was thinking of something like this:

{
  "resource": {
    "resourceType": "Bundle",
    "type": "transaction",
    "entry": [
      {
        "request": {
          "ifNoneExist": "identifier=bundle-test-observation",
          "method": "POST",
          "url": "Observation"
        },
        "fullUrl": "urn:uuid:eb09e61a-e0c9-41b7-a412-d36daa873665",
        "resource": {
          "resourceType": "Observation",
          "identifier": [
            {
              "assigner": {
                "display": "Sensotrend Oy",
                "identifier": {
                  "system": "urn:ietf:rfc:3986",
                  "value": "https://www.sensotrend.com/"
                }
              },
              "use": "official",
              "system": "urn:ietf:rfc:3986",
              "value": "urn:uuid:4e20b340-6477-592f-9d8e-bfb7395e61b9"
            }
          ],
          "status": "final",
          "code": {
            "coding": [
              {
                "code": "2344-0",
                "display": "Glucose [Mass/volume] in Body fluid",
                "system": "http://loinc.org"
              }
            ],
            "text": "Interstitial glucose"
          }
        }
      },
      {
        "request": {
          "ifNoneExist": "identifier=provenance-for-4e20b340-6477-592f-9d8e-bfb7395e61b9",
          "method": "POST",
          "url": "Provenance"
        },
        "fullUrl": "urn:uuid:9aa87028-6b8f-421f-9524-2e0ffac8f002",
        "resource": {
          "identifier": [
            {
              "assigner": {
                "display": "Sensotrend Oy",
                "identifier": {
                  "system": "urn:ietf:rfc:3986",
                  "value": "https://www.sensotrend.com/"
                }
              },
              "use": "usual",
              "value": "identifier=provenance-for-4e20b340-6477-592f-9d8e-bfb7395e61b9"
            }
          ],
          "agent": [
            {
              "type": {
                "coding": [
                  {
                    "code": "assembler",
                    "display": "Assembler",
                    "system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type"
                  }
                ],
                "text": "Assembler"
              },
              "who": {
                "display": "My FHIR App"
              }
            }
          ],
          "recorded": "2024-09-25T23:00:44.044+03:00",
          "resourceType": "Provenance",
          "target": [
            {
              "type": "Observation",
              "reference": "Observation/urn:uuid:eb09e61a-e0c9-41b7-a412-d36daa873665"
            }
          ]
        }
      }
    ]
  }
}
Mikael Rinnetmäki2024-10-23T13:11:34Z

The "existing system" being my FHIR app.

Mikael Rinnetmäki2024-10-23T13:12:10Z

Mikael Rinnetmäki said:

John Moehrke I was thinking of something like this:

{
  "resource": {
    "resourceType": "Bundle",
    "type": "transaction",
    "entry": [
      {
        "request": {
          "ifNoneExist": "identifier=bundle-test-observation",
          "method": "POST",
          "url": "Observation"
        },
        "fullUrl": "urn:uuid:eb09e61a-e0c9-41b7-a412-d36daa873665",
        "resource": {
          "resourceType": "Observation",
          "identifier": [
            {
              "assigner": {
                "display": "Sensotrend Oy",
                "identifier": {
                  "system": "urn:ietf:rfc:3986",
                  "value": "https://www.sensotrend.com/"
                }
              },
              "use": "official",
              "system": "urn:ietf:rfc:3986",
              "value": "urn:uuid:4e20b340-6477-592f-9d8e-bfb7395e61b9"
            }
          ],
          "status": "final",
          "code": {
            "coding": [
              {
                "code": "2344-0",
                "display": "Glucose [Mass/volume] in Body fluid",
                "system": "http://loinc.org"
              }
            ],
            "text": "Interstitial glucose"
          }
        }
      },
      {
        "request": {
          "ifNoneExist": "identifier=provenance-for-4e20b340-6477-592f-9d8e-bfb7395e61b9",
          "method": "POST",
          "url": "Provenance"
        },
        "fullUrl": "urn:uuid:9aa87028-6b8f-421f-9524-2e0ffac8f002",
        "resource": {
          "identifier": [
            {
              "assigner": {
                "display": "Sensotrend Oy",
                "identifier": {
                  "system": "urn:ietf:rfc:3986",
                  "value": "https://www.sensotrend.com/"
                }
              },
              "use": "usual",
              "value": "identifier=provenance-for-4e20b340-6477-592f-9d8e-bfb7395e61b9"
            }
          ],
          "agent": [
            {
              "type": {
                "coding": [
                  {
                    "code": "assembler",
                    "display": "Assembler",
                    "system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type"
                  }
                ],
                "text": "Assembler"
              },
              "who": {
                "display": "My FHIR App"
              }
            }
          ],
          "recorded": "2024-09-25T23:00:44.044+03:00",
          "resourceType": "Provenance",
          "target": [
            {
              "type": "Observation",
              "reference": "Observation/urn:uuid:eb09e61a-e0c9-41b7-a412-d36daa873665"
            }
          ]
        }
      }
    ]
  }
}

Hi @Mikael Rinnetmäki ,

In my opinion Provenance is stronger Resource. I think it's for ensure digital assign, so property 'who' is a physical person and not a simple log system.

IMHO!

Tks

Felipe Soriano2024-10-23T23:54:20Z

the Provenance.agent is any kind of agent. Not limited to physical person. This can definitely be a system, Device. An example is when content is created by an AI algorithm running on a specific model. That can be defined in Device and recorded as Provenance.agent.

John Moehrke2024-10-24T14:04:08Z

@Mikael Rinnetmäki it sounds like a bizarre FHIR server

Jens Villadsen2024-10-24T17:08:41Z

I dont think I understand the business need for identifiers on AuditEvents or Provenance

Jens Villadsen2024-10-24T17:10:59Z

I mean - there is always the case where you use FHIR as a proxy in front of multiple existing systems ( e.g. multiple existing legscy auditlogging systems) and you need to represent those in a lossless coherent setup in which case identifiers could be used to label where the events origin from ( given you dont use meta.source )

Jens Villadsen2024-10-24T17:17:43Z

Then you need identifiers

Jens Villadsen2024-10-24T17:18:00Z

But that is a general argument for having Identifiers on all resources

Jens Villadsen2024-10-24T17:19:07Z

( which would feel wrong since there actually is a meta.source)

Jens Villadsen2024-10-24T17:21:21Z

I think it is a perfectly valid optimization choice. See https://cloud.google.com/healthcare-api/docs/how-tos/fhir-resources#conditionally_create_a_fhir_resource

In the Cloud Healthcare API v1, conditional operations exclusively use the identifier search parameter, if it exists for the FHIR resource type, to determine which FHIR resources match a conditional search query.

Mikael Rinnetmäki2024-10-24T17:34:52Z

We use uuid5 identifiers in conditional creates for observations, with all FHIR servers we work with. Just plain data deduplication.

Mikael Rinnetmäki2024-10-24T17:36:00Z

Jens Villadsen said:

Mikael Rinnetmäki it sounds like a bizarre FHIR server

Perhaps @Paul Church cares to comment?

Mikael Rinnetmäki2024-10-24T17:37:16Z

This is just one of the compromises that were necessary to reach the scale that we're operating at. The search index is not transactional with the primary storage (to keep the tail latencies down) so conditional ops on arbitrary search criteria aren't atomic, which makes them almost useless. We looked at what customers actually needed and this satisfied the most common use cases, so we built a transactional index just for identifiers.

Unfortunately this doesn't cover the resource types that don't have identifiers - we would certainly be in favour of having a repeated identifier field on all resource types (it would be really useful for this and also for Healthcare Data Engine's entity reconciliation) but that's a big change.

Paul Church2024-10-24T18:23:20Z

This is the one I was also thinking about. It seems like a very different reason for which the .identifier element exists elsewhere. I would have preferred that the .src would have been defined better as that exists everywhere.

John Moehrke2024-10-24T18:36:13Z

Using meta has it own kinds of problems The metadata about a resource. This is content in the resource that is maintained by the infrastructure. Changes to the content might not always be associated with version changes to the resource. aka. meta on historic versions may/may not reflect the actual history meta data

Jens Villadsen2024-10-24T21:00:24Z

maybe not so bizzare after all :wink: How many resource types do not have Identifiers after all? ~5%?

Jens Villadsen2024-10-24T21:04:03Z

Paul Church said:

This is just one of the compromises that were necessary to reach the scale that we're operating at. The search index is not transactional with the primary storage (to keep the tail latencies down) so conditional ops on arbitrary search criteria aren't atomic, which makes them almost useless. We looked at what customers actually needed and this satisfied the most common use cases, so we built a transactional index just for identifiers.

Unfortunately this doesn't cover the resource types that don't have identifiers - we would certainly be in favour of having a repeated identifier field on all resource types (it would be really useful for this and also for Healthcare Data Engine's entity reconciliation) but that's a big change.

I agree, ID is an agnostic data, so it’s should be controlled by data store and not from specification. Specification allows many methods for this.

Felipe Soriano2024-10-24T22:00:01Z

@Paul Church just out of curiosity, would you perhaps be willing to consider supporting indices for resources without an identifier if a standard extension would exist for them, for this purpose?

That is, if there would be an identifierExtension that would be specified to support deduplication of resource types that do not have an identifier.

Mikael Rinnetmäki2024-10-25T15:04:53Z

My immediate use case is conditional create for the Provenance resource. Ideally in a batch Bundle. See also discussion in topic Bundles all the way down.

Mikael Rinnetmäki2024-10-25T15:10:58Z

We have given this some thought - perhaps a Google-specific extension on resources that don't have an identifier field, and an "identifier" search parameter that uses this extension and also participates in the index for conditional operations. The details would be a bit tricky. So far this has not gone past the stage of idle speculation.

Paul Church2024-10-25T19:55:37Z

Paul Church said:

We have given this some thought - perhaps a Google-specific extension on resources that don't have an identifier field, and an "identifier" search parameter that uses this extension and also participates in the index for conditional operations. The details would be a bit tricky. So far this has not gone past the stage of idle speculation.

Are the searches done directly against the element or using the searchparameter specification? If it's the latter, you could create an identifier extension, then use an identifier searchparam to search by it, making it look like searching for auditevents is the same as with any other resource.

Elliot Silver2024-10-25T20:18:47Z

Actual searches are done using the SearchParameter spec (with some preprocessing but basically our built-in search and custom search are doing the same thing) but the transactional index used for conditional operations is completely different and doesn't work with custom search parameters.

Conceptually you are right but in this particular case, with our particular implementation details, defining that search parameter won't accomplish what Mikael wants.

Paul Church2024-10-25T20:29:24Z

Guys, are you allow me to propose an argument for this discussion?

How can a resource for this depend on an extension?

In other words, is it an unusable resource without an extension?

@Grahame Grieve ?
@Lloyd McKenzie ?

Felipe Soriano2024-10-25T22:57:00Z
The discussion centered on the challenges related to submitting data bundles with interdependencies to Electronic Health Records (EHR), where a batch submission restricts the ability to link resources while a transaction does not allow selective persistence of resources. Participants debated whether to utilize FHIR messaging or define a custom operation, ultimately leaning towards a tailored operation to efficiently transmit data while maintaining compliance with FHIR standards.
61 comments

We are hitting a challenge related to the CGM use case where we want to allow clients to submit a bundle to the EHR with a whole set of linked data (e.g., parent observations together with their members; diagnostic reports; document references), while allowing the EHR to pick and choose which resources it wants to persist.

A batch submission to POST / seems to prohibit the inter-resource links, and a transaction submission seems to prohibit the EHR's picking and choosing.

Have others faced this issue? Of course we could define a custom operation but it seems like these semantics ("here is a set of data, keep what you want") would be broadly reusable.

Josh Mandel2024-11-04T15:24:04Z

That's called "Messaging"... don't reinvent that, it already exists. Server side orchestration.

René Spronk2024-11-04T15:30:18Z

If you don't want that, then it'd be an operation. There's no way to do this using out of the box REST.

René Spronk2024-11-04T15:31:12Z

Not out of the box fhir rest today, that's fair. But this gap seems arbitrary to me.

Josh Mandel2024-11-04T15:32:08Z

Well, 'client side orchestration' is a core concept of REST. FHIR introduced a workaround by adding a hack to support operations.

René Spronk2024-11-04T15:35:15Z

Note that a receiver doesn't have to accept all content of a FHIR resource, but deciding not to do anything with a resource posted to a server ? That'd probably go a step to far (from a pure REST perspective).

René Spronk2024-11-04T15:36:50Z

You mean as transaction having behavior? That's also fair...

Josh Mandel2024-11-04T15:44:54Z

I think it is similar to messaging, but not quite the same either.

My first reaction was that we should add a generic operation on bundle ($process?) that can be defined to take an arbitrary bundle for processing according to either a parameter (canonical) or key (profile).

But thinking on it, I think that is overall less-good than just defining a specific operation for this use case. I like the simplicity of a single 'here is a bundle do something with it' operation that could serve as a gateway, but I think it would cause implementation issues down the road.

So, my two cents would be to define a $process-cgm operation that takes in a collection bundle and does what you want with it.

Gino Canessa2024-11-04T15:56:48Z

Agreed, a custom operation for CGM is the least disruptive, most clearly FHIR compliant approach. Just want to make sure we're not missing the opportunity for reusable components.

And I realize I should have been more precise about the semantics here. It's not just "here's a set a resources, do what you want with them". Rather, it's "here's a set of resources; please persistent them all... just like a transaction, but it's okay to skip things that you can't keep"

Josh Mandel2024-11-04T16:00:54Z

Yeah, it feels like we could also carve out something in transaction for 'successfully reviewed and not keeping this'.

Gino Canessa2024-11-04T16:06:44Z

Yeah, you can almost get there today with 202 responses to all the creates (but that implies async processing will occur, rather than "I already rejected")

Josh Mandel2024-11-04T16:28:02Z

Yeah, I thought about that too ;-). I think we would want something more specific though, so that the caller can understand what was actually persisted.

Gino Canessa2024-11-04T16:28:49Z

Is this a bit like a conditional create, but the condition depends on the server capabilities? e.g. an "if-supported" header

Rik Smithies2024-11-04T17:35:18Z

I think so. But more something of a union of "if-supported" and "if-wanted", along with a status code that would be successful for the transaction but indicate to the caller that it was not persisted.

Gino Canessa2024-11-04T17:38:35Z

No way to do that in a transaction though, without adding to Bundle.request

Rik Smithies2024-11-04T17:41:23Z

Yep - trying to sort out if there is something workable before filing a ticket to discuss further.

Gino Canessa2024-11-04T17:42:54Z

"If-you-feel-like-it" header :-)

Rik Smithies2024-11-04T17:44:28Z

Lol - I am going back and forth between a feature-capability header and an extension on Bundle.type to indicate it can be processed that way.

In either case, need to figure out if there is a sensical response that can thread the needle on the existing behavior so that it is safe in all situations (e.g., client thinks it will + server does not and vice-versa).

Gino Canessa2024-11-04T17:46:53Z

you guys sure are afraid of "FHIR Messaging"...

John Moehrke2024-11-04T17:52:05Z

an alternative is a History Bundle

John Moehrke2024-11-04T17:52:25Z

I am not afraid of messaging, I just do not think this use case aligns more than it does batch/transaction.

history bundles do not have processing semantics, so it would require a new operation anyway and it could just use a collection at that point.

Gino Canessa2024-11-04T18:00:13Z

Could you elaborate on why this isn't messaging? When we get CGM on incoming v2 interfaces today, they come in the form of messages.

Cooper Thompson2024-11-04T18:02:17Z

I don't think there are hard boundaries, but generally "write these data to your endpoint" is well covered by FHIR REST API. The rest semantics of identifying resources, learning about locations written to, being able to issue follow-up queries that read your own writes...all this is consistent with FHIR REST semantics.

Josh Mandel2024-11-04T18:05:59Z

transaction submission seems to prohibit the EHR's picking and choosing.

what language?

Grahame Grieve2024-11-04T18:10:45Z

For a transaction, servers SHALL either accept all actions (i.e. process each entry resulting in a 2xx or 3xx response code) and return an overall 200 OK, along with a response bundle (see below), or reject all resources and return an HTTP 400 or 500 type response.

I read this as "you can't decide to persist some and reject others" but if that's an over-read, this would be great to understand.

Josh Mandel2024-11-04T18:12:29Z

Perhaps we can interpret this as "servers SHALL either accept all actions permitted by business rules and return an overall 200 OK, or...."

image.png

Cooper Thompson2024-11-04T18:20:53Z

(deleted)

Eric Haas2024-11-04T18:33:09Z

I read this as "you can't decide to persist some and reject others" but if that's an over-read, this would be great to understand.

yes. that is what it means, and the definitions of update and create in the spec are clear too. The language does preclude your use case. And it does so deliberately. @René Spronk is right about the intention to be client driven. A transaction isn't something a server can opt out of getting right

As far as an operation, I'm inclined to agree with @Gino Canessa - trying to specify generically and reusably how a server would act if it declined to accept a resource that was referred to elsewhere in the set of submitted resources sounds like it would get super complicated long before it got sufficiently robust to be reliable, and so it's better to have a custom operation.

The server couldn't ignore the patient resource and patient matching issues, right?

Grahame Grieve2024-11-04T18:43:36Z

As for "this is messaging, why are you scared of that" - it could be done with messaging, but you'd have to define an event with the same kind of details as if you defined an operation

Grahame Grieve2024-11-04T18:44:37Z

It seems like messaging and operations are basically equivalent. So my vote would be messaging, because there are many thousands of humans who have a solid understanding of "messages". And thus I won't have to explain to all of them what a custom operation is. And then explain to them why we picked that instead of messaging.

Cooper Thompson2024-11-04T18:47:05Z

It seems like messaging and operations are basically equivalent.

well, they're not when it comes to the implementation level. Unless you call $process-message, in which case they run into each other, but messaging gives you more layers of flex. (and mistakes)

So my vote would be messaging, because there are many thousands of humans who have a solid understanding of "messages".

Really? like, as in v2 messages? Because that might suggest to me that messaging isn't such a good idea. Because there are precisely 0 users who have a sense of this message type right now

And thus I won't have to explain to all of them what a custom operation is. And then explain to them why we picked that instead of messaging.

this seems like a non-argument since you'll have to explain to them (a) what a FHIR message is and (b) why we picked that instead of an operation

Unless deployment of FHIR Messaging is way more common in USA than I expected

Grahame Grieve2024-11-04T18:50:48Z

Today, we have CGM data flowing into our EHR using HL7v2 messages (ORUs). So I think this message type is understood. We are just translating it into FHIR.

Cooper Thompson2024-11-04T18:51:41Z

FHIR Messaging is somewhat common outside the USA. And CGM spec is UV realm.

Cooper Thompson2024-11-04T18:52:34Z

But I guess flipping it the other way: what are the advantages an operation has over messaging? For this type of data, I don't see many.

Cooper Thompson2024-11-04T18:53:15Z

I'm not sure what you are referring to with the flex/mistakes part.

Cooper Thompson2024-11-04T18:53:47Z

those are better arguments, but an ORU message type? interesting.

@Josh Mandel the degree of specification of an R01 event is way short of the kind of spec you're talking about

Grahame Grieve2024-11-04T18:55:12Z

And I will admit I am being selfish when I advocate for messaging. We have a set of existing tools, documentation, and training for our admins and analysts to work with FHIR Messaging. We don't have that for operations. But I don't expect this reason to overrule any conceptual arguments.

Cooper Thompson2024-11-04T18:55:34Z

But I guess flipping it the other way: what are the advantages an operation has over messaging? For this type of data, I don't see many.

well, it's about the the complexity of the transfer. You're right that operations and messages have similar outcomes. But an operation is a simpler interaction: send the server a request to perform some operation, and get a result back. Where as messaging is 'send a message somewhere, where it might get changed/re-sent/replayed, and then wait to get a response back at some time'

I'm not sure what you are referring to with the flex/mistakes part.

Routing, messaging agents, loosely specified events. These are good for custom implementations, but they make scaling seamlessly hard

Grahame Grieve2024-11-04T18:58:18Z

We have a set of existing tools, documentation, and training for our admins and analysts to work with FHIR Messaging

for FHIR messaging? Interesting. What are you currently using it for?

Grahame Grieve2024-11-04T18:58:40Z

Yup - FHIR Messaging. I don't have the full list handy, but at least Norway and Denmark have some national specs that we have implemented.

Cooper Thompson2024-11-04T19:06:52Z

ah Europe, ok.

Grahame Grieve2024-11-04T19:10:34Z

Yeah, in US everyone still uses HL7v2, NCPDP, etc.

Cooper Thompson2024-11-04T19:22:12Z

For what is worth we had some cases of having to import bundles using some special logic and we used $process-message - that was somewhat simpler for both clients and server than adding custom operations

Michele Mottini2024-11-04T19:34:42Z

Can you say more about "simpler" @Michele Mottini ? I haven't used messaging but at a glance it seems to introduce a lot more machinery (e.g., headers with sources/responses, event definitions, conformance challenges of describing how the event type dictates a specific profile of bundle must be supplied of bundle must be supplied for a given event code) compared with dedicated operation (which can directly profile what type of bundle is to be submitted, with no additional machinery around it).

Josh Mandel2024-11-04T19:49:03Z

Simpler to implement - 'if the event a this do x, if the event is b to y' instead of having to create different operation endpoints

Michele Mottini2024-11-04T19:59:27Z

The profiling is not that complicated either? See for example https://build.fhir.org/ig/HL7/davinci-alerts/StructureDefinition-notifications-bundle.html

Michele Mottini2024-11-04T20:00:55Z

Operations involve less overhead. You don't necessarily need a Bundle (or even a payload) if url filters are sufficient. Operations don't require specifying sender or receiver or worrying about reliable messaging or any of that stuff. To me, messaging is something that you only use if:
a) there's a need for routing (sender doesn't know the endpoint of the receiver, or there's a fan-out expectation)
b) the systems involved already prefer a messaging approach to REST because of existing infrastructure. (You can have a 'dumb' front-door endpoint that then routes a request to a specific handler, which is harder to do with operations.)

Lloyd McKenzie2024-11-04T20:06:18Z

Generally, to meet real-world business rules, we need senders, receivers, and especially reliable delivery, so messaging ends up being easier than operations for this type of exchange. If you start with operations, then folks assume you don't need that stuff, then you end up doing extra work later to tell everyone that you actually do need that stuff and here is how you hack it in to the operation.

Cooper Thompson2024-11-04T21:44:55Z

It is almost more about expectations than anything else. With messaging, there is generally an expectation that if the data is generally fine, but something goes wrong (e.g., the chart is locked and data can't file), the server can manage a resequencing queue to eventually file the data when the lock is released. But with operations (or RESTful exchanges in general), the expectation is that the client has to do that. And often (in my experience) the clients are less well equipped to manage retries. And for things like locks, the best they can really do is retry regularly, since I don't know that many systems send subscription notifications based on lock releases.

Cooper Thompson2024-11-04T21:48:09Z

But where locks are one example, in general, which system do we want to maintain the "workqueue" of messages that are generally fine, but couldn't file due to some state issue? The default "expectations" seem like Messaging = server maintains the workqueue and "operations" = client maintains the workqueue. This assignment isn't required, but it feels... natural?

Cooper Thompson2024-11-04T21:49:49Z

Sender and receiver for operations would be handled by the auth layer, the same as any other REST action.

Lloyd McKenzie2024-11-04T23:17:52Z

Not sure what you mean by “work queue”. Are you talking asynchronous? If so, the yes

Lloyd McKenzie2024-11-04T23:18:57Z

If Epic says that A is better then B I think it would be a good idea to go with A

Michele Mottini2024-11-05T00:12:07Z

The work queue is needed when data is exchanged synchronously, but the persistence of that data is handled asynchronously. For example, a Message is sent from the CGM vendor to an EHR. The EHR checks the data and it all looks good, but it can't store the data to the chart right now, because the chart is locked (or various other reasons, but locking is a good example). The EHR synchronously responds to the CGM vendor saying that the data is accepted. At this point, the EHR is "promising" that the data will eventually be persisted to the chart. That message is then put on a queue. There are some automated processes that my take the data from the queue and persist it (for example, automatically when locks are released). But in some cases, there may be manual work involved to resolve the issue. For example, the patient may be locked because it is being unmerged, after which a human must decide which patient the message to file to. In this case, the message is sent to what we call a "work queue", that human analysts regularly review to ensure data makes it into the correct chart.

The alternative is that the EHR just returns an error to the CGM app, even if the data is good. But in my experience, many apps are not equipped or interested in taking on the responsibility for ensuring data eventually makes it into the EHR's chart. They don't know (and probably shouldn't need to know) what system state means the data can be persisted. And they probably don't now how to resolve the state issue. Some state issues like locks will usually resolve themselves eventually. But other issues may resolve human intervention in the EHR.

Cooper Thompson2024-11-05T15:38:29Z

These are important considerations, but they didn't surface in our design discussion for the Argo CGM project until just now. Let's be sure to take these into account after the connectathon when we're evaluating how to proceed. On the flip side, we do want to give clients a clear way to tell whether (and at what location) their submitted data has been persisted.

Josh Mandel2024-11-05T15:43:17Z

I did get carried away on the general principles. For CGM data specifically, some of these issues aren't as critical, since the use case here doesn't involve doing critical alerting based on data, and the data use expectations are more trending focused, or for provider/patient discussion (where if there is missing data, they can just resolve in then and there).

Cooper Thompson2024-11-05T15:47:14Z

How do you handle this for simple REST? Because the expectation is that if you return a 201 or 200 you could perform a ‘read’ a couple of seconds later and see the new data (as could anyone else who’s authorized)

Lloyd McKenzie2024-11-05T20:10:14Z

This is one of the main reasons why we have a limited number of "write" REST APIs. But for the write APIs we do have, we'll return a 4xx code, and then it becomes the app's (or user's) problem. And those are the situations I'm referencing when I say "in my experience, many apps are not equipped or interested in taking on the responsibility".

Cooper Thompson2024-11-05T21:29:52Z

We still often recommend folks use HL7v2 messaging instead of FHIR REST APIs for exactly this reason.

Cooper Thompson2024-11-05T21:30:50Z

Somewhat related, but given that the HTTP part of the FHIR spec that covers batches and transactions is normative, is there documentation anywhere for how each part of that page got past the FMM4 "tested across scope" and FMM5 "5 production systems" criteria? Did those FMM criteria get evaluated for each section of the HTTP page?

Cooper Thompson2024-11-06T21:45:27Z

I don't think we formally evaluated it at that level. at least, I don't remember it. We did look at the support for transactions, I recall asking how many systems had implemented them

Grahame Grieve2024-11-06T22:08:34Z
In a discussion on definition-based extraction for FHIR resources, participants share insights on implementing extraction for questionnaires, addressing questions like resource referencing and nested contexts. Key topics include the challenges of defining profiles for extracted resources, the appropriateness of using definitions versus observations, and proposals for streamlining the extraction process through structural mappings and documented examples.
53 comments
GF
KJ

Was never merged back into the FirelySDK

Brian Postlethwaite2022-07-28T21:35:44Z

Hello All,
I am new to SDC implementation and got stuck at following point- How can we pass the existing resource reference to a newly extracted resource using Definition based extraction. It would be really helpful if there is sample example for the same.
Thank you

Ankita Srivastava2022-09-01T07:00:17Z

To clarify, you're generating a new resource with extraction and then trying to create or update a resource that points to that new resource? I don't think we have a solution for that. Can you submit a Jira issue for us to try to tackle it as a new capability?

Lloyd McKenzie2022-09-01T15:05:11Z

For instance, Patient is an existing resource. Created new resource - Encounter using Definition Based Extraction. Now, I need to pass Patient reference in Encounter (Encounter.subject)

Ankita Srivastava2022-09-01T20:51:17Z

Thank you so much @Lloyd McKenzie & @Brian Postlethwaite for the clarification. That really helps.

Ankita Srivastava2022-09-01T22:02:38Z

Sample:
{
"extension": [
{
"url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression",
"valueExpression": {
"language": "text/fhirpath",
"expression": "'Patient/'+%LaunchPatient.id",
"name": "enc-subject"
}
},
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden",
"valueBoolean": true
}
],
"linkId": "enc-subject",
"type": "string",
"text": "Subject",
"readOnly": true,
"definition": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter#Encounter.subject.reference"
}

Ankita Srivastava2022-09-01T22:04:58Z

Hi All, I am working on Pregnancy Questionnaire where I need to capture "Delivery Time" which can repeat in case of twins, triplet etc. For each Delivery Time, a new Observation should be extracted. Can someone review the below Questionnaire for the same (if that is the correct approach):

{
"resourceType": "Questionnaire",
"id": "ANCDELIVERY",
"extension": [
{
"url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-launchContext",
"extension": [
{
"url": "name",
"valueId": "LaunchPatient"
},
{
"url": "type",
"valueCode": "Patient"
},
{
"url": "description",
"valueString": "The patient that is to be used to pre-populate the form"
}
]
},
{
"url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-sourceQueries",
"valueReference": {
"reference": "#PrePopQuery"
}
}
],
"url": "http://sample.org/Questionnaire/ANCDELIVERY",
"version": "0.1.0",
"name": "ANCOYO Labour & Delivery",
"title": "ANCOYO Labour & Delivery",
"status": "active",
"experimental": false,
"date": "2022-08-25T09:00:00+05:30",
"description": "ANCOYO Labour & Delivery workflow.",
"subjectType": [
"Patient"
],
"item": [
{
"extension": [
{
"url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemExtractionContext",
"valueCode": "Observation"
}
],
"linkId": "11.2.2",
"type": "group",
"text": "Delivery Time",
"item": [
{
"linkId": "11.2.2.1",
"type": "time",
"text": "Delivery Time",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.valueTime",
"repeats": true
},
{
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden",
"valueBoolean": true
}
],
"enableWhen": [
{
"question": "11.2.2.1",
"operator": "exists",
"answerBoolean": true
}
],
"linkId": "11.2.2.2",
"type": "group",
"text": "Delivery Time Code",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.code",
"item": [
{
"linkId": "11.2.2.2.1",
"type": "choice",
"text": "Delivery Time Code",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.code.coding",
"initial": [
{
"valueCoding": {
"code": "ANC.End.12",
"display": "Delivery time",
"system": "http://fhir.org/guides/who/anc-cds/CodeSystem/anc-custom-codes"
}
}
]
}
]
},
{
"extension": [
{
"url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression",
"valueExpression": {
"language": "text/fhirpath",
"expression": "'Patient/'+%LaunchPatient.id",
"name": "11.2.2.3"
}
},
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden",
"valueBoolean": true
}
],
"enableWhen": [
{
"question": "11.2.2.1",
"operator": "exists",
"answerBoolean": true
}
],
"linkId": "11.2.2.3",
"type": "string",
"text": "Subject",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.subject.reference"
},
{
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden",
"valueBoolean": true
}
],
"enableWhen": [
{
"question": "11.2.2.1",
"operator": "exists",
"answerBoolean": true
}
],
"linkId": "11.2.2.4",
"type": "choice",
"text": "Status",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.status",
"initial": [
{
"valueCoding": {
"code": "final",
"display": "Final",
"system": "http://hl7.org/fhir/observation-status"
}
}
]
},
{
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden",
"valueBoolean": true
}
],
"enableWhen": [
{
"question": "11.2.2.1",
"operator": "exists",
"answerBoolean": true
}
],
"linkId": "11.2.2.5",
"type": "choice",
"text": "Category",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.category",
"initial": [
{
"valueCoding": {
"code": "survey",
"display": "Survey",
"system": "http://terminology.hl7.org/CodeSystem/observation-category"
}
}
]
},
{
"extension": [
{
"url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression",
"valueExpression": {
"language": "text/fhirpath",
"expression": "today()",
"name": "11.2.2.6"
}
},
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden",
"valueBoolean": true
}
],
"enableWhen": [
{
"question": "11.2.2.1",
"operator": "exists",
"answerBoolean": true
}
],
"linkId": "11.2.2.6",
"type": "dateTime",
"text": "Effective DateTime",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.effectiveDateTime"
}
]
}
]
}

Ankita Srivastava2022-11-04T05:22:02Z

Is there a standard way to define the profile of the resource that is being extracted from a questionnaire using definition based extraction? I know that we can use a hidden item with an initial answer mapped to the Resource.meta.profile field , is this inline with the SDC standard?

cc: @Pallavi Ganorkar

Kashyap Jois2022-11-04T07:30:53Z

Instead of specifying the observation profile canonical url, you coukd specify the canonical url of your custom profile.
Do you have one already for your case?
(I could try it out)

Brian Postlethwaite2022-11-04T12:02:55Z

Currently, we didn't create our profile url.. that's why using the base url.

Ankita Srivastava2022-11-04T12:37:22Z

How can you have a profile without a profile URL?

Lloyd McKenzie2022-11-04T13:58:03Z

Are you referring to this query?

Ankita Srivastava said:

Hi All, I am working on Pregnancy Questionnaire where I need to capture "Delivery Time" which can repeat in case of twins, triplet etc. For each Delivery Time, a new Observation should be extracted. Can someone review the below Questionnaire for the same (if that is the correct approach):

{
"resourceType": "Questionnaire",
"id": "ANCDELIVERY",
"extension": [
{
"url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-launchContext",
"extension": [
{
"url": "name",
"valueId": "LaunchPatient"
},
{
"url": "type",
"valueCode": "Patient"
},
{
"url": "description",
"valueString": "The patient that is to be used to pre-populate the form"
}
]
},
{
"url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-sourceQueries",
"valueReference": {
"reference": "#PrePopQuery"
}
}
],
"url": "http://sample.org/Questionnaire/ANCDELIVERY",
"version": "0.1.0",
"name": "ANCOYO Labour & Delivery",
"title": "ANCOYO Labour & Delivery",
"status": "active",
"experimental": false,
"date": "2022-08-25T09:00:00+05:30",
"description": "ANCOYO Labour & Delivery workflow.",
"subjectType": [
"Patient"
],
"item": [
{
"extension": [
{
"url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-itemExtractionContext",
"valueCode": "Observation"
}
],
"linkId": "11.2.2",
"type": "group",
"text": "Delivery Time",
"item": [
{
"linkId": "11.2.2.1",
"type": "time",
"text": "Delivery Time",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.valueTime",
"repeats": true
},
{
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden",
"valueBoolean": true
}
],
"enableWhen": [
{
"question": "11.2.2.1",
"operator": "exists",
"answerBoolean": true
}
],
"linkId": "11.2.2.2",
"type": "group",
"text": "Delivery Time Code",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.code",
"item": [
{
"linkId": "11.2.2.2.1",
"type": "choice",
"text": "Delivery Time Code",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.code.coding",
"initial": [
{
"valueCoding": {
"code": "ANC.End.12",
"display": "Delivery time",
"system": "http://fhir.org/guides/who/anc-cds/CodeSystem/anc-custom-codes"
}
}
]
}
]
},
{
"extension": [
{
"url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression",
"valueExpression": {
"language": "text/fhirpath",
"expression": "'Patient/'+%LaunchPatient.id",
"name": "11.2.2.3"
}
},
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden",
"valueBoolean": true
}
],
"enableWhen": [
{
"question": "11.2.2.1",
"operator": "exists",
"answerBoolean": true
}
],
"linkId": "11.2.2.3",
"type": "string",
"text": "Subject",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.subject.reference"
},
{
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden",
"valueBoolean": true
}
],
"enableWhen": [
{
"question": "11.2.2.1",
"operator": "exists",
"answerBoolean": true
}
],
"linkId": "11.2.2.4",
"type": "choice",
"text": "Status",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.status",
"initial": [
{
"valueCoding": {
"code": "final",
"display": "Final",
"system": "http://hl7.org/fhir/observation-status"
}
}
]
},
{
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden",
"valueBoolean": true
}
],
"enableWhen": [
{
"question": "11.2.2.1",
"operator": "exists",
"answerBoolean": true
}
],
"linkId": "11.2.2.5",
"type": "choice",
"text": "Category",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.category",
"initial": [
{
"valueCoding": {
"code": "survey",
"display": "Survey",
"system": "http://terminology.hl7.org/CodeSystem/observation-category"
}
}
]
},
{
"extension": [
{
"url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression",
"valueExpression": {
"language": "text/fhirpath",
"expression": "today()",
"name": "11.2.2.6"
}
},
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-hidden",
"valueBoolean": true
}
],
"enableWhen": [
{
"question": "11.2.2.1",
"operator": "exists",
"answerBoolean": true
}
],
"linkId": "11.2.2.6",
"type": "dateTime",
"text": "Effective DateTime",
"definition": "http://hl7.org/fhir/StructureDefinition/Observation#Observation.effectiveDateTime"
}
]
}
]
}

Ankita Srivastava2022-11-05T03:17:01Z

@Ankita Srivastava, you had said "Currently, we didn't create our profile url.. that's why using the base url.". I'm not sure how you can have a profile without assigning it a url - I'm confused as to what you mean.

Lloyd McKenzie2022-11-05T14:40:47Z

I am not using any profile for now.. just created sample Questionnaire for Pregnancy using base url. My query is related to multiple Observation extraction in case of repeated value for Delivery Time.

Ankita Srivastava2022-11-05T14:47:47Z

There are two different queries - one from my side and the other one from Kashyap. And somehow, looks like they got mixed up.

Ankita Srivastava2022-11-05T14:50:15Z

Ah, sorry. Your thread got hijacked a bit by @Kashyap Jois.

You're referencing the contained resource #PrePopQueries, but you don't actually have a Bundle for that, and as far as I can tell, aren't doing any pre-population.

Other than that it looks right on initial scan, though I'm wondering why you're using expression-based extraction rather than Observation-based extraction. (The latter would avoid a whole lot of complexity.)

Lloyd McKenzie2022-11-05T14:55:31Z

Ahh.. Thank you so much @Lloyd McKenzie for spotting the #PrePopQueries issue.. it's a copy pasting error :D.. will rectify it.
With regards to your second point, I agree, that Observation based extraction is much easier. However, the stakeholders have requested to use definition based rather than Observation based. Hence, I am following this approach.

Ankita Srivastava2022-11-05T15:02:36Z

My bad, just thought it maybe unnecessary to create a new topic. But i can just move my question to another topic

Kashyap Jois2022-11-05T15:12:09Z

@Ankita Srivastava thanks for your example above, that's exactly what I needed, at least for part of what I'm trying to do. My other question has to do with defining a resource that may be generated within the Questionnaire.

For example, if I'm working with the SDOHCC Hunger Vital Signs Questionnaire, and someone is "at risk" of food insecurity, I'd like to generate a new Condition for this person for food insecurity. I'd like to have this predefined Condition, and then use two hidden questions (as per the example above) to extract the subject reference and the recordedDate. What I'm not sure is the best way to predefine the Condition. Could I put this in the contained field of the Questionnaire? Or would I have to create an empty Condition and then extract all of the fields I want to be completed from the Questionnaire (even the ones that are static and wouldn't change)?

Grey Faulkenberry2022-11-23T16:57:37Z

SDOH generally recommends using StructureMap. SDC hasn't talked about the notion of using a 'contained' resource as a 'template' with extensions indicating certain "fill-in-the-blank" fields to be taken from the Questionnaire, but that's a really cool idea. It's certainly a lot more elegant than the current FHIRPath-based approach which requires using either hidden questions with fixed values, or a profile that defines everything. It'd also be a whole lot easier for people to wrap their heads around than StructureMap.

There's no SDC call this week, but if you wanted to submit a change request proposing this, we could possibly take it up at next week's call.

Lloyd McKenzie2022-11-23T18:00:59Z

I'd be happy to. Because I'd like to use this for more than just SDOH (for instance, taking a history from a patient and creating new conditions).

Grey Faulkenberry2022-11-23T20:45:11Z

@Ankita Srivastava has found a nice big gap in the definition part of the spec
https://jira.hl7.org/browse/FHIR-41508
The gist is that looking to define how to do a form using definition extract that supports either new or existing content, and works for new patients, and new other resources too.
e.g. Admission form that:

  • Patient details - can create a patient/update a patient
  • Patient has list of contacts - update the set of contacts correctly/safely
  • has a list of immunisations - can create new ones, or update existing ones?
    All this feels really fragile to me - wouldn't want to replace a patient resource with the results of this.
    Maybe could patch records though.
Brian Postlethwaite2023-06-29T22:03:44Z

Hello All,
I am looking for some examples for "open-choices" - Definition based extraction. Do we have some?
Also, do we have any reference implementation where I can check the resource extraction from definition based Questionnaire.
Looking for some recommendations. Kindly help.
Thank you.

Ankita Srivastava2023-07-11T01:49:37Z

@Brian Postlethwaite?

Lloyd McKenzie2023-07-11T03:19:35Z

I don't have an example for that example, but I do know of a server that has some at least partial support for defnition based extraction.
It does have some limitations, though I believe that implementation has been shelved, and I haven't had a chance to get in and do another implementation based on the open code that I wrote over 6 years ago that is in the firely SDK on a really old branch that never merged in.

Brian Postlethwaite2023-07-11T03:21:46Z

https://sqlonfhir-r4.azurewebsites.net/fhir - Need to have both SD and Questionnaire loaded in order to $extract from a QuestionnaireResponse.

Brian Postlethwaite2023-07-11T03:24:01Z

Thank you @Brian Postlethwaite for the reference link. I will check that out.

Ankita Srivastava2023-07-12T01:23:23Z

We have a use-case where we want to use Questionnaire grouping to semantically specify related question groups in a nested way:

* group A
   * group B
   * group C

Each group in this example is a set of questionnaire items that we want to extract -- e.g. extracting Obs A, Obs B, and Obs C.

The question is the scope of the itemExtractionContext, does it only regard direct child items in the group as part of that context, or does it nest? In other words, in my example, would adding itemExtractionContext to each of A, B, and C groups make sense to specify 3 resources to extract?

Brian Kaney2023-09-22T14:55:19Z

in sdc ig, we can read :

Note that only one context can be in play at the same time. When a new context is declared, it takes the place of the old context.

I understand that declaring a new itemExtractionContext in group B will replace the one declared in group A.

I don't know how it will manage this kind of nesting :

* group A (extract condition)
  * item A.1 (condition.code)
  * group B (extract observation
    * item B.1 (observation.code)
    * item B.2 (observation.effectiveDate)
  * item A.2 (condition.status)

Hope you are not in this case.

nicolas griffon2023-09-22T16:23:29Z

Nope, the nesting would be more like this:

* group A (extract condition1)
  * item A.1 (condition1.code)
  * item A.2 (condition1.staus)
  * group B (extract observation1)
    * item B.1 (observation1.code)
    * item B.2 (observation1.valueQuantity)
    * item B.3 (observation1.effectiveDate)
  * group C (extract observation2)
    * item C.1 (observation2.code)
    * item C.2 (observation2.valueBoolean)
    * item C.3 (observation2.effectiveDate)

Thanks, I missed that bit about taking the place of the old context!

Brian Kaney2023-09-22T16:54:30Z

nicolas griffon said:

I don't know how it will manage this kind of nesting :

* group A (extract condition)
  * item A.1 (condition.code)
  * group B (extract observation
    * item B.1 (observation.code)
    * item B.2 (observation.effectiveDate)
  * item A.2 (condition.status)

Does anybody have an answer for this scenario ?
I guess the best idea is to avoid this kind of nesting but...

nicolas griffon2023-09-27T14:15:58Z

If you set the extraction context on Group B, that should theoretically work. (Whether it does in practice would involve testing the tools :>)

Lloyd McKenzie2023-09-27T21:31:21Z

Thank you for your answer !

To summarize, the itemExtractionContext extension apply :

  • to the item on which the extension is set
  • to the nested item till a new itemExtractionContext extension is apply
  • but not to 'brother' items

(so the following exemple is not working:

* item A (extraction context : condition)
* item A.1 (definition: condition.code)
* item B (definition: condition.date)

)

Another way to say it is that:
For a definition attribute, the corresponding itemExtractionContext extension is necessarily on a 'father' item (or on the item itself (or on the questionnaire root)).

Am I right ?

nicolas griffon2023-09-28T09:11:44Z

That sounds correct to me

Lloyd McKenzie2023-09-28T17:33:23Z

Do we always need itemExtractionContext? As I get from the documentation itemExtractionContext can be empty or missing. And with this structure I'll get two conditions:

* item A (extraction context : condition)
* item A.1 (definition: condition.code)
* item B (definition: condition.date)

One condition with code and other with date

Stas Buldakov2024-06-13T15:55:35Z

If you want a single Condition, you need to move your context further up the tree to the Questionnaire root or some other common parent of item A and B.

Lloyd McKenzie2024-06-13T16:00:20Z

I understand that. Just needed to make sure I got this correct. I have a question about items without itemExtractionContext. So, I have this structure:

* group A
  * item A.1 (definition: Patient.name.given)
* group B
  * item B.1 (definition: Patient.name.given)

Groups do not have itemExtractionContext. Should we create two patients or we are in the same context here? It's not documented well what is context change.

Stas Buldakov2024-06-13T16:27:07Z

I think at the moment the behavior is undefined, but it should be. Can you submit a change request for us to clarify?

Lloyd McKenzie2024-06-13T16:55:58Z

While implementing/writing a tutorial of this definition based extraction I've found that obviously there isn't a 1..1 mapping from item type to data type in resources.
Hence I've created a table to try and define/describe the possible mappings between to try and indicate what could/should be supported.

https://1drv.ms/x/s!ApkGK_oT9urNvqJBhEwSPjNDb64txw?e=ASPisT

The cells with a Y* or ? there's some question or issue that might arrise. Green cells are expected direct maps.
Happy to take some feedback on if this is valid/useful then see if it's something we should have in the IG.

Brian Postlethwaite2024-10-23T02:20:24Z

Not a horrible idea, though it's a bit large. Can we discuss on our Thursday call?

Lloyd McKenzie2024-10-23T05:02:27Z

Anyone tried extracting a contained resource in a definition model?
Outside using a profile to declare a slice for it.

Brian Postlethwaite2024-10-23T06:16:35Z

That is a comprehensive spreadsheet. It seem like we could create recommendations based on the direction of mapping

  • QuestionnaireItemType -> FHIR DataType for $extract;
  • FHIR DataType -> QuestionnaireItemType for $assemble and $questionnaire
Brian Kaney2024-10-24T19:19:54Z

Yes, this one is only looking at export, but we could also develop same for prepop.
I have code for that too which I'd be able to put into the table. At least in the prepop direction you have more direct control via the fhirpath expression.

Brian Postlethwaite2024-10-24T19:31:04Z

I have a blog post almost ready that we can preview on today's call if you're interested that walks right into this functionality.

Brian Postlethwaite2024-10-24T19:32:33Z

The context selection step for update selection is the last part I need to understand/document/implement.
(and make suggestions for improvement...)

Brian Postlethwaite2024-10-24T19:34:02Z
Brian Postlethwaite2024-10-31T02:19:06Z

ok folks, these are the URLs for the extract extensions:

Observation approach:

Template approach:

Definition approach:

StructureMap approach:

Are we ok with using these? (even though it's changing the name of the existing itemExtractionContext one)
Should we consider other URLs?
(I don't want to change obs or SM)

Brian Postlethwaite2024-11-08T04:45:01Z

And could/should I put all those examples that I threw together into the spec too?

Brian Postlethwaite2024-11-08T04:46:19Z

Definitely include the examples in the spec. They're quite useful

Lloyd McKenzie2024-11-08T04:49:28Z

extractTemplate/extractTemplate or templateExtract/templateExtractValue
extractDefinition or definitionExtractValue etc...
(which would be consistent with observationExtract)

Brian Postlethwaite2024-11-08T04:51:50Z

I prefer the extractXXX style, but a shame the others were already the other way around

Brian Postlethwaite2024-11-08T04:59:42Z

I'm going with the what is now above. Do argue for alternatives if you want something different (looks good to me)

Brian Postlethwaite2024-11-08T05:01:46Z
The discussion centered around template-based extraction in FHIR, with Brian Postlethwaite sharing a proposal and addressing concerns about managing contained resources and the complexities of implementing updates. Various participants contributed insights on the challenges of referencing resources, uniqueness of resource IDs in different servers, and the importance of thorough documentation and review of the proposed methodology.
53 comments
RV
IB
AV

A new thread to discuss the template based extraction

Brian Postlethwaite2024-06-12T18:41:44Z

+1 on this. Just a question before reading the proposal: won't this be limited by the fact that contained resources can't contain other resources? Can I create a medicationrequest with a contained medication inside of it with this approach?

Jose Costa Teixeira2024-06-14T22:31:08Z

You can, as long as you include a reference to them in the resource. Which we will to indicate what they are for.

Brian Postlethwaite2024-06-14T23:00:25Z

That other contained resource would need to be pulled out too, but I'll update the docs to indicate to watch out for that while using the template.

Brian Postlethwaite2024-06-14T23:01:11Z

I like the template approach! Do I understand correctly that the template resources need to be valid FHIR resources? Does this also mean we need to provide placeholder data for everything that will be replaced during the extraction process?

Axel Vanraes2024-06-18T09:34:48Z

If you have an extension, you'll satisfy cardinality and invariants requiring that an element be 'present'.

Lloyd McKenzie2024-06-18T17:23:46Z

Hi all,
Thank you @Brian Postlethwaite for a very nice proposal.
We definitely need a better/simpler way for extraction instead of FHIR Mapping language.
BTW how do you envision conditional logic and loops implementation?

I got similar ideas working on the extraction engine: https://github.com/beda-software/FHIRPathMappingLanguage/issues/4

Ilya Beda2024-06-21T05:33:38Z

fhirpath expressions littered into the template at appropriate areas that would be repeated.

Brian Postlethwaite2024-06-21T05:35:14Z

I've done a comparison between the approaches including the template approach for a single Questionnaire.
https://hackmd.io/@brianpos/template-extract-examples (you do need to be signed in to view it)

I think it shows the differences between the approaches pretty well.

Brian Postlethwaite2024-11-01T03:18:30Z

I'm now going to do another sample with a more complicated extraction.

Brian Postlethwaite2024-11-01T03:20:46Z

@Grey Faulkenberry @Lloyd McKenzie @Ilya Beda @Jose Costa Teixeira @Axel Vanraes @Bas van den Heuvel @Paul Lynch @Halina Labikova

Brian Postlethwaite2024-11-01T03:25:30Z

And here's a sample form that uses a quick POC I threw together.
https://dev.fhirpath-lab.com/Questionnaire/tester?tab=extract,csiro%20renderer&id=https%3A%2F%2Ffhir.forms-lab.com%2FQuestionnaire%2Fsigmoidoscopy-complication-casefeature-definition5&subject=Patient%2F45086382
Feel free to mess with it and try some others, there are highly likely issues, but at least this uses the 3 core extensions proposed in the way they are intended.

Also noting that I slightly changed the names compared to that in the proposal so it was clearer that they apply to the template technique.

Brian Postlethwaite2024-11-01T06:48:12Z

Hmm, I found an issue with the template approach that needs some thoughts from others...
To be in the questionnaire it needs to have an id so that the item that "instantiates" it can reference it.
Assuming that we can't update a resource with this approach, I can just remove the value.
If we want to be able to do updates, we'll need another extension to cater for how to set the ids. etc.
Can't use the same approach for all the other values, as the id property can not have an extension.

Brian Postlethwaite2024-11-03T22:45:35Z

Put an extension on the base resource I guess?

Lloyd McKenzie2024-11-03T23:00:42Z

Alternatively, the extension that says "Instantiate this template" could be complex and point to the template and (optionally) also specify the id for it.

Lloyd McKenzie2024-11-03T23:01:15Z

I think I like that second option.

Lloyd McKenzie2024-11-03T23:01:23Z

I'd rather have the extension in the contained resource to keep things together there.
(and I suspect most cases are just going to want to create new instances - so cleanest in that case)
And could even use the same extension for controlling fullURL stuff in definition base - which we haven't agreed on yet

Brian Postlethwaite2024-11-03T23:03:04Z

One of the reasons for a difference is that the id doesn't just appear in the contained resource - it also appears in the URL of the 'PUT' and also drives whether we're doing a PUT or POST.

Lloyd McKenzie2024-11-03T23:07:26Z

I think having an extension on the Questionnaire that says "extract from here to this resource location using this template" is reasonable.

Lloyd McKenzie2024-11-03T23:08:13Z

Correct, hence why we have the issue in the template approach.

Brian Postlethwaite2024-11-03T23:08:20Z

The templated resource MUST have the id to be able to reference, so we need an extension to tell us what to do with it.

Brian Postlethwaite2024-11-03T23:08:52Z

If we indicate that we can't do updates with the template approach, then this isn't a problem - always remove it and always POST - my leaning.

Brian Postlethwaite2024-11-03T23:09:45Z

What I'm saying is that the id of the template is something like "templateFoo". When we instantiate the template, we grab the extension from where it's being used as a template.

Lloyd McKenzie2024-11-03T23:21:57Z

We can definitely do updates with the template approach. We just need to specify the "target id" (if there is one) in the extension that invokes the template.

Lloyd McKenzie2024-11-03T23:22:37Z

I'd rather have another extension in the contained resource than turn the use this resource as the template into a complex extension.

Brian Postlethwaite2024-11-03T23:23:21Z

If we're going to add the template approach, we'll need to also solve the same issue as the definition appoach has with referencing other resources in the output.
(and I think this is the same problem)

Brian Postlethwaite2024-11-03T23:24:38Z

But we're not just deciding the id (which could make sense to be in the template), we're also deciding the URL and the REST action (which doesn't make sense to be in the template).

Lloyd McKenzie2024-11-03T23:27:31Z

In theory, the same template could even be used from more than one place in the same Questionnaire with different behavior.

Lloyd McKenzie2024-11-03T23:27:56Z

Which is the same problem we need to solve for definition - hence why I think it can be the same.

Brian Postlethwaite2024-11-03T23:28:10Z

What's the issue with the invocation of the template being complex?

Lloyd McKenzie2024-11-03T23:28:12Z

What are you doing for definition again?

Lloyd McKenzie2024-11-03T23:29:05Z

We don't have a great story for that specific part yet - was likely another extension.

Brian Postlethwaite2024-11-03T23:29:31Z

The setting the id was simple, just use the definition location in the resource, and with a calculated expression etc to populate it. But we have no story with the fullURL, ifMatch etc - the other bundle.entry.request props.

Brian Postlethwaite2024-11-03T23:30:49Z

@Lloyd McKenzie @Brian Postlethwaite
From my experience the extraction template is always a bundle.
So, myy suggestion here is to restrict template to be a bundle only.
In this case we have a more granular control over urls and action verbs PUT, POST, PATCH, etc. and issue with template id is fixed.

Ilya Beda2024-11-03T23:53:42Z

There were 2 ways to go, one was to have a single template that is the bundle and everything drives from there.
The other was a refernce to each template for each resource in the items.
I took the latter approach.

Brian Postlethwaite2024-11-03T23:55:26Z

This was consistent with the definition approach.

Brian Postlethwaite2024-11-03T23:55:59Z

(and to be honest, I didn't try out the first)

Brian Postlethwaite2024-11-03T23:58:08Z

I'm doing a complex example which has repeating sections and multiple resources.
Then I'll do one that has cross resource references - where the real fun starts.

Brian Postlethwaite2024-11-04T00:00:17Z

I've also pushed a variation on those in my comparison to my github project SDC by example with minimal cases...
https://github.com/brianpos/sdc-by-example/tree/master/4.Extraction/comparison-simple-obs

Brian Postlethwaite2024-11-04T00:38:30Z

Here you can find lot's of SDC mappers https://github.com/beda-software/fhir-emr/tree/master/resources/seeds/Mapping
They are implemented with JUTE, but I would like to migrate them to this new extraction engine.

Some of them are pretty complex. For example, this mapper https://github.com/beda-software/fhir-emr/blob/master/resources/seeds/Mapping/gad-7-extract.yaml creates Observation and Provenance and also create or updates.

If conditionId is provided, it updates the condition instead of creating a new one: https://github.com/beda-software/fhir-emr/blob/master/resources/seeds/Mapping/gad-7-extract.yaml#L51-L57

Here is another example, that update a practitioner resource and create a list of practitioner roles.
For each specialty selected in the form practitioner role is created : https://github.com/beda-software/fhir-emr/blob/021728163c10331f4c1506c5b8af9c5fa76ac702/resources/seeds/Mapping/practitioner-edit.yaml#L33C16-L71

@Brian Postlethwaite @Lloyd McKenzie
How do you envision handling this cases?

Ilya Beda2024-11-04T01:42:17Z

I'll take a look at your condition one, that should be easy enough with revised definition approach.

Brian Postlethwaite2024-11-04T03:06:25Z

There seem to be a typo made in the FHIR SDC spec, specifically in the following statements (https://hl7.org/fhir/uv/sdc/modular.html):

"This portion of the SDC specification describes two mechanisms for enabling re-use:

  • Modular Questionnaires allow one questionnaire to be composed of sub-questionnaires (which can in turn be composed of further sub-questionnaires, and so on).
  • Data Element-based Questionnaires are crafted by having items make use of the definition element. The referenced definitions include all of the metadata for the question, group or display item including the text, data type, optionality and other characteristics. Questionnaires are authored by assembling these minimal items referencing robust definitions.

In the first case, every single 'item' in the questionnaire must be specified, including all 'display' items, groups, etc. Re-use is limited to question text, value set, data type and other information that can be determined from the referenced definition element. On the other hand, with modular questionnaires, multiple items can be defined along with display text, enableWhen logic and other questionnaire characteristics. The first approach is best suited for "data-element"- based questionnaires and the latter for defining collections of questions. (While defining separate modules for every single question is possible, it would be quite a bit of overhead).

The two mechanisms are not mutually exclusive. It is possible to have a form that relies on sub-questionnaires and that also has some elements that rely on externally defined element definitions."

Based on the context, it appears that the first case and the first approach actually pertain to the Data Element-based Questionnaires mechanism, while the second case is related to the Modular Questionnaires mechanism. Thoughts?

Radhika Verma2024-11-04T21:14:44Z

It looks to me like the bullet points are reversed.

Paul Lynch2024-11-04T21:21:42Z

FHIR SDC Questionnaire.url states that the .url SHALL be globally unique. Currently our implementation is using url of the format - "[base]/ca-on-iar-ocan-questionnaire-template"
As more forms become available, it'll be challenging to establish uniqueness. 
One possible solution/recommendation could be to append the base url with guid (which is same as the resource.id) that would be unique amongst each questionnaire such as "[base]/fe16095b-9412-430d-8633-2b4e034be37c"
Does this approach sounds correct?Thoughts?

Radhika Verma2024-11-04T21:35:07Z

Resource id on the 'source server' is an option, but note that the URL should remain the same as the Questionnaire moves from server to server, and the ids on other servers will almost certainly not be the same. (That's ok, just something to be aware of.)

@Radhika Verma can you submit a change request with respect to the bullet points?

Lloyd McKenzie2024-11-04T21:45:20Z

Our Forms builder doesn't have a FHIR server as of now, so we are auto-generating a GUID when creating a template. In the future, if we import the template into a FHIR server and deploy it from one server to another, can resource.id be reserved or the destination server will override the resource.id?

Radhika Verma2024-11-04T22:07:10Z

Yes, will submit the change request for the bullet points

Radhika Verma2024-11-04T22:07:35Z

I did a writeup on canonical urls and versioning.
https://brianpos.com/2022/12/13/canonical-versioning-in-your-fhir-server/

The questuonnaire URL property and resource id are not the same. And the resource id is most likely different on each server the form is distributed, and that's fine/normal, and why the canonical url exists, and responses refer the the canonical url, and not a reference to the resource id.

Brian Postlethwaite2024-11-04T22:10:09Z

Reminder, that I have a set of questionnaire definitions providing how to do $extract with each of the techniques here (comparing the diffs):
https://github.com/brianpos/sdc-by-example/blob/master/4.Extraction/comparison-simple-obs/readme.md

And another set here with some complex definitions! (but no write-up on the diffs, but you can run all these in the lab)
https://github.com/brianpos/sdc-by-example/tree/master/4.Extraction/comparison-complex

Keen to get more review on these to determine if we should be putting the template mode into the spec or not.

And also start to consider how we support update and setting other bundle.entry.request properties.

Brian Postlethwaite2024-11-06T11:11:31Z

I've also realized that if you want to include the meta.profile property, then the TEMPLATE also needs to pass that, which I think in most cases they won't - so will need to use the template fhirpath expression to populate it, which is not a big deal, but a bit of a gotcha.

Brian Postlethwaite2024-11-06T11:30:07Z

I like the core idea of templates. Will try to review with some use-cases this weekend

Axel Vanraes2024-11-07T22:27:19Z

Thanks. The approach in principal has been approved for inclusion in the SDC IG on today's SDC call. I'll be doing the spec write-up over the coming week with the proposed wording.

Brian Postlethwaite2024-11-07T23:26:17Z

@Axel Vanraes do reach out with any questions here if you need to. I'll be watching closely this week.

Brian Postlethwaite2024-11-07T23:27:04Z
The discussion revolves around the use of an 11-digit CMS NDC identifier formatted without hyphens in the ExplanationOfBenefit.item.productOrService.coding.code, questioning whether it aligns with HL7 specifications and regulatory requirements. Participants debate the differences between 10-digit and 11-digit codes, the need for clarity in code representation, and the implications of existing and proposed terminology systems.
41 comments
DR
ML
RD
CC

Is "http://hl7.org/fhir/sid/ndc" the correct .coding.system to use for a ExplanationOfBenefit.item.productOrService.coding.code value that contains a CMS NDC identifier formatted as 11 digits with no spaces, hyphens or other characters as described here under "Other useful Information"? For example, is the following example a valid way to convey an NDC in a Pharmacy ExplanationOfBenefit.item.productOrService element?

<productOrService>
<coding>
               <system value="http://hl7.org/fhir/sid/ndc"/>
               <code value="55111078927"></code>
               <display value="SEVELAMER CARBONATE"></display>
</coding>
</productOrService>

cc @Rob Hausam , @Grahame Grieve

David Riddle2024-08-30T13:11:30Z

That's not quite what https://terminology.hl7.org/NDC.html says. @Reuben Daniels can you follow up with the relevant committee to get those aligned?

Grahame Grieve2024-08-30T13:16:15Z

Grahame Grieve said:

That's not quite what https://terminology.hl7.org/NDC.html says. Reuben Daniels can you follow up with the relevant committee to get those aligned?

So @Grahame Grieve , do you know if there is a different code system (coding.system value) that can be used if the source system only has the NDC formatted as 11 digits with no hyphens (e.g. 55111078927)?

David Riddle2024-08-30T13:20:04Z

I don't think that there is, or at least, if there is, I don't know about it

Grahame Grieve2024-08-30T13:20:34Z

I believe that many payers only maintain/persist the 11 digits with no hyphens format in their source systems.
@MaryKay McDaniel and @Linda ,
I am curious what your thoughts are on expecting the hypenated NDC format vs. 11 digits with no hyphens NDC format in the ExplanationOfBenefit.item.productOrService.coding.code on retail pharmacy EOBs? Most of the retail pharmacy EOB data I have seen from payers only provides the 11 digits with no hyphens NDC format.

David Riddle2024-08-30T13:22:46Z

@David Riddle Some of this is duplicative of what is in the HL7 confluence page but to highlight use of the 11 digit NDC (5-4-2) is a regulatory requirement when NDC is utilized for a HIPAA covered transactions that is why payor functions deal with 11 digit NDCs. The three sections denote the labeler-product-package segments. To do the conversions one needs to start with the 10 digit code create the 11 digit conversions, to go from 11 to 10 digit there is ambiguity. The 11 digit code always follows a 5-4-2 construction so to go from FDA NDC which can be 4-4-2, 5-3-2 or 5-4-1, a leading zero is added to the short segment to construct a 11 digit 5-4-2 code.

It's also useful to know that individual healthcare organizations, primarily ones with inpatient pharmacies, mint custom NDC codes to manage in house compounding and other Rx workflows which are not FDA valid NDCs. So if you get records with NDCs from a provider organization with an inpatient facility its quite possible you will see these custom facility NDCs...

FDA published a proposed rule in 2022 to move to 12 digits and resolve a lot of the problems that exist with the current 10 digit code. Final rule has been delayed. FDA will run out of 5 digit labeler codes in 10-15 years so eventually things will change.

Steven Kassakian2024-09-04T05:04:03Z

Steven Kassakian said:

go from 11 to 10 digit there is ambiguity.

@Steven Kassakian ,
I think I am following everything you have described and I am familiar with the ambiguity associated with attempting to move from 11 digit (no hyphens) to 10 digit format. That said, I believe you are saying that the payer must find a way to convert their source 11 digit (no hyphens) NDC values into the correct 10 digit NDC code in order for the ExplanationOfBenefit.item.productOrService.coding to conform to the C4BB required binding to the FDANDCOrCompund value set, correct? So even if there is a valid code system for a 11 digit (no hyphens) NDC code value, using a 11 digit NDC does not meet the requirements of the C4BB ExplanationOfBenefit-Pharmacy profile.

Do I have that right?

David Riddle2024-09-04T19:55:31Z

Hi @David Riddle

You may want to have a look at this thread which relates to NDC 10 and 11 codes:
#terminology > NDC 11 Codes

@Carol Macumber

Reuben Daniels2024-09-04T21:42:15Z

@Grahame Grieve , @Rob Hausam and @Steven Kassakian ,
I apologize if I am being obtuse, but the fundamental question I am trying to get answered is  whether or not 11-digit, no hyphens, spaces or other character NDC codes are included in the  FDANDCOrCompund value set required by the C4BB-ExplanationOfBenefit-Pharmacy profile? Or put another way, since that value set includes all codes defined in http://hl7.org/fhir/sid/ndc, does the http://hl7.org/fhir/sid/ndc code system include 11-digit, no hyphens, spaces or other character NDC code values?

The '10 digit NDC code, with "-" included.' statement found here would seem to indicate that use of NDCs in HL7 is strictly limited to 10 digit codes with hyphens; however, that confuses me given the 'You should now be able to create value sets that contain only 11-digit or 10-digit codes, using the code-type property.' statement from @Rob Hausam here. I am not sure that I know/understand where to look for the 'code-type' property, but I can't seem to find any mention of it in the FDANDCOrCompund value set. So does that mean that value set includes both 11-digit and 10-digit codes?

cc @Reuben Daniels

David Riddle2024-09-06T11:18:36Z

I think we're trying to answer that question, but I at least don't know the answer

Grahame Grieve2024-09-06T12:28:27Z

Grahame Grieve said:

I think we're trying to answer that question, but I at least don't know the answer

Thanks, @Grahame Grieve !
I wasn't sure if my question had been answered and I was just missing it.

David Riddle2024-09-06T12:30:23Z

Hi All

Interesting question to ponder first thing on a Friday :)

I walked through this with @Carmela Couderc and logically, to me (i.e., other TI Co-chairs should chime in if they feel differently @Reuben Daniels , @Jessica Bota , @Marc Duteau ), if the code system returns a valid response via $lookup and $validate-code, then a value set defined as "All codes in ____" would contain all valid code representations. In this case, one for each code-type.

lookup and validate-code against tx.fhir.org for 11-digit
http://tx.fhir.org/r4/CodeSystem/$lookup?system=http://hl7.org/fhir/sid/ndc&code=00409371801
https://tx.fhir.org/r4/CodeSystem/$validate-code?system=http://hl7.org/fhir/sid/ndc&code=00409371801

lookup and validate-code against tx.fhir.org for 10-digit
https://tx.fhir.org/r4/CodeSystem/$lookup?system=http://hl7.org/fhir/sid/ndc&code=0409-3718-01
https://tx.fhir.org/r4/CodeSystem/$validate-code?system=http://hl7.org/fhir/sid/ndc&code=0409-3718-01

But...this makes me think that further guidance/constraint on the use of code-type may be required. For example, if a code system supports code-type, should TS's be required to return that property in expansion details. Otherwise, it's not apparent that these two codes are in fact, the same concept.

With regards to the expectations of the Carin IG, I'd say that if the intent is only to support one, or the other, the value set definition should be updated to filter on the code-type property to be either "10-digit" or "11-digit"

Note: There is a open ticket https://jira.hl7.org/browse/FHIR-44627 regarding alt identifiers and synonyms (as you'll note that the examples above include a synonym for the alternate) at the Sept WGM on Thursday morning joint FHIR-I and TI

Carol Macumber2024-09-06T13:46:31Z

@Carol Macumber I think that in this case it would be a mistake to take tx.fhir.org as authoritative, since I only guessed when I did that implementation. If TI decided differently, I'd have to update my implementation

Grahame Grieve2024-09-06T13:47:31Z

Grahame Grieve said:

Carol Macumber I think that in this case it would be a mistake to take tx.fhir.org as authoritative, since I only guessed when I did that implementation. If TI decided differently, I'd have to update my implementation

Fair enough, but it's all i've got to go off right now as far as expected behavior :)

Carol Macumber2024-09-06T13:48:15Z

@Grahame Grieve @Carol Macumber @Reuben Daniels Any chance that instead of deprecating property "Synonym" we could change the name or "Alternate-code"? If that is what it has always been used for, it might make the alignment of what you have in tx fit with what TI wants.

Robert McClure2024-09-06T16:20:58Z

umm whoops. That part of the tx.fhir.org response hasn't been updated since we decided to dump 'synonym' as a committee. I think. I'll have to investigate

Grahame Grieve2024-09-06T22:15:05Z

FWIW I added a hand-crafted example to the ticket FHIR-44627 to try to initiate some progress on unpicking the details and to ensure I'm understanding the proposal correctly.

Specific questions I have about the current proposal:

  1. How do I know which code is primary?
  2. Is there always a single primary code?
  3. What if the concept entries have different display text?
  4. Can they all include designations & properties?
  5. If so, do they just get merged (aggregated, duplicates removed?)
  6. What are the rules for $expand, $lookup, $validate-code
{
    "resourceType": "CodeSystem",
    "id": "alternate-codes",
    "meta": {
        "versionId": "1",
        "lastUpdated": "2024-10-31T15:53:19.832+10:00"
    },
    "url": "https://example.com/CodeSystem/alternate-codes",
    "version": "1.0",
    "name": "Code_System_with_alternate_codes__synonym_codes_",
    "title": "Code System with alternate codes (synonym codes)",
    "status": "draft",
    "experimental": true,
    "caseSensitive": true,
    "valueSet": "https://example.com/ValueSet/alternate-codes",
    "compositional": false,
    "content": "complete",
    "count": 5,
    "property": [
        {
            "code": "alternatePrimaryCode",
            "uri": "http://hl7.org/fhir/concept-properties#alternatePrimaryCode",
            "description": "This property contains an alternative code that may be used to identify this concept instead of the primary code",
            "type": "code"
        }
    ],
    "concept": [
        {
            "code": "A",
            "display": "The concept A",
            "property": [
                {
                    "code": "alternatePrimaryCode",
                    "valueCode": "B"
                }
            ]
        },
        {
            "code": "B",
            "property": [
                {
                    "code": "alternatePrimaryCode",
                    "valueCode": "A"
                }
            ]
        },
        {
            "code": "X",
            "display": "The concept X",
            "property": [
                {
                    "code": "alternatePrimaryCode",
                    "valueCode": "Y"
                },
                {
                    "code": "alternatePrimaryCode",
                    "valueCode": "Z"
                }
            ]
        },
        {
            "code": "Y",
            "property": [
                {
                    "code": "alternatePrimaryCode",
                    "valueCode": "X"
                },
                {
                    "code": "alternatePrimaryCode",
                    "valueCode": "Z"
                }
            ]
        },
        {
            "code": "Z",
            "property": [
                {
                    "code": "alternatePrimaryCode",
                    "valueCode": "X"
                },
                {
                    "code": "alternatePrimaryCode",
                    "valueCode": "Y"
                }
            ]
        }
    ]
}
Michael Lawley2024-10-31T07:57:09Z
  1. How do I know which code is primary?

If there's a code that's a primary, that's a(n addition) property of the primary code

  1. Is there always a single primary code?

no. unless otherwise stated they are siblings

  1. What if the concept entries have different display text?

So?

  1. Can they all include designations & properties?

yes

  1. If so, do they just get merged (aggregated, duplicates removed?)

no

  1. What are the rules for $expand, $lookup, $validate-code

the assertion of alternatePrimaryCode is a property that is reported in $lookup, but it does not change the behavior of $expand or $validate-code

Grahame Grieve2024-10-31T10:19:32Z

The TI tracker call on November 18 will focus on FHIR-44627 - a proposal for dealing with alternate codes. The call starts at 5pm Eastern Standard Time (clocks change from daylight savings time this weekend). It would be great if folks on this thread can attend - but if not - please provide your thoughts in the ticket comments. Thanks.

Carmela Couderc2024-10-31T12:09:30Z

there's an event in Australia that day - will have to see

Grahame Grieve2024-10-31T12:32:34Z

Based on @Grahame Grieve reply, I think my mental model for this is wrong.
My understanding of this was that we were providing a mechanism for multiple codes to be able to identify the same concept, so if we had codes "A" and "B" where "B" is an alternateCode for "A", then I would have expected a $lookup for "B" to return the same set of properties and designations as a $lookup for "A" because they identify the same concept?

Furthermore, if this concept has a property "kind" equal to "special", and I have a ValueSet with a filter <"kind" "=" "special">, then do I get "A" or "B" or both "A" and "B" in the expansion?

However, it seems like this is closer to just a convention for being able to indicate that "A" and "B" are "the same", but they may still have different displays, parents, properties, etc although in most cases they would be identical (except for "alternateCode" itself) and it would be an mistake if they were not?

Michael Lawley2024-10-31T12:33:27Z

yes. we are not trying to indicate that they are the same concept, because that might not quite be true.

Grahame Grieve2024-10-31T12:35:52Z

they are codes that are considered synonymous in some ways

Grahame Grieve2024-10-31T12:36:13Z

e.g. NDC 10 digit and 11 digit codes are quite synonymous

Grahame Grieve2024-10-31T12:36:28Z

but the 10 and 11 digit codes have different properties (whether they are 10 or 11 digit codes)

Grahame Grieve2024-10-31T12:36:48Z

In that case the wording proposed in FHIR-44627 is VERY misleading:

"This property allow CodeSystem resource instances to represent multiple codes for a concept.

Would this also be appropriate for cases where codes are sometimes padded and sometimes not?

Michael Lawley2024-10-31T12:48:43Z

I agree that the definition could be improved.

Grahame Grieve2024-10-31T12:50:30Z

I'm not sure about the padding. Is the padding binary? e.g. either padded one way, or not padded? If it's more complicated than that, then it's time for a grammar?

Grahame Grieve2024-10-31T12:51:13Z

This property allow CodeSystem resource instances to represent multiple codes for a concept

I think this was what the proposal was originally intended to address - the case where there is a single concept, with multiple identifiers that need to be used to reference it (and that will be fully functional in FHIR terminology service operations). If it's something else where the two (or more) identifiers potentially refer to different concepts that aren't necessarily entirely equivalent, then probably that should be handled in ConceptMap? I'll plan to join the call on Nov 18.

Rob Hausam2024-10-31T15:00:51Z

the trick is what 'concept' means. Does it mean something kind of abstract, the same thing, or does it mean the definition identified by the code, and that the codes identify the same definition in the code system

Grahame Grieve2024-10-31T19:17:00Z

I think the real question is not what a concept is, but rather is there only one or two (or more).

Re NDC 10 and 11, the length of code is a property of the code, not the concept

Michael Lawley2024-10-31T22:09:29Z

Re NDC 10 and 11, the length of code is a property of the code, not the concept

that's true, but we've always done NDC as two concepts with different codes, with different properties on the codes so value sets can choose which codes they want to describe

Grahame Grieve2024-11-01T05:24:36Z

Yes, that's exactly what we did. But the idea of the two CodeSystem.concept instances (in the case of the NDC 10 and 11 digit codes) was that they were intended to represent the exact same logical "concept", but represented using the two different identifying codes (with both of the CodeSystem.concept instances being considered as exactly equivalent and totally interchangeable in regard to their meaning when used in terminology service operations or for any purpose). That was the intent for NDC (as a prototypic example). And I would tend to argue that it should also be true in any case where this is done, regardless of what code system it is done with.

Rob Hausam2024-11-01T05:37:28Z

@Rob Hausam I think that @Michael Lawley has put his finger on something that matters here:

with both of the CodeSystem.concept instances being considered as exactly equivalent and totally interchangeable in regard to their meaning

because they are not exactly equivalent at the code system level - they have different codes and properties.

Grahame Grieve2024-11-01T05:47:15Z

the are the same logical concept, but that's not quite the same thing

Grahame Grieve2024-11-01T05:47:35Z

I mostly get what you are saying, but I think we may be splitting hairs here somewhat - or describing the same thing from a different perspective using some different wording. Something like that. As what I was saying is that the two concepts (in the FHIR CodeSystem representation) are "exactly equivalent ... in regard to their meaning". Because having the different values for the code and the property that specifies why the codes are different doesn't alter the meaning of the concepts in the slightest degree. So I think that both of our statements are actually compatible.

Rob Hausam2024-11-01T05:56:38Z

:rolling_on_the_floor_laughing: "the same" but "not _exactly_ equivalent"

This is somewhat reminiscent of the distinction between "the thing" and "a representation of the thing" (eg JSON vs XML vs RDF representations of a FHIR Resource), but also "the SNOMED Concept identified by 1234567809" and "the FHIR representation of that concept.

So, there is an NDC concept, and there are the NDC10 and NDC11 representations of that concept, and then there is/are the FHIR representation(s) of the NDC concept. I think it's fine to have two representations, but we MUST be clear on things like:

[base]/CodeSystem/$subsumes?system=NDC&codeA=10digit&codeB=11digit
Michael Lawley2024-11-01T05:58:47Z

Yes - the return from $subsumes in that case should be equivalent (assuming that 10digit and 11digit in this case are placeholders for the "real" codes).

Rob Hausam2024-11-01T06:02:58Z

And the system NDC is actually http://hl7.org/fhir/sid/ndc.

Rob Hausam2024-11-01T06:05:29Z

we may be splitting hairs here somewhat

that's true, but we have to when it comes to handling code systems corretly

Grahame Grieve2024-11-01T06:07:17Z

Agree. As Michael said, we just need to be clear.

Rob Hausam2024-11-01T06:10:34Z
The discussion revolves around the limitations of the Azure FHIR API regarding the use of `_include` and `_revinclude` parameters, which are capped at 100 results, causing issues for users needing comprehensive data retrieval for entities like MedicationRequest and MedicationDispense. Participants highlighted the need for better error handling and standardization, including suggestions for using OperationOutcome to signal incomplete results, while also proposing alternatives to minimize server load and redundancy by avoiding these parameters in favor of separate queries for distinct resources.
30 comments

Items retrieved with _include and _revinclude are limited to 100. This is proving to be a serious limitation on requests for MedicationRequest with _revinclude=MedicationDispense in cases where a patient has multiple medications and/or daily dispensing regimes (e.g. Methodone scripts)...and the client wants to see it all (GOK why, but they do).

Peter Jordan2024-08-21T01:36:18Z

100 is enough to show them a page+ worth and you can then invoke a separate query to page through the whole set?

Lloyd McKenzie2024-08-21T02:03:34Z

We had to do the same thing in the Google API for _revinclude (if I recall correctly we don't limit _include) because there's just no conformant way to make the pagination make sense. There has to be a limit somewhere or _revinclude can produce pages of unbounded size, and there is no principled way to pick a limit that will work for everyone. We need to educate clients on what is or is not feasible in a single query. The real problem is that it's not easy for the client to figure out 1) that they hit the limit on a particular revinclude clause, and 2) exactly what separate query they should follow up with (especially with a mix of included and revincluded results).

Paul Church2024-08-21T02:05:48Z

I believe that the problem is that the _count setting only applies to the main target resource, not the inclusions, and the Server returns a 404 error if the included resources exceed the 100 max.

Peter Jordan2024-08-21T02:06:29Z

Ah. An error kind of sucks. A 200 with an embedded OperationOutcome with a warning that you're missing some would be better, though I guess we'd need to standardize the code to make that computable...

Lloyd McKenzie2024-08-21T02:07:31Z

Oh, do they 404 it? We just truncate that specific set of revinclude results.

Paul Church2024-08-21T02:07:50Z

Standardizing an OperationOutcome (which could be in the search results as search.mode="outcome" although it looks like we deprecated that value?) would be useful so clients could have an interoperable way to detect this situation.

We could go beyond that to have the OO indicate a "next" link where more revinclude pages can be found but I don't think there's an obvious place to put that in an OO.

Paul Church2024-08-21T02:10:36Z

A custom (everything type) operation that returned a Bundle of all medication resources relating to a patient would be ideal. At present the $everything operations require a Patient Resource to be included in the Bundle and we don't hold those in our Meds CDR.

If we are hitting issues with a CDR with just 2 years worth of MR and MD resources, I'll almost guarantee that others will hit this issue with Medication CDRs that hold more data relating to individual patients.

Peter Jordan2024-08-21T02:16:27Z

Lloyd McKenzie said:

Ah. An error kind of sucks. A 200 with an embedded OperationOutcome with a warning that you're missing some would be better, though I guess we'd need to standardize the code to make that computable...

That's the solution that our MDR provider is currently looking at implementing.

Peter Jordan2024-08-21T02:19:10Z

In the long term I would like to push the standard towards something like $graph to generalize the concept of $everything and get the pagination right.

Paul Church2024-08-21T02:27:02Z

My opinion, that if you are trying to make a consumer that works with "any" FHIR server. Don't use _include at all. 1) You get duplicate includes for each page of primary resources. 2) You might not get the includes at all (due to limit).
Just retrieve the primary resources and call back for the distinct list of "includes" that you need. You have to be able to call back anyway (due to 2). Just make that your principal path.

Daniel Venton2024-08-21T12:03:10Z

If you do what @Daniel Venton suggests, then please do aggregated reference resolution. I.e., download all your initial content, then gather up all the reference URLs, de-duplicate them, and only then hit the server to get reference content. This takes a significant load off of the FHIR server as it prevents a large number of duplicate reference resolutions.

Cooper Thompson2024-08-21T12:31:48Z

_include should not really be an issue? There cannot be too many of those.

Michele Mottini2024-08-21T12:42:57Z

Quite a few resources have 0..* references but I don't have a idea of how many have more than 1. Biggest might be DiagnosticReport:result, depending on how many results are in the average DR.

Daniel Venton2024-08-21T13:36:33Z

Wearing my FHIR hat (not my MS hat =), I think that either erroring or not including any of the related content is probably safer than including partial and hoping that the client can detect and reconcile them.

In the case of partial results:

  • Unless there is a way to page though those inclusions it is just wasted transfer since a client is going to need a new request anyway.
  • Without an error (and since there is no standard process defined) many clients are unlikely to notice.
Gino Canessa2024-08-21T15:31:02Z

What about not including any of the _revIncluded resources in the bundle and removing _revInclude from the returned self link if you can't include all the results?

Elliot Silver2024-08-21T16:57:36Z

If you don't support _include/_revinclude (at all) then you wouldn't mention them in self. If you do support them, but in a limited way, a warning-level OperationOutcome in the response bundle would be called for: "watch it - not a full set of includes".

René Spronk2024-08-21T17:00:17Z

Removing from the self link is very interesting but I would also be concerned that the client can't tell the difference between "the server doesn't support this particular revinclude ever" and "the server had to ignore this particular revinclude on this particular query". I guess they could cross-reference with the capability statement?

Paul Church2024-08-21T17:02:01Z

That's not a conclusive source to determine _include and _revinclude support, certainly not at the level of 'supporting a particular kind of _revinclude in a particular search'. OperationOutcome in the response Bundle is likely the best approach.

René Spronk2024-08-21T17:05:38Z

René Spronk said:

OperationOutcome in the response Bundle is likely the best approach.

But completely useless in an automated way because there is no standard code/message that means "1 or more _include/_revinclude was not fully populated."

Only if you are a user and as a power user you have some control over the queries being executed does the OO have meaning.

Daniel Venton2024-08-21T17:31:39Z

Nothing keeps you from proposing a standardized error codes for these situations..

René Spronk2024-08-22T05:19:50Z

Yes, but that doesn't help with "current situation" -- and even if something were to be proposed and included in the FHIR standard it would probably take a long time to roll out to production FHIR servers (and even longer for EHR FHIR facades)

John Silva2024-08-22T17:28:50Z

I'm experiencing inconsistent behavior with the Microsoft FHIR server when querying data for different lines of business (LOBs) and cities. The API works fine for one LOB and city but fails for another, and I'm trying to understand the root cause of this issue. Here are the details:
URL used: chmmd.xxx.com/provider/Location?address-city=Annapolis&address-state=MD&_revinclude=PractitionerRole:location&_count=100.

  1. Limitations on _include and _revinclude Parameters:
  • We know that the FHIR server has a limitation where queries retrieved with _include and _revinclude parameters are limited to 100 results. While querying for MAPD everything works as expected but CHPMD works ok with a smaller _count value, or with smaller cities (e.g. we see the problem with Annapolis MD
    but not with Crofton).
    What we have also identified is that the limitation while querying the Azure FHIR server is 43 for Annapolis. Any count above 43 is returning “Include result was truncated”.
    also when we are using FHIR Proxy function app to query this instead of directing calling the fhir server, we are getting internal server error instead of the truncated result.
    Has anyone else encountered similar issues with the Microsoft FHIR server? If so, how did you resolve them? Any insights or suggestions would be greatly appreciated.
    Thank you!
Vishav Thakur2024-10-08T16:52:12Z

@Brendan Kowitz @Mikael Weaver

Gino Canessa2024-10-08T17:46:14Z

My suggestion is don't use _inlcude and _revinclude unless you absolutely know that the included resource count is very small.
Instead get the primary resources you want and call back for the distinct include resources you need JIT.
Even if the query works, you are not guaranteed to get all the include resources. If you do get all the include resources, you might get multiple copies as they'll be on every page of primary resources.

Daniel Venton2024-10-08T19:20:26Z

Hi @Daniel Venton @Mikael Weaver @Brendan Kowitz

"I believe that if we don't use _include and _revinclude in our query, we encounter 429 errors for the consumer. Previously, the consumer wasn't using _include and _revinclude, which resulted in 429 errors. To avoid these errors and optimize the query, we considered using _include and _revinclude.

Do you have any suggestions for optimizing the query while keeping these points in mind?"

Thank you!

Premdutt Gaur2024-11-07T16:43:41Z

So if you execute a bunch of simple requests the server rate limits you.
If you try to consolidate queries (so you issue one, but the server acts like many) then you don't actually get the data.
Sounds like you need to convince the server to raise your limit OR put a choke on your code so you don't cross your limit.

Daniel Venton2024-11-07T18:49:16Z

_includes are an area where Azure API for FHIR and Health Data Services differ a lot. In API for FHIR which is Cosmos based, the server internally will do the GET operations to fill the included items in the Bundle. Health Data Services will use SQL to join them in a single query.
If you are getting 429s in API for FHIR you can always increase the RUs which will give you more throughput, this is self-service configuration.
HDS might be better to open a support ticket so we can see what might be going on perf wise, these databases run in big elastic-pools so you get some amount of scaling built in.

Brendan Kowitz2024-11-07T19:03:47Z

Thank you @Brendan Kowitz @Daniel Venton yes, we raised the RUs on fhir server last time when we saw 429 errors and considered to use _revinclude to optimize the resources. But looks like we have to live with more RUs and not use _revinclude.

Premdutt Gaur2024-11-07T19:05:48Z

In API for FHIR, _revinclude does do an additional query to find the reference indexes, then proceeds with using GETs to pull them into the bundle, this could contribute to some additional RU usage over _include

Brendan Kowitz2024-11-07T19:31:18Z
expression library
#questionnaire
In a discussion about FHIRPath expressions and their integration with libraries, participants explored the use of the standard extension for linking expressions back to source library values, debated the uses of `answerExpression` and `candidateExpression`, and considered practical scenarios like dynamic dropdown lists. They also raised concerns about the organization of FHIRPath expressions within library resources, suggesting potential improvements to manage updates and better structure the data.
33 comments
VP
FH
RT
VK

This is the standard extension for linking a fhirpath expression back to a source library value
http://hl7.org/fhir/extension-cqf-library.html
(and yes I plan to use the versioned canonical to be able to manage updates to the definition and prompt for propogation/updates)
@Paul Lynch

Brian Postlethwaite2022-05-04T15:01:06Z

Does anyone know about this error? Could not resolve context name Patient in model System.

vivek kacham2022-05-04T15:46:51Z

vivek kacham said:

Does anyone know about this error? Could not resolve context name Patient in model System.

I suggest you start a new thread/topic. Also, when you do that, could you provide some context about when you are seeing that error?

Paul Lynch2022-05-04T16:51:58Z

Brian Postlethwaite said:

This is the standard extension for linking a fhirpath expression back to a source library value
http://hl7.org/fhir/extension-cqf-library.html
(and yes I plan to use the versioned canonical to be able to manage updates to the definition and prompt for propogation/updates)
Paul Lynch

So, you can put that extension on an item (or maybe in a particular expression extension?), and it points to a "Library" resource, which has a list of Attachments, which I suppose would contain the FHIRPath in the "data" field and maybe indicate that the data is FHIRPath via the Attachment's content type. However, I don't see a way to say which attachment's FHIRPath should be run.

Paul Lynch2022-05-04T16:56:37Z

Each library instance is one expression.

Brian Postlethwaite2022-05-04T17:04:04Z

I'm using it to be a reference source for where the original expression came from, but I clone it into the Questionnaire definition so no need to look anything up at runtime.

Brian Postlethwaite2022-05-04T17:04:49Z

I need clarification on the following points.
1) what's the difference between answerExpression and candidateExpression.
2) With the maturity level being 0 is it worth implementing answerExpression.
It'll be great if anyone can provide some clarity.

Raazia Tariq2022-05-19T13:45:02Z

answerExpression defines the allowed options. You can't choose anything else. candidateExpression provides an initial starter list of data from the record that represents a candidate answer that could be chosen, but doesn't constrain you from choosing/specifying other things.

Same answer as with all maturities - if it's useful to you, use it. However, expect that low maturity artifacts may be rough around the edges and are more likely to evolve in future releases.

Lloyd McKenzie2022-05-19T15:17:51Z

@Lloyd McKenzie Thanks for this.

We are trying to figure out the best way to handle the following scenario where you have a set of dynamic dropdown lists. For example: The first is: Select Country - Based on the response given, the next dropdown of list of States (for that country) would be populated and then based on the states a Region list would be populated - https://github.com/google/android-fhir/issues/979

The values for each of the "lists" would be different ValueSets with answerOptions that can be referenced via uri

We were thinking initially that this would be an example of answerExpression. But now we are wondering whether this could be accomplished using candidateExpression?

How would you approach this?

Thanks.

Fred Hersch2022-05-20T02:02:29Z

(deleted)

Vitor Pamplona2022-05-20T13:45:00Z

answerExpression would be most appropriate. CandidateExpression is more of a set of guidance that appears beside the control where you capture possible answers and gives you data from the EHR to select from.

Lloyd McKenzie2022-05-23T01:44:51Z

This specific issue comes up fairly regularly, we should have some examples to cover this.
@Paul Lynch got any?

Brian Postlethwaite2022-05-23T05:28:34Z

(would be nice for my DevDays content too)

Brian Postlethwaite2022-05-23T05:28:54Z

Brian Postlethwaite said:

This specific issue comes up fairly regularly, we should have some examples to cover this.
Paul Lynch got any?

The RxTerms demo (https://rxterms.nlm.nih.gov/) uses an answerExpression for the strength list. (See https://lforms-fhir.nlm.nih.gov/baseR4/Questionnaire/rxterms for the definition.)

Paul Lynch2022-05-24T16:52:38Z

That would be using the fhir query yeah? Not terminology fhirpath calls?

Brian Postlethwaite2022-05-24T23:46:23Z

Brian Postlethwaite said:

Each library instance is one expression.

Getting back to old discussion... Shouldn't there be a way to put more than one FHIRPath expression into a library, so that a set of expressions could be shared between Questionnaires with a single (or smaller number of) Library resources?

Paul Lynch2024-10-25T15:44:42Z

We don't have a syntax for 'naming' FHIRPath expressions in a single file.

Lloyd McKenzie2024-10-25T16:38:26Z

Maybe an extension should be added? It seems very awkward to create Library resource that contains an Attachment that contains a (base-64 encoded!) a FHIRPath expression, just for a single expression.

Paul Lynch2024-10-25T17:42:16Z

It's not really an extension, it's the format of the 'data' in the Library

Lloyd McKenzie2024-10-25T17:47:21Z

We'd have to define a new mime type for some sort of text file that contains 'named' FHIRPath expressions

Lloyd McKenzie2024-10-25T17:47:57Z

The 'data' is in the Attachment, not the Library. I was thinking each FHIRPath expression could be its own Attachment, which could have an extension to name it.

Paul Lynch2024-10-25T20:53:28Z

Personally not a fan. Then tweaks to a single expression cause more rippled change consequences. And searching becomes less pleasant too.
My "library" can currently let you find expressions that use a function via the search.
Happy to demonit next week if you like.
The only stuff in it is the fhirpath unit test content though.

Brian Postlethwaite2024-10-25T21:14:53Z

Maybe the term library is the problem.
What I want IS a single expression per item and locate them correctly. Having more in it wouldn't serve my needs.
In my use case the "library" is the entire collection, and the fhir Library resource is an item in the collection.

Different cases?

Brian Postlethwaite2024-10-25T21:17:53Z

It just seems like a lot wrappers around an expression. I was trying to remove one of those layers.

Paul Lynch2024-10-25T21:22:26Z

The expression is the granularity I need. With a container resource for its descriptive metadata. And be able to search for it individually.

Brian Postlethwaite2024-10-25T21:24:10Z

This is what is linked via the cqlExpressionLibrary extension which could then help managing updates? Though I've done nothing about that.

Brian Postlethwaite2024-10-25T21:25:23Z

I expect a more common pattern will be to maintain population and extraction logic in data element libraries, in which case you'll be using StructureDefinition instead of Library, and that'll be less overhead. Tend to agree with Brian that if you want a bunch of FHIRPath expressions in a single Library, may as well just call it CQL.

Lloyd McKenzie2024-10-25T21:26:06Z

Lloyd McKenzie said:

I expect a more common pattern will be to maintain population and extraction logic in data element libraries, in which case you'll be using StructureDefinition instead of Library, and that'll be less overhead. Tend to agree with Brian that if you want a bunch of FHIRPath expressions in a single Library, may as well just call it CQL.

I don't think I've seen an example or documentation for storing FHIRPath expressions in a StructureDefinition. What would that look like?

Paul Lynch2024-10-28T14:30:35Z

You'd put the extensions on an ElementDefinition. Most of the extension's scopes have expanded to include that.

Lloyd McKenzie2024-10-28T14:35:58Z

Topic for a call I think.

Brian Postlethwaite2024-10-28T20:37:54Z

I came up with this sort of thing
https://dev.fhirpath-lab.com/Library/extract-expr-PatientAddressCity
Where I use the library resources related artifact to specify the inputs the expression needs, and use context to say where the expression is expected to be used.
UI doesn't show it, check the json expander.

The logical model thing looks like more of the questions than expressions.

Brian Postlethwaite2024-10-28T20:40:36Z

That is not a bulky as I thought it would be.

Paul Lynch2024-10-29T19:14:37Z
Future Feature
#analytics on FHIR
Grahame Grieve discusses the potential for improving static analysis in SQL on FHIR by allowing ViewDefinitions to specify profiles alongside resource types, enabling more accurate semantic validation. The group agrees on the idea of including multiple profiles for enhanced clarity while still debating the implementation details and implications for static analysis and validation processes.
29 comments
RB
AS

I'm just working on my presentation for the SQL on FHIR webinar, and I've found an aspect of my implementation that could be improved if there's a new feature in ViewDefinition. At present, the ViewDefinition nominates the resource type on which it's based. And my expression checker checks the expressions against the base resource definition.

That check includes a particular check that's quite useful: checking whether the expression for a column value can return more one value, and comparing that to the definition of the column

But that check would be more useful if the checker was informed by a profile on the resource. E.g. the base resource says that the base category element can repeat, but a profile says that it can only be 0..1 not 0..*.

The author knows that the profile applies, and the warning is not correct. But the machinery could get this right if as well as the resource type, the view definition could also nominate a profile for the resources it applies to.

I don't propose that the applicable profile acts as a filter like in a .where clause - that's computationally difficult, even if an implementer can link in validation like that. Just that the profile acts as a context for semantic checking of the definition, based on the assumption that the implementation will ensure that the profile is met somehow

Grahame Grieve2024-10-22T22:15:21Z

Good idea. I think we discussed that author can attach a list of profiles to view definition to communicate intention. But didn't agree on extra semantic of it like filtering or hints context for fhirpath.

I imagine that IG authors can compliment profiles with flat views and eventually "queries" and publish as part of IG ;)

Nikolai Ryzhikov 🐬2024-10-23T08:02:22Z

interesting. I'll think about that

Grahame Grieve2024-10-23T08:12:15Z

I've added a GH ticket for tracking: https://github.com/FHIR/sql-on-fhir-v2/issues/265

Arjun Sanyal2024-10-23T14:03:38Z

+1 to this idea -- adding an optional field (resourceProfile)? to ViewDefinition for this is simple enough and adds clarity to the definition as well as improved validation, as Grahame points out.

Ryan Brush2024-10-23T17:35:48Z

(singular I hope)

Brian Postlethwaite2024-10-23T17:51:43Z

Why singular? If my view works with (say) 3 different profiles, I'm thinking listing multiple profiles (with "any-of" semantics) would be straightforward.

Josh Mandel2024-10-23T18:00:37Z

well, multiple is beyond my skill for FHIRPath evaluation right now

Grahame Grieve2024-10-23T19:07:24Z

I'm missing where/how this is involved in fhirpath evaluation for you. I was assuming you have pre-calculated a set of profiles for each of your resources and you'd run these views only on resources that match the profile(s) specified in this new slot.

If there were 3 specified profiles, you could just loop over them, similar to how you loop over all the view definitions.

Josh Mandel2024-10-23T19:39:49Z

the driver for me is using the profile to do static evaluation of the path expressions. I do that now, and so does @Brian Postlethwaite. I don't know how to do that for multiple profiles, and I presume that was Brian's point.

It doesn't make any difference for the actual execution

Grahame Grieve2024-10-23T19:42:23Z

You can still treat 3 profiles in one ViewDefinition the same as 1 profile in each of three ViewDefinitions,no?

That check includes a particular check that's quite useful: checking whether the expression for a column value can return more one value, and comparing that to the definition of the column

You'd check if under any of the 3 named profiles the expression can return more than one value. It's still just a loop over the profiles.

Josh Mandel2024-10-23T19:47:58Z

sounds conceptually simple, but sure, I could triplicate all the errors I find. I didn't say it's impossible, just that I don't know how to do it nicely right now. Nor did I say your thought isn't valid

Grahame Grieve2024-10-23T19:49:17Z

Would the assumption be that ALL profiles apply, or ANY profiles apply.
The difference being that the static analysis would need to check for each property that at least 1 profile satisfies it, or that ALL pass.

Brian Postlethwaite2024-10-23T19:49:56Z

with "any-of" semantics

i.e. you provide a list of profiles such that "a resource that matches any of these profiles is a candidate for this view"

Josh Mandel2024-10-23T19:50:57Z

I'm not sure that would be so simple either. Will think about it more.

Brian Postlethwaite2024-10-23T19:54:24Z

I like the idea of multiple profiles with any-of semantic - "profile": [ a, b, c]

Nikolai Ryzhikov 🐬2024-10-23T20:10:51Z

Should it be treated as "where" filter is a separate question!

Nikolai Ryzhikov 🐬2024-10-23T20:12:14Z

Brian Postlethwaite said:

I'm not sure that would be so simple either. Will think about it more.

Claude notes

Josh Mandel2024-10-23T20:13:03Z

Basic semantic could be: this view was designed with these profiles in mind!

Nikolai Ryzhikov 🐬2024-10-23T20:13:36Z

Grahame Grieve said:

But that check would be more useful if the checker was informed by a profile on the resource. E.g. the base resource says that the base category element can repeat, but a profile says that it can only be 0..1 not 0..*.

Wouldn't this be achievable by simply adding a first() to the FHIRPath expression? I am trying to understand cases where adding a profile field to ViewDefinition is required and cannot be replaced by more constrained FHIRPath expressions.

Bashir Sadjad2024-10-24T18:19:18Z

first() semantics are potentially lossy. The goal here is to use an expression that is obviously not lossy, but also to justify the fact that it would only ever return one result by static analysis based on profiles..

Josh Mandel2024-10-24T18:39:18Z

Bashir, You are correct that the .first() can resolve the issue, however the purpose for GG and I of the profile is to be able to check that these have adequately been covered.
E.g. Only real properties have been selected, and that end up with appropriate cardinalities via static analysis.

Brian Postlethwaite2024-10-24T19:27:04Z

Thanks @Josh Mandel and @Brian Postlethwaite for the clarifications. So is it fair to say that the proposed profile field has no impact on the evaluation/application of a ViewDefinition on an actual resource and is ONLY used for static analysis? If yes, in the above cardinality/collection example, if there is no first() and the collection is not set to true, I suppose a view-runner should fail (or return no value for that column) when the VD is applied on a resource that does not adhere to the target profile.

Bashir Sadjad2024-10-24T23:52:52Z

My reading of this is that this proposal is not imposing any additional requirements on a "runner", it is simply providing additional information so that a "validator" can do its job more precisely. It also serves to improve documentation and communication of intent.

A runner can be completely unaware of the resource definition or any declared profiles.

John Grimes 🐙2024-10-25T00:17:57Z

We can get both if authors would add "first" as safeguard, but smart runners would be able to prove that transformation is not lossy for these specific expressions ;)

Nikolai Ryzhikov 🐬2024-10-28T08:47:42Z

This is a good feature for smart runners to inform that transformation can be lossy! $Validate?lossy=false

Nikolai Ryzhikov 🐬2024-10-28T08:50:50Z

Right; actually I think I should have been more clear in my last message: My point was that with first(), applying VD on a resource that does not comply with the target profile, would be lossy but does _not fail_. Maybe this is preferred over the option without first() (which will/should fail). I agree that adding the VD profile field for documentation/validation is a good idea.

Bashir Sadjad2024-10-29T03:52:49Z

I've opened a pull request to add this: https://github.com/FHIR/sql-on-fhir-v2/pull/267

John Grimes 🐙2024-11-06T01:00:42Z

John Grimes 🐙 said:

I've opened a pull request to add this: https://github.com/FHIR/sql-on-fhir-v2/pull/267

May be VD.profile? Or does it conflict with something?

Nikolai Ryzhikov 🐬2024-11-08T05:59:20Z
Nicole Sun inquired about challenges relating to using Auth0 for obtaining the correct Bearer-type access token via fhirclient.js for SMART on FHIR EHR launches, noting issues with token retrieval and the absence of necessary claims like patientId in the token response. Dan Cinnamon and Josh Mandel provided insights on configuring Auth0 to properly support SMART App Launch requirements, suggesting that missing audience parameters might hinder the authentication process, and emphasizing the security importance of correctly handling audience validation in production settings.
32 comments
DC
SF

(I have been told to ask in this channel after I posted in the implementer channel.)
Hi, I have a question regarding the use of Auth0 for SMART on FHIR EHR launches.

The client app uses the fhirclient.js library, but it seems that fhirclient.js cannot retrieve the correct Bearer-type access token from Auth0. In Postman, I can access FHIR data using the token retrieved by fhirclient.js if I select the ‘JWT Bearer’ option, rather than the ‘Bearer Token’ option. As a result, the fhirclient.js process cannot access fhir server due to the incorrect token for its process.

Can anyone confirm if this is a known issue? Are there any specific configurations or parameters required for this setup?

From my experience, when using the OAuth2 authentication type in Postman, I need to include an “audience” parameter in the Auth Request to retrieve a valid Bearer token. However, I haven’t found a place in fhirclient.js where this “audience” parameter can be set. I even tried modifying the library to include this parameter for testing, but without success.

Nicole Sun2024-10-24T05:14:54Z

Hi! Let's break this down step by step. First, it would be helpful if you could provide some additional context about your setup:

  1. Which EHR system are you launching against?
  2. What role is Auth0 playing in your architecture?
  3. How is Auth0 configured?

Access Token Types

SMART EHR Launch specifically uses an authorization code flow that requires "Bearer" tokens. The SMART App Launch specification requires the authorization server to issue "Bearer" tokens from its token endpoint. If Auth0 is configured to issue a different token format, this could be causing your issues.

Note: I notice some potential confusion in your description - "JWT Bearer" in my experience refers to a method for authenticating or authorizing with the token endpoint (RFC 7523), not a token format used for accessing the FHIR server itself.

Audience Parameter (aud)

The aud parameter is indeed required in the authorization request, but you shouldn't need to configure it separately in fhirclient.js. Here's why:

  • The parameter tells the authorization server which FHIR endpoint you plan to use the access token with
  • fhirclient.js already knows your FHIR endpoint (you provide it as input)
  • fhirclient.js uses this endpoint as the base for discovery and automatically then passes it as the aud value to the authorize endpoint
  • In other words: aud = FHIR endpoint URL
Josh Mandel2024-10-24T15:25:17Z

Hi Josh thanks for the response!

  1. I am testing the SMART EHR Launch which is open source. Launching the application from a button inside of this web app.
  2. I am not sure how to answer this exact, I can tell you the configuration. I would say it's for authorization to allow the client application to access the fhir repo.
  3. I configured FHIR endpoint in Applications->API, JWT profile=Aut0, JWT signing Algorithm=RS256, added a list of permission for example user/. is one of them. Then I have got a single page Application configured under Applications->Application. I have a user setup under User Management and for the same user I have assigned the permissions to access the API endpoint

For JWT Bearer, it's something in Postman, please check the screenshot.
Screenshot 2024-10-25 at 09.06.06.png
The incorrect token I got from fhirclient.js process can be used in the JWT Bearer option in the Postman to access data from the fhir endpoint.
I can also get such a token if i don't setup audience in the Postman
Screenshot 2024-10-25 at 10.03.11.png
However, if I tick this audience setup, I can get the correct Bearer token and access the fhir data.

In terms of audience in fhirclient.js, I understand it's the fhir endpoint, but I don't think aud is used in the token request unless the private key is provided, check this code screenshot
Screenshot 2024-10-25 at 09.58.33.png

Nicole Sun2024-10-24T23:00:12Z

SMART EHR Launch which is open source.

Can you share a link to the specific EHR you're trying to launch against? I'm not sure precisely what you mean.

Josh Mandel2024-10-24T23:03:54Z

The screenshot you are showing above relating to JWT bearer has to do with authentication for a token API endpoint request, not for a resource API interaction. I think you may be making a wrong assumption somewhere but I am still not sure what exactly you are doing.

Josh Mandel2024-10-24T23:05:01Z

https://github.com/aehrc/smart-ehr-launcher is the open source app I use for testing

Nicole Sun2024-10-24T23:05:44Z

"The screenshot you are showing above relating to JWT bearer has to do with authentication for a token API endpoint request, not for a resource API interaction. I think you may be making a wrong assumption somewhere but I am still not sure what exactly you are doing."
Yes it is, I just used postman to test the token retrived via fhirclient.

Nicole Sun2024-10-24T23:07:46Z

Ah. I'm not familiar with this tool but if https://github.com/aehrc/smart-ehr-launcher is using auth0 under the hood, that configuration could be part of the issue.

@Sean Fong is listed as the developmeper -- Sean, does any of this ring a bell?

Josh Mandel2024-10-24T23:09:36Z

This EHR launcher is from EHR app side, I think the problem is fhirclient.js (client app) and the auth server side.
I am pretty sure some other auth server works with fhirclient, since it's out there for a while,my question is for Auth0 particularly. Not sure if anyone else has experienced something similar.

Nicole Sun2024-10-24T23:12:00Z

I'm sorry, I still can't understand the setup you're using. Can you provide a minimal reproducible example? (https://stackoverflow.com/help/minimal-reproducible-example has some background.)

Josh Mandel2024-10-24T23:14:41Z

Sorry I am still pretty new to SMART on FHIR, using some examples to learn how to make it happen and debug through fhirclient to check out the exact steps. The client app I have been testing is https://github.com/aehrc/smart-forms.

Currently the problem is Auth0 access token retrieved via fhirclient is incorrect, therefore the process cannot continue. If I manually put the correct token in the middle of the process, Auth0 can access the fhir endpoint, but it doesn't return patientid in the tokenResponse, the process in fhirclient requires this information (the interesting thing is - in fhirclient patientid is in tokenResponse in the earlier code, but once it requests token from Auth0, the tokenResponse gets overwritten completely). However, it seems there is a way to create costomised claims in its response via Actions, I am going to test it out. Again if I manually put patientid in the tokenResponse, I can retrieve the fhir data for this patient. But I don't believe I should change any of the code in fhirclient.js, it was just for testing/debugging. So the current blockers are the incorrect access token retrieve and the tokenResponse customisation from Auth0 side.

My steps are:

  • deployed EHR and Client App on my local pc
  • configure the EHR app to access my fhir endpoint
  • configure the fhir endpoint for iss in the client app
  • register the client app in auth0 and get client id and set it up in the client app.
  • Setup API point in Auth0 to fhir endpoint and configure the permissions.
  • create a user in Auth0 user management and configure the permission to access the API configured in the previous step

Is there anything more I should provide?

Nicole Sun2024-10-24T23:27:47Z

This is not reproducible.

What fhir endpoint are you connecting to, and how is it related to auth0?

Josh Mandel2024-10-25T00:23:44Z

Sure. It's configured in auth0 API. the user setup in user management has the permission to access this API fhir endpoint. In this test, when the ehr app tries to launch the client app, a logon screen pops to allow to enter this configured username and password.
One more point sorry didn't mention, the client id for the client app is registered in this fhir server as well.

Nicole Sun2024-10-25T01:12:39Z

Hi all,

https://github.com/aehrc/smart-ehr-launcher is a fork of the https://github.com/smart-on-fhir/smart-launcher-v2. It doesn't use Auth0.

From what I can understand, it looks like it's a case of Auth0 not passing the patientId claim to the tokenResponse.
It might be due to Auth0 not being configured to do so. Might need to configure Auth0 so it knows how to pass the patientId claim to the tokenResponse.

If I remember correctly, there is somewhere in the SMILE CDR settings to write JS code for SMART App Launch processing. Perhaps there is something similar within the Auth0 config.

Sean Fong2024-10-25T01:14:00Z

Hi Sean, thanks for your input!, yes the tokenResponse from Auth0 doesn't have patientid, but it seems it possibly can be done via Action in Auth0, I am going to test this point. But the token retrieved from Auth0 is not correct, I guess it's because the fhirclient doesn't really pass audience to the token request if the private key is not provided. Do you know if anyone has tested this point or has this experience? (It seems Auth0 itself does have it's own SDK libraries for smart on fhir)
My understanding this smart ehr launcher on github is a web application, it requires an authorization server to be configured in order to make it work with client apps.

Nicole Sun2024-10-25T01:17:50Z

It sounds like you're trying to use auth0 for something it doesn't do. I'm not sure what got you started down this path, but your authorization server needs to be aware of your fhir server and needs to support SMART App Launch. You can't just... use an unrelated server.

If you're just looking for a test server, any reason why you don't use https://launch.smarthealthit.org ?

Josh Mandel2024-10-25T01:35:53Z

Auth0 does claim they support SMART on FHIR and it's free for me to test that's where I started :)
I am pretty sure Auth0 can work if the client app uses it's Auth0 SMART library.
So your feeling is that Auth0 is not compatible with fhirclient.js?
That's also a point what I would like to learn, where the client apps stand? Do they need to developed for all the EHR auth servers or auth servers need to configured for whatever smart libraries client apps use?

Nicole Sun2024-10-25T01:42:21Z

"supporting" SMART on FHIR isn't the same as "works with any fhir server you choose, with no configuration."

You'll need to follow the auth0 configuration process; it sounds like you're hitting issues with auth0, and that the fhirclient.js is behaving correctly according to the spec. Sorry I can't be more helpful, but I don't know the ins/outs of auth0's product.

Josh Mandel2024-10-25T01:45:13Z

Do they need to developed for all the EHR auth servers or auth servers

No, clients that follow the spec should interoperate with servers that follow the spec

Josh Mandel2024-10-25T01:46:22Z

I think fhirclient.js would work with any authorization server with SMART App Launch set up properly.

You can try using the Auth0 SMART library for initial testing, but AFAIK a lot of SMART apps are using fhirclient.js. So would be best if you can configure Auth0's SMART App Launch to play well with fhirclient.js.

Ideally client apps can be launched from any server supporting SMART App Launch.

Sean Fong2024-10-25T01:46:59Z

Thanks both for your input! If Auth0 is not compatible with fhirclient.js, not a problem, it's still a good journey to deep dive to discover the issues and figuour out why. :smile:

Nicole Sun2024-10-25T01:50:05Z

Hi coninue the topic a bit more.
I've just revisted the spec and found this.
image.png

It seems patient id is not mandatory for the tokenResponse in the spec. However fhirclient doesn't seem to allow the process to continue without patientid in the tokenResponse. (Just note, not for Auth0 particular for not respond patient id, just a general question.)

In terms of the token issue, it's either my config issue or the issue of Auth0 itself, it doesn't seem "audience" is a required token request parameter in the spec.

Nicole Sun2024-10-25T03:09:24Z

If you're requesting patient/ scopes, then a patient launch context parameter is required (see https://build.fhir.org/ig/HL7/smart-app-launch/scopes-and-launch-context.html#launch-context-arrives-with-your-access_token)

aud is a required authorization request parameter, not a token request parameter (see https://build.fhir.org/ig/HL7/smart-app-launch/app-launch.html#request-4)

Josh Mandel2024-10-25T03:12:12Z

"aud is a required authorization request parameter, not a token request parameter" - Yes I found this. Thanks for confirming!
Also thanks for pointing me to the right spot for "If you're requesting patient/ scopes, then a patient launch context parameter is required"!

Nicole Sun2024-10-25T03:17:28Z

Hi @Nicole Sun - Auth0 is part of Okta, and I have done quite a bit of work around supporting SMART launch framework with it. There are a few challenges to overcome- but with the new forms capability, it's now able to natively host things like the patient picker- so that's super exciting: https://github.com/dancinnamon-okta/auth0-smartfhir-demo

Dan Cinnamon2024-10-28T19:14:56Z

I think part of the issue here is that Auth0 expects the "audience" to be sent in a querystring parameter called "audience", and the SMART launch framework uses the querystring parameter called "aud". Therefore when you make that initial call- auth0 is actually not associating it properly. There are 2 solves:
1- In my github repo there- I am using a WAF in front of Auth0 - many customers have WAFs in front for various reasons-- but in my example, I simply update the aud->audience querystring variable. The purpose of the two are identical- just the names are different.

2- In Auth0- there is a setting, under "Settings -> Tenant Settings -> API Authorization Settings -> Default Audience". In there, you can put your FHIR base URL there (what you would have passed in via the aud parameter). This effectively hard-codes the audience from a logic/access control perspective, and would make it such that your Auth0 tenant could only be used for 1 FHIR service. Might be OK for now.

Dan Cinnamon2024-10-28T19:22:11Z

FYI- Auth0 always mints JWTs for accessing APIs- there should be no concern there- I'm using a custom action within Auth0 to transfer the selected patient from the picker form (also hosted by Auth0), and putting it within the JWT. Auth0 currently has no way of actually putting the patient in the actual /token response though- so that's the other part that the WAF handles- it reads the selected patient ID in the JWT, and it copies the value into the /token response.

Dan Cinnamon2024-10-28T19:30:02Z

Hi @Dan Cinnamon - Thanks, that's very helpful for me to understand how Auth0 works for smart! I will test out your suggestions and let you know. I did find your github demo and discovered that you programatically use action to set the patient in the claim. I can see Action is a component in Auth0 web UI as well.

Nicole Sun2024-10-29T03:57:16Z

I have tried Default Audience, it works! yes I understand it's a hardcoded solution, but it's a good workaround if there is no multiple audiences required.

Nicole Sun2024-10-29T11:10:05Z

:high_voltage:danger!:high_voltage:

Note that even with a signgle intended fhir server, aud plays an important security role by letting you recognize (and reject requests) when an app has been tricked by a malicious fhir endpoint that lies (via its .well-known/smart-configuration) by saying that your authorization server provides its tokens. If you (as an authorization server) don't recognize this case, you'll allow the app to be tricked into revealing your tokens to the malicious endpoint operator, which can then turn around and use the tokens to access your resource server).

If you're just playing around / testing, no big deal, but it's essential to process aud correctly in a production environment.

Josh Mandel2024-10-29T13:58:20Z

Oh! yes thank you @Josh Mandel - good callout there. Auth0 does validate the audience (when it sees one), but at one point I did have extra code in to additionally explicitly validate it in the event someone used this workaround and that would definitely be required here. I'll put that back in the repo.

@Nicole Sun - Here is example code for the recommended Auth0 action that would validate the aud field against what we're expecting. In the example I'm not explicitly rejecting the request, since it's possible there could be other, non-FHIR related APIs that the tenant is authorizing for- but it's a starting point for validation on aud.
https://github.com/dancinnamon-okta/auth0-smartfhir-demo/blob/6c10a722938ed17f101a5d3ea50b5d0b92f6c2da/deploy/auth0/actions/Initial%20FHIR%20Authorize.js#L17

Dan Cinnamon2024-10-29T15:17:49Z

@Josh Mandel Yes totally agree! Not for any productions, just for testing and learning purpose. Thanks for pointing out the importance!!
@Dan Cinnamon thanks! it’s good to learn action is where we can do different customizations in the process.

Nicole Sun2024-10-29T21:28:18Z
Call today
#questionnaire
In a recent chat, participants discussed the status of their weekly calls, confirming that today's SDC call was canceled due to scheduling conflicts and upcoming breaks until January. Lloyd McKenzie shared details about the call schedule, while others expressed interest in joining future meetings and contributed to ongoing projects and proposals.
27 comments
D
BR

Sorry for forgetting about today's call. Was deep into something and somehow didn't hear/process my phone's little chime. Will try again next week.

Lloyd McKenzie2022-08-25T21:21:41Z

Hello @Lloyd McKenzie, I am working on SDC implementation these days and would like to join the weekly calls. Request you to please share the bridge details for joining the same. Thank you

Ankita Srivastava2022-08-29T13:27:23Z

@Ankita Srivastava all our call details are listed here: https://confluence.hl7.org/pages/viewpage.action?pageId=40743450

Lloyd McKenzie2022-08-29T15:02:41Z

Thank you so much @Lloyd McKenzie

Ankita Srivastava2022-08-30T02:34:14Z

Hi @Lloyd McKenzie , I am back from the dead :wink: and was wondering if there is a call today. Maybe missed an announcement somewhere? Are the calls still happening ?

Stoyan Halkaliev2022-09-22T21:20:48Z

Hi @Stoyan Halkaliev ! I think there is no call today because of the WGM, but it should be back next week.

Paul Lynch2022-09-22T21:22:14Z

Thank you @Paul Lynch for the quick reply. Looking forward to next week.

Stoyan Halkaliev2022-09-22T21:22:56Z

Glad you're among the living once again @Stoyan Halkaliev :)

Lloyd McKenzie2022-09-22T23:47:53Z

Hi @Lloyd McKenzie , Just wanted to check if we have a call today?

Ankita Srivastava2022-11-03T21:05:08Z

It was canceled. (See the "No call today" thread.)

Paul Lynch2022-11-03T21:06:08Z

Thanks @Paul Lynch for the quick reply. I missed the notification.

Ankita Srivastava2022-11-03T21:06:48Z

Will there be a call today? It appears that Lloyd McKenzie Lloyd is on vacation.

Diane2022-11-10T21:55:43Z

I guess we get a week off then? :smile:

Brian Postlethwaite2022-11-10T22:04:35Z

I don't see it on https://www.hl7.org/concalls/index.cfm, but then I don't see it listed for previous weeks either.

Paul Lynch2022-11-10T22:06:45Z

Will there be a SDC call today?

Diane2022-12-01T19:15:52Z

Yes

Lloyd McKenzie2022-12-01T20:16:22Z

NOTE: We'll be taking a break on calls through the end of the year. Next call will be Thursday Jan. . 12

Lloyd McKenzie2022-12-01T23:03:36Z

There will be an SDC call today (at long last). Details here: https://confluence.hl7.org/pages/viewpage.action?pageId=40743450

Lloyd McKenzie2023-01-26T18:09:11Z

is cancelled. Brian's not able to attend and our remaining tracker items require his input.

Lloyd McKenzie2024-04-04T20:37:31Z

I'm in leave tomorrow so won't be able to make it this week.

Brian Postlethwaite2024-04-25T10:06:41Z

@Bryn Rhodes, are you still able to come?

Lloyd McKenzie2024-04-25T10:24:15Z

Apologies, TSMG meets today at that time so I won't be able to make it

Bryn Rhodes2024-04-25T14:14:52Z

Ok, then let’s cancel the call

Lloyd McKenzie2024-04-25T14:57:57Z

Did we cancel this weeks SDC call?
(or was it for next week?)

Brian Postlethwaite2024-09-05T12:16:43Z

We'd said we would cancel today, but then I forgot to do that. Now recorded properly.

Lloyd McKenzie2024-09-05T14:27:13Z

I've updated the definition based extraction proposal:
https://hackmd.io/@brianpos/definition-based-extract
I've included the list of issues that I experienced, then the list of recommendations/proposals to cover them off.
We can work through it all on the call, then I can update proposed wording in the spec based on the content for voting. I believe that I've covered off everything that I wanted to, and simpler than where I was trying to take it while at the connectathon.
@David Hay @Lloyd McKenzie @Paul Lynch @Brenin Rhodes

I'm really excited with how clean/capable it has ended up.

Brian Postlethwaite2024-10-31T07:29:27Z

I'm now up to working on the template based approach.

Brian Postlethwaite2024-10-31T07:45:53Z
ODH codes
#terminology
John Moehrke raises concerns about the lack of codes in the ODH code system within THO, expressing a preference for the updated code system found on the CDC website, which is considered the authoritative source. Marc Duteau indicates that efforts are underway by NIOSH to improve resources related to ODH in THO, while John suggests adding the relevant code systems managed by CDC to address his needs.
23 comments

I am trying to use the ODH codes - http://terminology.hl7.org/CodeSystem/PHOccupationalDataForHealthODH

The codeSystem is defined in THO, but it has no codes. Where are the codes?

I do find on CDC - https://phinvads.cdc.gov/baseStu3/CodeSystem/2.16.840.1.114222.4.5.327

John Moehrke2024-11-04T19:10:24Z

"date": "2020-12-07"- that one's pretty old

Grahame Grieve2024-11-04T19:11:51Z

The one on cdc.gov site is newer (20201030) than THO (20190320)

John Moehrke2024-11-04T19:14:34Z

irrelevant since the THO one doesn't include codes

Grahame Grieve2024-11-04T19:15:04Z

right

John Moehrke2024-11-04T19:15:13Z

I would rather take a codeSystem that is a millenium old vs one that is empty

John Moehrke2024-11-04T19:15:40Z

also... Authority... cdc.gov seems to be the right authority...

vs HL7 "publisher" : "TBD - External Body",

John Moehrke2024-11-04T19:16:44Z

should the phinvads package have included codeSystems? This is what I was expecting, but it seems it only has valueSets in it.

John Moehrke2024-11-04T19:18:05Z

because systems like vsac and phinvads republish 100s of code systems that are published elsewhere

Grahame Grieve2024-11-04T19:28:25Z

and they used to do soe badly, though things are improving a little lately

Grahame Grieve2024-11-04T19:28:47Z

so I ignore code systems from those servers unless analysis shows that they are the only and correct source

Grahame Grieve2024-11-04T19:29:23Z

so far I process 4 code systems from vsac, and one is a constant source of grief for us all

Grahame Grieve2024-11-04T19:29:46Z

so, what about these ODH codes?

John Moehrke2024-11-04T20:58:32Z

I see on the CDC website that they give an email to ask questions, so I asked PHINVS (CDC) <PHINVS@cdc.gov>

John Moehrke2024-11-04T21:01:35Z

The answer I got back recommended the use of the baseStu3 uri

John Moehrke2024-11-04T21:01:56Z

Note, that Eric has indicated that us-core just used ignorewarnings.

John Moehrke2024-11-04T21:03:19Z

CDC is the source of truth and since that url provides a FHIR resource, I'd say that it is a likely source for the concept content. @Jenny Couse is that correct?

Unfortunately, that site has a different defining url, which means that it cannot be the authoritative source for HL7 approved representation of the code system. @Reuben Daniels @Carol Macumber Perhaps we can add this to our list of what needs to be reconciled.

Robert McClure2024-11-04T21:29:48Z

the THO resident codeSystem is grossly unsatisfactory. It can't even figure out what to put in the publisher, indicating "TBD".

John Moehrke2024-11-04T21:43:30Z

NIOSH has hired a team from Dogwood including myself to update their Occupation and Industry resources, including the resources in THO. So with that hat on I'll be coordinating with HTA and with myself with my UTG content curator hat on to deprecate, retire, or update the various resources around ODH in THO. Because yeah, currently that metadata record is very bad.

For the current state of things, from NIOSH's perspective PHIN VADS is the current source of truth.

Marc Duteau2024-11-04T21:58:20Z

phinvads only contains valueSets

John Moehrke2024-11-04T22:02:00Z

but it would be good to add the few codeSystems that CDC also owns and manages. That would likely satisfy my ODH need.

John Moehrke2024-11-04T22:02:48Z

I hope you can work with yourself. tough boss

John Moehrke2024-11-04T22:03:11Z

I hope the source of truth won't remain R3

Grahame Grieve2024-11-04T22:12:08Z
Stephen MacVicar expressed frustration over repeated CAPTCHA challenges while trying to access FHIR specifications due to security measures on the HL7 website, which was experiencing heavy automated traffic attacks. Eric Schmitt, from HL7, acknowledged the issue and updated the rate-limiting settings to lessen the frequency of CAPTCHA prompts for genuine users while still protecting against potential threats.
17 comments
SM

Why do I have to deal with captchas while trying to view FHIR specs? They're just static pages. This is the fourth one I've had to do in the last five minutes while trying to investigate changes across US Core versions and I'm starting to lose my mind.

Screenshot 2024-10-30 at 1.50.47 PM.png

Stephen MacVicar2024-10-30T17:53:14Z

there's a security layer in front of the HL7 website to perform surface protection - it was getting a serious amount of assault.

Usually that means that something about your web browser is set to suppress the User-Agent header, and the security layer doesn't recognise your requests as coming from a normal browser

Grahame Grieve2024-10-30T18:03:51Z

It can also mean that you're coming from an IP address that (perhaps because there's a bunch of shared traffic routed through it) is hitting the HL7 website a lot more than a 'normal' IP address does and the site is trying to make sure you're not part of a DoS attack.

Lloyd McKenzie2024-10-30T18:18:04Z

My understand is that all Mitre traffic will be coming from a few IPs, so that is certainly the case.

Stephen MacVicar2024-10-30T18:19:20Z

You can reach out to webmaster@hl7.org and they can potentially put those IPs on a whitelist. (We commonly do that for WGMs and connectathons when there's suddenly a huge spike in traffic from a normally quiet IP :smile: )

Lloyd McKenzie2024-10-30T18:41:41Z

I was teaching yesterday at the university and had also to solve 4 times the captcha under the laugthers of the student when I failed even once ...

Oliver Egger2024-11-02T11:04:02Z

Don't you even know what a crosswalk is?!

Rik Smithies2024-11-02T12:03:00Z

I haven't faced this issue during a training course as of yet - if it were to happen too often I'd probably set up a mirror to avoid annoying my training attendees.

René Spronk2024-11-03T08:02:05Z

I've got one Mac user in my training course today: new captchas appear before he can even enter something in a previous captcha. That's unworkable.

René Spronk2024-11-05T09:14:00Z

The System clearly recognizes that Mac users are a superior race of benevolent AI overlords ?

Kari Heinonen2024-11-05T09:22:14Z

@Eric Schmitt

Grahame Grieve2024-11-05T10:07:42Z

Strong possibility it is related to using iCloud Private Relay, where its likely that other not-so-nice or abnormal traffic is coming from that 3rd party IP -- which is how it gets put on the flagged list. There are some alternatives to IP-based security rules in this case of iCloud Private Relay that @Eric Schmitt and the HL7 tech team can investigate, but this is part of an ongoing, dynamic, and resource intensive challenge of providing a reliable global platform.

Daniel Vreeman2024-11-05T12:32:19Z

i use a mac too, but icloud private relay is not activated in my case ...

Oliver Egger2024-11-05T12:55:22Z

Hi All,
What you are experiencing is our Web Application Firewall rule for Rate-limiting by IP address. With your feedback I have made an adjustment to that rule.

The rule is based off unique IP address requests.
A unique IP would get CAPTCHA if they had more than 100 requests in 2 minutes.
I have increased the rate limit to 200 requests in 2 minutes.
If we need to go higher we can, but it is best practice to step slowly and evaluate impact on legitimate users.

Raising the rate limit to 200 requests allows legitimate users to make more requests in a short period of time without triggering CAPTCHA, but it is still restrictive enough to prevent high volumes of requests typical of automated bots.... which were attacking us daily. We want to find a good balance to not affect legitimate requests.

Feel free to reach out any time here or Eric@hl7.org

Best,
Eric Schmitt
Director of Technical Services

Eric Schmitt2024-11-05T14:17:40Z

Is this request amount per html page or http requests? because the FHIR homepage itself makes 41 http requests alone, switching from R5 to R4 and then selecting some pages brought myself pretty fast over the 100 requests and that could be what I experienced ...

Oliver Egger2024-11-05T15:26:13Z

Thank you for your feedback Oliver.
To clarify, our AWS WAF rate-limiting rule applies to all HTTP requests made by a single IP address, rather than individual HTML pages. This means that each request—for example, requests for images, JavaScript files, or stylesheets—counts toward the rate limit for a given IP.

We can increase the threshold as we feel needed to try to find the ideal balance.

Eric Schmitt2024-11-05T15:44:10Z

Note: we are also looking into the capabilities of CDN(Content Delivery Network). If properly setup, only essential requests (like the initial HTML page) will reach our WAF rules as requests.

Eric Schmitt2024-11-05T15:53:13Z
Rutt Lindström is seeking guidance on sourcing histochemical staining method codes, expressing challenges with existing references like SNOMED and LOINC. Despite some findings in LOINC, there is uncertainty about the completeness of methods available, prompting discussions about the necessity of local code systems due to gaps in available international codes.
15 comments
GO

I'm hoping to find someone who's active on laboratory/pathology front, and could propose a good source for histochemical staining method codes. A reference to a code system or a good example value set would be great. Also, if you happen to understand the content of the value set, I'd have some extra questions. :)
We have identified about half of what we need in SNOMED, but for some reason, they are often classified under hematological staining, and I'm not sure if it's correct to use them for histochemical staining.
We also browsed LOINC, and got lost relatively quickly. For SNOMED, we can add local codes, for LOINC, we cannot.

If you or someone you know has had recent encounter with this kind of content, please let me know. :)

Examples of what I'm talking about:

  • Mucicarmine stain method
  • Differentiated Giemsa stain method
  • Copper stain method
  • Alkaline phosphatase stain method
Rutt Lindström2023-08-11T10:52:28Z

@Andrea Pitkus, PhD, MLS(ASCP)CM?

Lloyd McKenzie2023-08-11T14:30:36Z

@Rutt Lindström I'm by no means an expert on all of the available staining techniques, but I do know a little about this in general. I would think that most (if not all) of what you are looking for would be available in LOINC (in the LOINC part codes used for METHOD_TYP). If it's not, I am a little surprised, but even if that's the case I think that the LOINC team would likely be quite amenable to adding whatever is missing. Have you checked with them about any of it?

Rob Hausam2023-08-11T19:53:56Z

Thank you, @Rob Hausam
We are struggling with LOINC. We don't maintain LOINC ourselves, only the observation concepts are translated, so we don't have a national browser/owner/user/maintainer for the rest of LOINC (the methods are in the Parts section as I understand).

We could not find everything in LOINC browser either, but our searching capabilities were below bar and there might be confusing synonyms, so we should probably try again.

So, if I would like to find all the staining methods they have, then what is the intelligent way of doing that? There must be a smarter way than this:
image.png

Rutt Lindström2023-08-11T20:31:54Z

@Rutt Lindström The LOINC hierarchy browser may also be of help. It doesn't quite provide the flexibility and views that I might have liked to see, but if you search the "Method" hierarchy for "stain", in the hierarchy of the results you will find the 'LP' codes for the stain methods (I think likely all of them) - which includes most of the examples that you gave (at least at some level), plus a lot of others. It doesn't quite provide a nice view of only the methods and their codes for the stain methods (unless I've missed something in the settings), but it may be a good start. To do more than that, then probably you would load the LOINC data into a database and write SQL queries (or the equivalent) against that.

Rob Hausam2023-08-11T20:51:39Z

Ha! I tried the hierarchy browser, but did not realise that I had to pick "Method" from the menu, so that's why it did not work for me.
Thank you for being patient and holding my hand here, @Rob Hausam . I'm a little smarter now.

I will export what I found, and see if my colleagues can sort it out and get some experts speak along to verify the content.

:hug:

Rutt Lindström2023-08-11T21:08:39Z

LOINC would not care about every detail regarding observation methods as its axis Method_Type implies. Its inclusion of a kind of method type depends on clinical relevance/significance. So in fact LOINC would not include every variant histochemical method but clinically important method types.

Lin Zhang2023-08-14T20:15:10Z

Literatures would help, such as:

Histochemistry: historical development and current use in pathology
https://pubmed.ncbi.nlm.nih.gov/23957702/

Lin Zhang2023-08-14T20:29:16Z

IMO, there is no exhaustive and up-to-date list for these methods.

Lin Zhang2023-08-14T20:32:10Z

Thank you, @Lin Zhang
The original request we got actually proposed a local code system, but we try not to create local codesystems when an international codesystem already contains requested content.
However, this looked borderline, and I think your last sentence confirmed it. :smile:

(@Grete Ojavere )

Rutt Lindström2023-08-15T06:28:22Z

@Rutt Lindström We are also starting to dig deeper how to implement this, how were your experiences? Did you find the additional staining techniques in LOINC?

Thomas Debertshäuser2024-11-06T15:27:02Z

I think we did not find everything we needed, but I hope @Grete Ojavere can share more :)

Rutt Lindström2024-11-06T17:37:43Z

For various methods, not limited to lab ones, LOINC focuses on method types of clinical significance only, but not down to every detailed levels of granularity method developers care about.

Lin Zhang2024-11-06T23:45:05Z

@Lin Zhang I suppose that depends on the scope. We are currently not trying to model the inner workings of a lab system, but to appropriately report IHC staining results as Observations as part of a report for research purposes only

Thomas Debertshäuser2024-11-07T10:00:17Z

In the end, we still made local codes because we couldn't find everything we needed, and we also got information from our pathologists that they don't use LOINC codes in their work

Grete Ojavere2024-11-08T06:48:50Z
synthea
#social
Jens Villadsen praised the Synthea team for their effective synthetic data generation tool, particularly highlighting the flexporter feature's usefulness. The conversation also addressed a colleague's feature request for loading JavaScript libraries into flexporter and provided guidance on finding a Docker image for quick Synthea setup.
15 comments
DH
CM

I just wanna give a big-axx salute to the synthea team for making an awesome tool for generating synthetic data that is easily extendable and without a sxxt-load of magic. You guys nailed it!

Jens Villadsen2024-09-09T09:46:16Z

Thanks @Jens Villadsen , we appreciate the praise, and we're glad you find it useful.

Jason Walonoski2024-09-09T13:17:44Z

Especially the flexporter feature is a nice addon

Jens Villadsen2024-09-09T13:20:16Z

@Jason Walonoski - btw - one of my colleagues asked if adding/loading js libs could be an option so that one could use js util functions for different cases upon generation in the flexporter

Jens Villadsen2024-09-09T14:01:56Z

@Jens Villadsen thanks for the kind words!
Re: flexporter support for loading JS libraries, this is something we've explored a little but it wasn't super user friendly and I wasn't sure how far down the rabbit hole to go at that point. Limited support does exist if things are in the right place but it's not currently exposed via the mapping file. https://github.com/synthetichealth/synthea/blob/master/src/main/java/org/mitre/synthea/export/flexporter/FlexporterJavascriptContext.java#L21

I just opened https://github.com/synthetichealth/synthea/issues/1505 for this feature request, please chime in with any thoughts or specifics you might want to see

Dylan Hall2024-09-09T14:57:12Z

Thats good enough for us to play around with. Perfect!

Jens Villadsen2024-09-09T16:02:39Z

Does anyone have a Docker image for synthea that I could use to spin up quickly? Im interested in learning how to use Synthea, but want to isolate its use to a container, if possible. Im new here, thanks for the help.

Justin2024-10-30T18:50:10Z

There are a few on GitHub that you could try

David Pyke2024-10-30T18:53:13Z

FWIW - the main branch should build w.o. any problems

Jens Villadsen2024-10-30T18:54:49Z

David Pyke said:

There are a few on GitHub that you could try

Thank you for your prompt response. Would you be able to point me to one? I tried looking earlier, just not sure what to search for on GitHub.

Justin2024-10-30T18:55:35Z

Chatgpt can help you wrap it in Docker if need be

Jens Villadsen2024-10-30T18:56:55Z

But you will need to deal with volume mounts or alike

Jens Villadsen2024-10-30T18:57:48Z

HEre is one that has what you need to build one: https://github.com/IndustrialDataops/Synthea-Docker

David Pyke2024-10-30T19:03:46Z

@WorldOnFHIR - I'm not aware of what you're trying to do, but you can also just download the run the Java jar file directly. It doesn't have any outside dependencies except Java, so really no need to isolate it unless you are trying to avoid installing Java on your machine (in which case I'd use a VM rather than Docker in this particular case). There are more hoops to jump through to change the config and get the output files out of a Docker container, I suspect.
https://github.com/synthetichealth/synthea/wiki/Basic-Setup-and-Running

Craig McClendon2024-10-31T13:23:47Z

@Justin sorry I missed this, I don't usually follow zulip closely. In case you're still working on this, we also have a "customizer" tool that can help you construct a dockerfile to run synthea in: https://synthetichealth.github.io/spt/#/customizer

Dylan Hall2024-11-06T14:40:03Z
new channels
#Announcements
Several new channels have been created, focusing on topics ranging from personal functioning and engagement to FHIR terminology and oncology enhancement. Notable contributors include Dave Hill with multiple PACIO-related channels, and others like Nikolai Ryzhikov and Grahame Grieve who introduced channels on specific health informatics subjects.
19 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

Jean Duteau created a new channel #Vulcan/OMOP.

Notification Bot2024-11-01T03:26:10Z

Dave Hill created a new channel #PACIO Standardized Medication Profile.

Notification Bot2024-11-01T18:55:28Z

Dave Hill created a new channel #PACIO Transitions of Care.

Notification Bot2024-11-01T18:57:34Z

Dave Hill created a new channel #PACIO Integration Track.

Notification Bot2024-11-01T18:59:45Z
Jörn Guy Süß sought assistance in configuring a HAPI starter instance with IPS, particularly for an R4 server, and asked for guidance on implementing modifications for Australian standards. After a collaborative discussion with others, he identified the necessary configurations and the process for integrating a bespoke Narrative Generator within the HAPI framework to meet his requirements.
16 comments
CM

I would like to configure a HAPI starter with IPS. Can anyone help me by providing either boilerplate or an explanation how to hook the config? There is the IPS Reference Server, but I cannot find the source and the server itself is down.

Jörn Guy Süß2024-10-29T00:07:33Z

which IPS version do you want?

Jose Costa Teixeira2024-10-29T04:54:12Z

ballot version? Or the current one, older?

Jose Costa Teixeira2024-10-29T04:54:22Z

We have an R4 server. And I guess as a basis I would like the current released version. Ultimately, we will have to modify the IPS for Australian standard. So if there is a recipe as to how to do that i.e. right modifications for the IPS processing that would also be welcome.

Jörn Guy Süß2024-10-29T10:18:19Z

i meant which version of the IPS.

Jose Costa Teixeira2024-10-29T11:57:06Z

ah sorry

Jose Costa Teixeira2024-10-29T11:57:11Z

current one

Jose Costa Teixeira2024-10-29T11:57:14Z

@Jörn Guy Süß It's documented somewhat differently in Smile CDR and HAPI, but HAPI covers the IPS capabilities in the JPA Server here and Smile CDR includes the configuration here.

Rob Hausam2024-10-29T20:58:03Z

Yes, I am aware of that documentation. I was looking to see a reference to the actual source files changed and implemented. This is an architecture description, not an implementation guide.

Jörn Guy Süß2024-10-30T04:06:11Z

@Jörn Guy Süß I don't think there is an implementation guide (not that I can recall, anyway). But it's pretty straightforward. This is what I actually have in my application.yaml file (which I last updated in May):

hapi:
  fhir:
    ### This enables the swagger-ui at /fhir/swagger-ui/index.html as well as the /fhir/api-docs (see https://hapifhir.io/hapi-fhir/docs/server_plain/openapi.html)
    openapi_enabled: true
    ### This is the FHIR version. Choose between, DSTU2, DSTU3, R4 or R5
    fhir_version: R4
    ### enable to use the ApacheProxyAddressStrategy which uses X-Forwarded-* headers
    ### to determine the FHIR server address
    #   use_apache_address_strategy: true
    ### forces the use of the https:// protocol for the returned server address.
    ### alternatively, it may be set using the X-Forwarded-Proto header.
    #   use_apache_address_strategy_https: false
    ### enables the server to host content like HTML, css, etc. under the url pattern of /static/**
    ### the deepest folder level will be used. E.g. - if you put file:/foo/bar/bazz as value then the files are resolved under /static/bazz/**
    #staticLocation: file:/foo/bar/bazz
    ### enable to set the Server URL
    server_address: https://fhir.hausamconsulting.com/r4
    #    defer_indexing_for_codesystems_of_size: 101
    #    install_transitive_ig_dependencies: true
    #implementationguides:
      ###    example from registry (packages.fhir.org)
      #      swiss:
      #        name: swiss.mednet.fhir
      #        version: 0.8.0
      #      example not from registry
    #  ips_1_1_0:
    #    url: https://build.fhir.org/ig/HL7/fhir-ips/package.tgz
    #    name: hl7.fhir.uv.ips
    #    version: 1.1.0
    #    supported_resource_types:
    #      - Patient
    #      - Observation
    ##################################################
    # Allowed Bundle Types for persistence (defaults are: COLLECTION,DOCUMENT,MESSAGE)
    ##################################################
    #    allowed_bundle_types: COLLECTION,DOCUMENT,MESSAGE,TRANSACTION,TRANSACTIONRESPONSE,BATCH,BATCHRESPONSE,HISTORY,SEARCHSET
    #    allow_cascading_deletes: true
    #    allow_contains_searches: true
    #    allow_external_references: true
    #    allow_multiple_delete: true
    #    allow_override_default_search_params: true
    #    auto_create_placeholder_reference_targets: false
    cr_enabled: true
    ips_enabled: true
    #    default_encoding: JSON
    #    default_pretty_print: true
    #    default_page_size: 20
    #    delete_expunge_enabled: true
    #    enable_repository_validating_interceptor: true
    #    enable_index_missing_fields: false
    #    enable_index_of_type: true
    #    enable_index_contained_resource: false
    ###  !!Extended Lucene/Elasticsearch Indexing is still a experimental feature, expect some features (e.g. _total=accurate) to not work as expected!!
    ###  more information here: https://hapifhir.io/hapi-fhir/docs/server_jpa/elastic.html
    advanced_lucene_indexing: true
    bulk_export_enabled: false
    bulk_import_enabled: false
    #    enforce_referential_integrity_on_delete: false
    # This is an experimental feature, and does not fully support _total and other FHIR features.
    #    enforce_referential_integrity_on_delete: false
    #    enforce_referential_integrity_on_write: false
    #    etag_support_enabled: true
    #    expunge_enabled: true
    #    client_id_strategy: ALPHANUMERIC
    #    fhirpath_interceptor_enabled: false
    #    filter_search_enabled: true
    #    graphql_enabled: true
    narrative_enabled: false
    #    mdm_enabled: true
    #    local_base_urls:
    #      - https://hapi.fhir.org/baseR4
    mdm_enabled: false
    #    partitioning:
    #      allow_references_across_partitions: false
    #      partitioning_include_in_search_hashes: false
    cors:
      allow_Credentials: true
      # These are allowed_origin patterns, see: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/cors/CorsConfiguration.html#setAllowedOriginPatterns-java.util.List-
      allowed_origin:
        - "*"

As it appears (and as far as I recall at the moment), the ips_enabled: true was all that I needed. It is time for me to do an update and refresh on my server, though, so when I do I can see if there is anything else that is needed or anything that has changed.

Rob Hausam2024-10-30T20:27:38Z

Thanks, I have found that switch. I was looking after where I would best inject the beans to configure the rendering toolchain shown in the architecture. If you come across that information, that would be greatly appreciated.

Jörn Guy Süß2024-10-31T00:22:32Z

Not sure if this is what you are looking for, but from here you can chase down the classes/beans that are registered and find the source code in the parent HAPI project:
https://github.com/hapifhir/hapi-fhir-jpaserver-starter/blob/master/src/main/java/ca/uhn/fhir/jpa/starter/ips/StarterIpsConfig.java

Craig McClendon2024-10-31T13:44:42Z

@Jörn Guy Süß If what Craig posted doesn't fully answer it, maybe you can clarify further what you are needing/wanting to do with configuring the rendering toolchain?

Rob Hausam2024-10-31T14:36:08Z

I want to replace a Narrative Generator so it shows sections that are unique to AU-specific patients. This is towards implementing https://build.fhir.org/ig/HealthIntersections/au-ips/ on HAPI.

Jörn Guy Süß2024-11-01T04:23:50Z

If I create a class that implements these, where do I (best) hook the bean in the hapi starter overlay?

Jörn Guy Süß2024-11-01T04:25:17Z

Belay that, this is autowired(!). I am on my way. Thank you. This was fantastic help.

Jörn Guy Süß2024-11-01T04:26:22Z
Agenda for Today's Meeting
#analytics on FHIR
The meeting agenda includes discussions on progress for Milestone #1, updates on specific TODOs, and planning for upcoming events, with a focus on subgroup organization and FHIR Community Process requirements. Participants will also reflect on last week's conference and outline priorities for the remainder of the year.
14 comments
AS

https://zoom.us/j/94516094652?pwd=Sk01NzBiMDdSTjRoSVFYemFYWlFiUT09
Meeting ID: 945 1609 4652
Passcode: 215929

Agenda:

Arjun Sanyal2024-05-28T18:09:27Z

Agenda for today's meeting:

  • Review progress on TODOs: optional keyword, update testing page, example collection, open type for constants?, FCP process
  • Functional model in spec
  • FHIR Analytics Mini-conf: contributions
Arjun Sanyal2024-08-06T16:17:14Z

I had a chance to review the FHIR Community Process Requirements v1 document which looks like the most current official source and agree with @John Grimes 🐙 from our last call that the requirements would not be difficult for us to meet.

The main non-tactical question I have is around the concept of "FCP Participant".

The reqs state that any entity including "individual" can become a participant (FCP101) and also states that "any registration information e.g. business/company registration details" (FCP102) shall be provided.

Since we are currently organized as a loose group of volunteers (some of whom work for companies with commercial interests) what should be our form of organization?

Is it recommended or required our group "register" in some sense?

Let's discuss on the call today. Thx!

cc: @Josh Mandel @Grahame Grieve

Arjun Sanyal2024-08-06T17:48:49Z

Zoom link:

https://zoom.us/j/94516094652?pwd=Sk01NzBiMDdSTjRoSVFYemFYWlFiUT09
Meeting ID: 945 1609 4652
Passcode: 215929

Arjun Sanyal2024-08-06T17:49:57Z

Sorry guys, I will skip today meeting

Nikolai Ryzhikov 🐬2024-08-06T18:32:36Z

Possible agenda for today's meeting:

  • Brief updates on spec todos
  • Constants discussion
  • Carl's OMOP topics
  • [your agenda item here]
Arjun Sanyal2024-08-13T16:50:17Z

We will also have @Kiran Ayyagari dropping in to tell us about Safhire.

John Grimes 🐙2024-08-13T18:52:54Z

Agenda for today's call (3pm ET)

  • review outstanding items to finalize Milestone 1
    • qa issues
    • publishing logistics
    • release announcement and publicity
  • review outstanding items for event
    • event site
    • order preferences
    • help with talks, slides, demos
  • subgroup organization / next steps

Zoom link:
https://zoom.us/j/94516094652?pwd=Sk01NzBiMDdSTjRoSVFYemFYWlFiUT09
Meeting ID: 945 1609 4652
Passcode: 215929

Arjun Sanyal2024-10-01T15:48:18Z

During a review noted a couple of typos with case on Resource type.
https://github.com/FHIR/sql-on-fhir-v2/pull/262

Brian Postlethwaite2024-10-01T22:55:22Z
  • review outstanding items to finalize Milestone 1
    • qa issues
    • release deployment
    • release announcement and publicity
  • review outstanding items for event
    • event site
    • help with talks, slides, demos
  • subgroup organization / next steps

Zoom link:
https://zoom.us/j/94516094652?pwd=Sk01NzBiMDdSTjRoSVFYemFYWlFiUT09
Meeting ID: 945 1609 4652
Passcode: 215929

Arjun Sanyal2024-10-08T15:21:31Z
  • Prep for next week's event!

Zoom link:
https://zoom.us/j/94516094652?pwd=Sk01NzBiMDdSTjRoSVFYemFYWlFiUT09
Meeting ID: 945 1609 4652
Passcode: 215929

Arjun Sanyal2024-10-22T17:58:56Z

Trying to connect to the meeting - having some technical difficulties.

Carl Anderson2024-10-22T19:20:29Z

Hi all! Agenda for today's meeting:

  • Recap and reflections from last week's conference
  • What's next? Where should we be focusing next?
  • Planning for the rest of the year and into next

Zoom link: https://zoom.us/j/94516094652?pwd=Sk01NzBiMDdSTjRoSVFYemFYWlFiUT09
Meeting ID: 945 1609 4652
Passcode: 215929

Arjun Sanyal2024-11-05T16:04:41Z

And Eastern daylight time has started, so its not for another hour - I got up too early!

John Grimes 🐙2024-11-05T19:06:26Z
Powered by Health Samurai | 2022