Repository navigation
Releases: FerroHEALTH/FerroBRIDGE
Release list
0.0.14
The EU profile release. FHIRconnect contexts round-trip the HL7 Europe Base
and Core medicalTestResult-eu-core, the Laboratory Report
Composition-eu-lab and the Medication Prescription and Dispense profiles,
and the facade answers Composition/$document. The eehrxf crate, the
European interoperability software component, moves here from FerroFED, its
canonical URLs move to ferrobridge.eu, and HL7's FHIR Validator checks the
documents its suites write. The server and the operator console run on the
FerroSYS crates, with config check, healthcheck, the family's [server]
keys and GET /operator/readiness. The facade and $tofhir give every
resource, created ones included, one deterministic id, which is a breaking
change for stored ids. The CDR client reads RFC 9457 problem details, and
every error outside the FHIR routes is one. Each release now attaches the EHR
system's information sheet and instructions for use.
The library crates publish at fhirconnect 0.1.206, ferrobridge-term
0.1.141, ferrobridge-validator 0.1.141, ferrobridge-hl7v2 0.1.164,
openehr-mapping-core 0.1.135 and eehrxf 0.1.131, and fhir-types
0.1.128, ferrobridge-fhirpath 0.1.128 and hl7v2-types 0.1.127 stay where
they are. A crate version an entry below names is the step at which that
change came in.
Added
Composition/$documenton the FHIR facade (#116, the R4 operation
Composition-document).GET /fhir/Composition/{id}/$document, and
GET /fhir/Composition/$document?id={id}, answer a document Bundle: an
identifier derived from the composition version, the assembly timestamp,
the Composition first and then every resource its context's outbound run
creates, each with its read URL asfullUrl. The caller needs read on every
type the document carries.persist=trueandgraphare refused with an
OperationOutcome, and the operation is declared onCompositionin the
CapabilityStatement. The facade now binds a context whose start is a
composition model, such asComposition-eu-lab, to the composition itself.- The HL7 Europe Laboratory Report 2.0.0
Composition-eu-labround trip
(#116). A FerroBRIDGE document context starts at the report composition of
the publishedKDS_Laborberichttemplate and maps it to a
Composition-eu-lab: status, identifier, date, author, the LOINC 11502-2
type and a title, and one section that carries the test's code and
references theDiagnosticReport-eu-lab, which references its results and
specimens. The document's report reads its status and identifier out of
openEHR, because the Composition writes those nodes going in. - The HL7 Europe Base and Core 2.0.0
medicalTestResult-eu-coreround
trip (#116). A FerroBRIDGE context maps the laboratory test result of the
publishedKDS_Laborberichttemplate to amedicalTestResult-eu-core
Observation, with its category, code, effective time, status and report
identifier, and each analyte as a memberObservation-resultslab-eu-lab
it references. The result's status travels through the codes the R4
diagnostic-report-status and observation-status code systems share. - The HL7 Europe Medication Prescription and Dispense 1.0.0 round trip
(#116). Two FerroBRIDGE contexts map FerroBRIDGE's medication template, an
ADL 2 template over seven published CKM archetypes, to
MedicationRequest-eu-mpdandMedicationDispense-eu-mpd, each with a
referencedMedication-eu-mpdand the dosage as aDosage-eu-mpd; the
dispense is the medication ACTION at its careflow step "Prescription
dispensed".scripts/vendor/ckm-medication.shvendors the archetypes at
the CKM mirror commitdocs/VERSIONS.mdpins, and the suites build the
operational template at test time.fhirconnect0.1.196 (withferrobridge-hl7v20.1.152 andopenehr-mapping-core0.1.131) takes
openehr-adlas a test dependency, and the bridge moves to the
openehr-*crates at 0.0.100, whose ADL 2 Web Template builder reads the
ADL 1.4 term constraints of the CKM sources. - The EHDS readiness page in the book (#116). It states the legal status
plainly: Regulation (EU) 2025/327 names the six priority categories, the
implementing act that fixes the exchange format is not adopted, and the HL7
Europe guides are the current proxy, so nothing is a conformance claim. Its
readiness matrix lists, per category, each target profile with its
committed template and the round-trip test that proves the transform, and
records the patient summary Composition, imaging and discharge reports as
corpus gaps. Afhirconnecttest generates the matrix from
docs/ehds/readiness.tomland fails when a template, a context or a test it
names is gone.fhirconnect0.1.198 (withferrobridge-hl7v20.1.153)
takestomlas a test dependency. ferrobridge config checkandferrobridge healthcheck(#1260), the
FerroHEALTH family's subcommands fromferrohealth-server.config check
prints the running configuration one key per line with where each value
came from and every secret as***, then resolves it asservedoes and
exits 78 with every refusal on stderr.healthcheckasks the running
server for/health/readinesson loopback and exits 0 only on200, and
the image declares aHEALTHCHECKthrough it. Every subcommand takes
--set key=value, applied over the file and the environment.$tofhiranswers one resource per occurrence of a repeated start
archetype (#1271). A composition holding two diagnoses answers two
Conditions under oneProvenance, each with a stable id derived from the
composition and its occurrence, and an occurrence the context's condition
does not admit is counted in theOperationOutcome. The identity seam's
request names the occurrence, and two resources taking one id refuse the
call.- Each release attaches the EHR system's information sheet and
instructions for use. The EHR system Cadasto B.V. declares under the
EHDS is FerroEHR with FerroBRIDGE, and both documents are pages of the
FerroHEALTH book. The release lane takes them at the FerroHEALTH commit
docs/ehds/system-documents.envpins, refuses a page whose revision
differs from the pin, and attachesferrobridge-<tag>-information-sheet.md
andferrobridge-<tag>-instructions-for-use.mdwith the release's facts
appended: the system version, the release date (EHDS Art. 38(2)(b)) and
the versions of the standards FerroBRIDGE supports (Art. 38(2)(e)). The
release notes name the pinned revision of each system page (#1279). ferrobridge-hl7v2sends over MLLP (#1281).mllp::sendopens a
connection within a connect timeout, writes one message as one MLLP frame
and returns the one reply frame within a reply timeout, bounded by the
codec's ceiling. A refused connection, either timeout, a peer that closes
before or inside its reply, and a reply past the ceiling are each their own
SendErrorvariant, and none carries the message or the reply. FerroPIX
sends its ITI-10 notifications through it.- The family's
[server]keys (#1287):base_path,
header_read_timeout_ms,drain_delay_ms,max_concurrent_requests,
retry_after_s,trusted_proxies,forwarded_header,compression,
compression_min_bytesand[server.tls], and[telemetry] environment. GET /operator/readinessbehind the operator scope: the readiness
document with why each indicator is down, which the open route no longer
names. The operator console reads it, and falls back to the open route
while the operator API is off (#1287).- The
eehrxfcrate, the European interoperability software component of
an EHR system under Regulation (EU) 2025/327 (Art 2(2)(n), Art 25(1)),
joins the crate line at 0.1.128. It moves here from the FerroHEALTH
federation gateway, where it was built up to 0.0.40 and never published,
so its earlier history is that project's changelog. It carries the
format-neutral dataset model read from the Xt-EHR EHDS Logical Information
Models, one feature per Art 14(1) category with its crosswalk to the HL7
Europe profiles, the exchange format in FHIR R4 (fhir-r4), and the
mapping between openEHR and that format throughfhirconnect
(openehr). Against 0.0.40 its one change of behaviour is the id of a
resource mapped from a composition, which is now the FHIRconnect
deterministic idfhirconnect0.1.203 derives from the composition's uid
and the entry path (FHIRconnect v1.0.0, engine/id-management.adoc,
Deterministic IDs). The corpora its tests read are vendored by
scripts/vendor/eehrxf.sh, and the book gains the component's pages: the
component, the category crosswalks and receiving a document (#1314). - HL7's FHIR Validator checks the documents the
eehrxfsuites write. The
CIfhir-validatorjob runs it offline over every patient summary document
the suites emit underEEHRXF_EMIT_DIR, against the HL7 Europe Patient
Summary and Base and Core profiles and the MyHealth@EU Master Value Sets
Catalogue. It fails on an error, a fatal issue or a claimed profile it
could not find, and keeps its results as theeehrxf-fhir-validation
artifact (scripts/checks/fhir-validator.sh) (#1318). - The CDR client reads RFC 9457 problem details. A CDR that answers its
refusals asapplication/problem+jsonkeeps its explanation on the facade:
the problem'stitle,detail, eacherrorsviolation aspath: detail,
and itstypereach theOperationOutcomediagnostics, as a
{message, validationErrors}body still does. The composition and
contribution writes already sendPrefer: return=representation, so a CDR
that lists violations only for such a write lists them (#1334). - The run report of
etl fhircarries an element ledger (#408): per input
resource, every element with a value and one of four outcomes.mapped
names the openEHR node a ...
0.0.13
The security and OMOP release. A write the facade makes for an authenticated
caller states that caller as its committer, and [auth] mode = "introspection" checks opaque access tokens (RFC 7662). On the OMOP side,
etl fhir loads FHIR R4 into the CDM with no CDR and every row names its
resource, vocab load loads an Athena download, the OMOCL targets write
DEATH, provider_id and visit_detail_id, [cdm.pseudonymisation]
pseudonymises source identifiers and shifts dates, and the Data Quality
Dashboard's conformance, completeness and temporal plausibility checks run in
Rust through dq check. The derived tables keep another ETL's rows, the CDM
pool trusts the configured CA alone, FHIRconnect converts DV_ORDINAL and
writes an ACTION's time, and the first HL7 Europe profile contexts arrive.
The library crates publish at fhirconnect 0.1.192, ferrobridge-term
0.1.136, ferrobridge-validator 0.1.136 and ferrobridge-hl7v2 0.1.146, and
fhir-types 0.1.128, openehr-mapping-core 0.1.128, ferrobridge-fhirpath
0.1.128 and hl7v2-types 0.1.127 stay where they are. A crate version an
entry below names is the step at which that change came in.
Added
-
Every CDM row
etl fhirwrites names the FHIR resource it was mapped from
(#409): the bridge schema'sresource_origintable records each
composition's resource type, id andmeta.versionIdin the commit's
transaction, andCdmWriter::origins_of_rowandrows_of_resourcelook a
row's resources and a resource's rows up.cdm initadds the table. -
ferrobridge_eu_laboratory.contexttargets HL7 Europe Laboratory Report
2.0.0 over the publishedKDS_Laborberichttemplate: the laboratory
result becomes aDiagnosticReport-eu-labthat references one
Observation-resultslab-eu-labper analyte and oneSpecimen-eu-labper
specimen. The round trip asserts each profile's canonical and elements:
the report's identifier, status, code, effective time, conclusion and
references; the result's status,laboratorycategory, code, quantity,
interpretation and method; the specimen's type, accession identifier,
received time and collection. The mapping library'seehrxf_labcontext
is recorded as refused (#1235). The testkit exposes the template as
KDS_LABORBERICHT_OPT(#116). -
ferrobridge-term0.1.135 takes the client credentials token of
ferrohealth-smartas itsTokenProviderbehind the newsmartfeature
(#1227):smart::SmartToken, built from aTokenSource, sends the cached
token and drops one the server refuses with401, so the repeated request
carries a token fetched anew. The server's terminology lane uses it in
place of its own adapter.ferrobridge-hl7v20.1.144 and
ferrobridge-validator0.1.135 move with it. -
The first HL7 Europe profile context:
ferrobridge_eu_condition.context
targets Base and Core 2.0.0condition-eu-coreover the published
KDS_Diagnosetemplate, with the published diagnosis, qualifier and
composition model mappings and FerroBRIDGE's extensions for the profile's
assertedDateextension andonsetDateTimeslices and its canonical. The
round trip asserts the code, both slices,clinicalStatusand
verificationStatus(#116). -
ferrobridge mapping check --vocabularychecks every literal concept id of
the OMOCL files against the vocabulary loaded in the[cdm]database: a
literal the vocabulary does not hold, or whose domain is not one the CDM
field definitions name for its column, is a diagnostic (#97). -
ferrobridge_eu_patient.contexttargets HL7 Europe Base and Core 2.0.0
patient-eu-coreover the publishedKDS_Persontemplate, loading the
person chain of the KDS person context with a gender extension that names
the EU profile in place of the MII one and leaves out the German
gender-amtlich extension. The round trip asserts the requirednameand
birthDate,genderand the canonical (#116). -
The profile package set pins
hl7.fhir.eu.laboratory2.0.0 and
hl7.fhir.eu.mpd1.0.0, the HL7 Europe Laboratory Report and Medication
Prescription and Dispense guides the EU profile contexts target, fetched
with their provenance byscripts/vendor/profile-packages.sh; every
package they depend on was already in the set (#116). -
The Data Quality Dashboard's seven temporal plausibility checks run in Rust
beside its conformance and completeness checks (#1222):
measureObservationPeriodOverlap,plausibleTemporalAfter,
plausibleDuringLife,withinVisitDates,plausibleAfterBirth,
plausibleBeforeDeathandplausibleStartBeforeEnd, each planned where the
Dashboard's v2.9.0 settings enable it, with its threshold, and translated
from its SQL template, whichscripts/vendor/dqd.shnow vendors.
dq checkand the post-load step ofetl runreport them. A person whose
year of birth is 0, as a placeholderPERSONrow carries, has no birth date
for these checks instead of failing them. -
[cdm.pseudonymisation]pseudonymises every row the CDM writer writes
(#410): the columns the CDM field definitions describe as a link back to the
source carry an HMAC-SHA-256 pseudonym under a_filesecret key, stable
across runs so incremental loads join, the provider's name,npianddea
and a location's address are NULL, anddate_shift_daysmoves every date
of a person by one per-person shift, so intervals within a person stay
intact. The Integrate and Operate pages state what it does not de-identify. -
cdm initand everyetl runandetl fhircount the rows of each CDM
table whose ids the bridge assigns that no entry of its side table owns,
rows another load wrote, and warn of each table; the run report carries the
counts asforeign_rows(#240). The Operate page states that one bridge owns
the tables it writes and that era ids are not stable across rebuilds. -
ferrobridge-hl7v20.1.143 serves a consumer of its listener and parser
alone.parse::structure::structure_declaredselects the structure
MSH-9.3 names over the message definition where the two disagree, so an
IHE ITI-8ADT^A05^ADT_A01groups by the A01 structure (IHE ITI TF-2
§3.8.4.1.2.1; HL7 v2.5.1 chapter 2 §2.15.9.9) (#1217).
parse::ErrorCode::UnknownKeyIdentifieris table 0357's204(#1218).
mllp::Connection::peergives a handler the address of its connection's
peer (#1220).mapand its dependencies (fhirconnect,
ferrobridge-term,fhir-typesand the openEHR crates) sit behind the
defaultmapfeature, sodefault-features = falsedrops them (#1221).
A consumer that matchesErrorCodeexhaustively adds the new variant. -
A write the facade makes for an authenticated caller states that caller as
the version's committer, as ITS-REST 1.1.0 recommends ("provision these
headers based on authentication and authorization runtime data"): a
single write sendsopenehr-audit-detailswithcommitter.nameset to the
token'ssub(or the Basic user-id) and acommitter.external_refin the
issuer's namespace, and a transaction states the same committer in every
UPDATE_AUDITof its CONTRIBUTION.system_idkeeps naming the bridge.
A write no caller made (an HL7 v2 message, an open surface) still commits
under the bridge's name. Reads still reach the CDR under the bridge's own
credential (#532). -
[auth] mode = "introspection"with an[auth.introspection]table
checks opaque access tokens by OAuth 2.0 Token Introspection (RFC 7662)
throughferrohealth-smart's introspector: each token is posted to the
issuer's introspection endpoint under the bridge's client authentication
([auth.introspection.client]) or a client credentials token
([auth.introspection.bearer]), an active answer withscope,
client_idandexpadmits the caller with its scopes andpatient
context, the answer is held until itsexpand at most
cache_max_age_seconds, an inactive token answers401and an endpoint
that fails503(#533). The Operate configuration page lists the keys. -
ferrobridge etl fhir PATHloads FHIR R4 resources, a Bundle or an NDJSON
file, into the CDM with no CDR (#1209, decided on #407): each resource maps
through the FHIRconnect set into an openEHR composition held in memory,
which the OMOCL set maps to CDM rows the writer commits. The composition's
identifiers derive from the resource's type, id,meta.versionIdand
subject, so a re-run writes the same rows, and the run report counts the
resources read, mapped, unmapped and refused.[etl] aqlbecomes optional
at load;etl runrefuses to start without it. -
ferrobridge vocab load DIR --schema NAMEloads an OHDSI Athena vocabulary
download into the vocabulary tables of the CDM schema (#233). It takes the
nine files every download carries andSOURCE_TO_CONCEPT_MAP.csvwhen
present, replaces each table in a transaction of its own throughCOPY
with the column list from the header row checked against the CDM
definitions, names every other file and leaves it alone, and prints the
rows per table and the vocabulary version. The format is the one the Athena
application writes, read from its source at a pinned commit and vendored
underdocs/specs/athena/byscripts/vendor/athena.sh(#88). The Operate
pages describe the load and the vocabulary licences you accept. -
FHIRconnect converts
DV_ORDINALagainstCodeableConcept
(DV_ORDINAL.adoc§CodeableConcept, #93): the coding carries the symbol,
and going into openEHR the ordinal value is the one the template's
C_DV_ORDINALlists for the symbol's code. A symbol the template does not
list, or a node whose template lists no options, is refused.
fhirconnect0.1.191 addsRmValue::Ordinal,lens::ordinaland a
fifth parameter tocell::put, the node's ordinal options; a caller of
cell::putpasses&[]where it has none. -
An OMOCL mapping's
provider_idand `visit_detail_id...
0.0.12
The FHIRconnect and facade outcomes release. A write through the facade now
shows the client the losses its mapping declared, a transaction names why it
refuses a linked resource, and the FHIRconnect operations answer 502 when
the terminology server fails. FHIRconnect looks up the display of a DV_TEXT
that fell back to a code, ranks a direct data-type pair above the text
fallback, and openehr-mapping-core exposes the DV_ORDINAL options a
template constrains. The fhir-types XML codec holds the narrative div to
well-formed XHTML both ways. The terminology client gains $expand,
$subsumes, the date input, a caller-built HTTP client for mutual TLS or a
private trust root, and context-aware $validate-code, and the operator
console draws the running configuration.
The library crates publish at fhir-types 0.1.128, openehr-mapping-core
0.1.128, fhirconnect 0.1.190, ferrobridge-term 0.1.134,
ferrobridge-validator 0.1.134, ferrobridge-fhirpath 0.1.128 and
ferrobridge-hl7v2 0.1.141, and hl7v2-types stays at 0.1.127. A crate
version an entry below names is the step at which that change came in.
Added
WebTemplateIndex::ordinal_optionsreturns the options an OPT 1.4
C_DV_ORDINALconstrains at aDV_ORDINALnode, in template order: each
OrdinalOptioncarries the ordinalvalueand the code and terminology
of its symbol, and a node with no ordinal constraint answersNone.
openehr-mapping-coremoves to 0.1.127,fhirconnectto 0.1.186 and
ferrobridge-hl7v2to 0.1.135 with it (#1090).- The facade shows a write's declared losses to the client that wrote it: a
committed transaction entry carries them inresponse.outcome, and a
single create or update asked forPrefer: return=OperationOutcomelists
them after the committed version, one issue per loss with the FHIRPath in
expressionand the openEHR path indetails(#1115). GET /operator/configurationanswers the configuration the bridge started
on, behind[operator]and the operator scope like the other operator
routes: every key with its value and its source (the file, the
environment or the default), and each secret by reference alone (set,
read from a file, or unset), never its value. The document is
ferrobridge_operator_api::configuration::Configuration, which the
operator console decodes (#1147).- The operator console draws the running configuration: a Configuration
page with the Logging, Mappings and Server and access tabs, a Settings tab
on the FHIR facade, HL7 v2, the OMOP ETL and each connection, and the
host and credentials of each upstream in the Connections table. Every
value is read-only, with its TOML key and whether it came from the
environment or is the default, and every secret is shown by reference
alone; How configuration works opens from the line that names the file.
An empty[auth] product_scopeis answered as the scope the bridge runs
on,__ferrobridge.operator(#1147). hl7v2-types(Apache-2.0) andferrobridge-hl7v2(BUSL-1.1) join the
crate line at 0.1.127, leaving their 0.0.0 name reservations, so the next
publish ships the HL7 v2 tables and the HL7 v2 face (MLLP framing, MSH-18
decoding, the positional parser, the acknowledgment and the v2-to-FHIR
map) on crates.io for other projects to depend on. Each README carries a
worked example, and the entry points offerrobridge-hl7v2carry tested
# Examples. Pin each exactly, as for every crate of the line (#1131).ferrobridge-term0.1.130 sendsValueSet/$expandand
CodeSystem/$subsumes, on STU3, R4 and R4B and in abatch.
Client::expandtakes anExpansion(url,valueSetVersion,date,
filter,offsetandcount,includeDesignations) and answers the
expanded value set with the nesting ofexpansion.containskept, each
entry with its system, version, code, display,abstract,inactiveand
designations; a value set the server does not know is
ExpandOutcome::NotFoundcarrying theOperationOutcomeand its
tx-issue-type, and an expansion the server could not make is a refusal,
never an empty expansion.Client::subsumesanswersSubsumesOutcome:
Equivalent,Subsumes,SubsumedByorNotSubsumed.
Client::code_system_countasks
GET [base]/CodeSystem?url=<system>&_summary=count.ferrobridge-validator
moves to 0.1.130 andferrobridge-hl7v2to 0.1.128 with it (#1177).ferrobridge-term0.1.131 reaches a terminology server through an HTTP
client the caller builds:Client::with_http(config, reqwest::Client)
sends every request through it, so a deployment can present a client
certificate for mutual TLS, trust a private root beside the platform's or
use a proxy. The configured timeout still bounds each request, and the
credentials, the retry budget and the typed errors apply as for
Client::new(#1180).ferrobridge-term0.1.131 validates a code whose system its context
implies:Coded::InContextsendsValueSet/$validate-codewith
context,codeanddisplayand nosystem, which R4 and R4B accept
("If a code is provided, a system or a context must be provided"), alone
or in abatch. STU3 requires a system for a code, so an STU3 client
refuses the form with the newError::SystemRequiredand sends nothing,
andClient::checkanswers the same (#1181).ferrobridge-validator
moves to 0.1.131 andferrobridge-hl7v2to 0.1.129 with it.
Changed
fhirconnect0.1.188 movesengine::rm::NULL_FLAVOUR,NULL_REASONand
null_flavour_oftoengine::rm::null_flavour, which breaks an import of
them: name them throughengine::rm::null_flavour::(#1194).- A transaction entry whose mapping links a resource as a composition of its
own is refused with422andnot-supported, naming why and the ways that
commit it: the resource on its own, or as an entry of abatch, whose
entries commit one at a time and follow the link as a single create does
(#1120). ferrobridge-term0.1.130 carries thedateinput ofCodeSystem/$lookup
andValueSet/$validate-code:Client::lookup_atsends it, and
Request::LookupandValidationgain adatefield. This breaks a
struct literal of either: adddate: Nonewhere no date is meant (#1177).SECURITY.mdstates the fix-time targets every product of the Ferro family
commits to, counted from the confirmed assessment: a fixed release within
7 days for a Critical vulnerability, 30 days for High, 90 days for Medium
and with the next release for Low, beside the acknowledgement within about
5 business days and the initial assessment within about 10, both best
effort as before.
Fixed
- The
fhir-typesXML codec holds a narrativedivto well-formed XHTML
both ways:xml::to_xmlrefuses adivthat is no well-formed XHTML
divin the XHTML namespace with anEncodeErrornaming its element path,
such asBasic.text.div, andxml::from_xmlrefuses a start tag whose
attributes are not well-formed XML (no whitespace between two attributes,
a name that is no XML name, a<in a value), in the narrative and in
every other element, where it accepted them and wrote them back repaired.
fhir-typesmoves to 0.1.128,fhirconnectto 0.1.189,
ferrobridge-termandferrobridge-validatorto 0.1.134,
ferrobridge-fhirpathto 0.1.128 andferrobridge-hl7v2to 0.1.140 with
it (#1178). - A coding with no
displaywritten into aDV_TEXT, whose value would
otherwise fall back to the coding's code, is looked up through
CodeSystem/$lookupas one written into aDV_CODED_TEXTis: the display
becomes the value, an unknown code refuses unless
[terminology] display_fallbackis set, a failed call refuses, and with no
server the code stands.fhirconnectmoves to 0.1.185 and
ferrobridge-hl7v2to 0.1.134 with it (#1188). - An untyped
dateTimemapped onto anELEMENTwhose value admits
DV_TEXTandDV_DATE_TIMEconverts intoDV_DATE_TIMEwhatever the
template order: a class that pairs with the FHIR type directly outranks
the text fallback.fhirconnectmoves to 0.1.181 andferrobridge-hl7v2
to 0.1.130 with it (#1114). $toopenehrand$tofhiranswer502with the issue typetransient
when the terminology server fails during the run, with the upstream status
in the diagnostics, as the facade's writes do. A translation the server
answers with no match stays a422(#1119).
Support period
Only the newest release is supported. When a new release is published, every earlier release stops receiving fixes: there are no maintenance branches, no long-term-support line and no backports. If you are not on the newest release, upgrade; upgrading is free. Under the Cyber Resilience Act, Cadasto B.V. commits to keep publishing security fixes for at least five years after each release (Art 13(8)) and ships them only in the newest release (Art 13(10)). For this release that commitment runs until the end of October 2031 (Regulation (EU) 2024/2847 Art 13(19)); see SECURITY.md.
Information and instructions to the user (CRA Annex II)
CRA information and instructions to the user for v0.0.12: the manufacturer, the vulnerability contact, the support period, secure use, updates and decommissioning (Regulation (EU) 2024/2847 Art 13(18) and Annex II).
0.0.11
The operator console release. The console is rebuilt page for page on
FerroUI 0.3.6 and renamed from ferrobridge-viewer to ferrobridge-console,
so its image, environment variables, compose profile, cookies and page
addresses change: the Changed section below lists each, with what an
operator changes. Release images are scanned before they are tagged, every
release carries a vulnerability record in which each finding is judged, and
the notes state the support period and link the CRA information for users.
FHIRconnect registers the last mappingCode functions of the published
library and gains display resolution, NULL_FLAVOUR, the EVENT choice and
the quantity, temporal, URI, string and interval data-type pairs.
Added
-
The book has a CRA information for users
page (#1152): the information and instructions Annex II of the Cyber
Resilience Act (Regulation (EU) 2024/2847) has accompany each release,
point by point, from the manufacturer and the vulnerability contact to the
support period, secure use, updates, decommissioning and the SBOMs. The
release notesscripts/release/plan.shcomposes now end with a link to it,
and the composition refuses when the book does not list the page.
SECURITY.mdnames the operator console's release tarballs and site
bundle among the supported artefacts. -
The eighth
mappingCodefunction of the published FHIRconnect library,
ehrStatusAddExternalREF, is registered (#1065), so
KDS_admin_entry_person.ymlloads in the published person context. It
writes no template node: it offers eachIdentifierthe mapping reads as
the subject of the EHR, on the newOutcome::subjectchannel
(fhirconnect::engine::subject::SubjectIdentifier), and coming out of
openEHR it is declared skipped (SkipReason::EhrStatusSubject). The
facade writes it intoEHR_STATUS.subject.external_refthrough ITS-REST
1.1.0ehr_status_updatewithIf-Matchon the version it read, before
the composition is committed, for the identifier of the new
[facade] ehr_status_identifier_systemkey. AnEHR_STATUSthat names
another subject answers409, a CDR refusal answers through the status
table with nothing committed, and with the key unset a write whose mapping
offers identifiers answers422naming the key. New for a consumer of
fhirconnect:MappingFunctions::writes_subjectandto_subject, with
defaults, and theSkipReasonvariant.fhirconnect0.1.180. -
A FHIRconnect mapping that names an
EVENTnode itself, with a FHIR time
on the other side, writes and reads the event's time (#1059), as
types-of-mappings/data-type/EVENT.adoc§POINT_EVENT and INTERVAL_EVENT
pairs them. AdateTime,instantordateis aPOINT_EVENT'stime;
aPeriodis anINTERVAL_EVENTwhosetimeisPeriod.end, whose
widthis the span back toPeriod.startand whosemath_functionis
the RM default640|actual|. A choice element such aseffective[x]
picks the class from the alternative going in and from the event's class
coming out. A FHIRtime, a period with a missing or partial bound, and a
non-choice element of the other class are refused; an interval event whose
math_functionis notactualdeclares it as a loss going out.
WebTemplateIndex::amendedits one node instance of a built composition
and validates it again. New variants a consumer matching exhaustively adds
arms for:PathError::AbsentInstance,Derived::Event,
EngineError::EventTimeandSkipReason::EventFunctionUncarried.
laboratory_test_result.v1.yml:120and:448no longer warn
fc-anchor-without-children.openehr-mapping-core0.1.126,
fhirconnect0.1.179. -
FHIRconnect LINKED mappings (#94): a
linkwhose FHIR side names a
resource, such as a Condition'sencounter, now commits that resource as a
composition of its own through the context itsmeta.profilenames, and
writesehr:/<ehr_id>/compositions/<versioned_object_uid>into the
linking composition'sLINK.target. A facade create or update runs in two
passes, because ITS-REST 1.1.0 lets the CDR, not the client, assign a new
composition's id: a probe run finds the linked resources, each is
committed as aPOSTwould commit it (a replay links the composition the
first delivery produced, and a resource this server already serves links
where it stands), and the final run writes their URIs. A resource no
context maps is a declared loss,skipped-unmapped-link. A linking commit
the CDR refuses answers its refusal with a warning naming each linked
composition it left. A transaction or batch entry that links a resource is
refused, since a transaction is oneCONTRIBUTION, and$validateruns
the link without committing. The engine gains the
engine::linked::LinkedCompositionsseam (Seams::with_linked),
SkipReason::UnmappedLinkandReferenceError::Link; a run with no seam
refuses as before.fhirconnect0.1.174. -
The FHIRconnect engine converts
ELEMENT.null_flavouragainst the code
of the R4data-absent-reasonextension both ways (#93), through
engine::lens::null_flavourwith GetPut and PutGet property tests and a
test per entry of its committed table. A tail on the element reaches
null_flavouras the_null_flavourfamily of the node the element
shares with its value, with_null_reasonbeside it. FHIRconnect
NULL_FLAVOUR.adoc's table is no function; the cell reads it with the
openEHR terminology's null flavours (271 "no information", 253
"unknown"), keeps a FHIR code with no flavour of its own in
null_reason, and refuses a code outside either set. Breaking:
SkipReasongainsNullReasonUncarried, the declared loss of a
null_reasonthat names no code, so a consumer that matchesSkipReason
exhaustively adds the arm.fhirconnect0.1.176. -
A FHIRconnect mapping can now name the origin of an observation's
history,$archetype/data/origin, which no Web Template node carries
(#95). The engine writes it as the Simplified Formatshistory_originof
the observation and reads it back fromHISTORY.origin. AnOBSERVATION
whoseHISTORYcarries events, each with anITEM_LIST, now round-trips
under both lens laws against a synthetic template: going out each event
becomes its own resource (the FHIRconnect hierarchy split), and the origin
and each event's time keep their offset in both directions. The round-trip
pass list gainsferrobridge_observation_events(5 of 5).fhirconnect
0.1.171. -
Going into openEHR, a coding that carries no display now has its display
resolved throughCodeSystem/$lookupon the[terminology]server
(#95), as the FHIRconnectDV_CODED_TEXTpage recommends. A found
display becomes theDV_CODED_TEXTvalue. A code the server does not know
refuses the resource unless[terminology] display_fallback = true
(FERROBRIDGE__TERMINOLOGY__DISPLAY_FALLBACK) writes the code instead. A
failed call refuses either way, carrying the upstream status. With no
terminology server the code stands as before, the page's alternative "if
a term server is not an option". Lookups join the translations in one
call or onebatchper round. The FHIRconnect terminology seam gains
lookupanddisplay_fallback, both with refusing defaults. The engine
answersEngineError::UnknownDisplayandEngineError::DisplayLookup.
fhirconnect0.1.170. -
Five more
mappingCodefunctions of the published FHIRconnect library
are registered (#95).timingToDailywrites a frequency per one unit of
time as the1/<unit>frequency of the daily timing cluster (or an
interval of them withfrequencyMax), one event per longer period as the
interval between doses, and the one time of day.dosageQuantityToRange
writes a doseRangeas an includedDV_INTERVAL<DV_QUANTITY>.
rangeToTextwrites a rateRangeas the text<low> <code> - <high> <code>, the only form the rate element admits beside a quantity.
ratio_to_dosageandratio_to_dosage_actionwrite a rateRatio(R4's
"500ml over 2 hours") as the rate per unit of time and the administration
duration. Every quantity and range converts through the engine's
DV_QUANTITYandDV_INTERVAL<DV_QUANTITY>cells, a rate divides and
multiplies exactly or is refused, and each function refuses what it
cannot carry. A port onto a polymorphicELEMENTnow
reads only the value node whose_typematches. The library's
dosage.v2.yml,dosage.v2.BackboneElement.ymland
timing_daily.v1.ymlnow load, so the medication statement context gets
to compile. Its refusals there are recorded on #101. It landed in
fhirconnect0.1.169 beside #1076, with no version of its own. -
The FHIRconnect engine converts a scalar
IntegerorInteger64tail
against FHIRintegerand a scalarRealtail againstdecimalboth
ways (#1081), throughengine::lens::scalarwith GetPut and PutGet
property tests; going out these refused with no cell. A value outside
FHIR's 32-bitintegeris refused going out, and a decimal whose text
theRealcannot render back (5.40,1e3) is refused going in, where
it was rounded to the nearest binary number with no loss declared.
fhirconnect0.1.173. -
The FHIRconnect engine converts
DV_QUANTITYagainstQuantity,decimal
andinteger, andDV_COUNTagainstinteger,QuantityandCount
(#93), each a lens with GetPut and PutGet property tests over the tables of
FHIRconnectDV_QUANTITY.adocandDV_COUNT.adoc. Where a table is silent
or contradicts R4, the cell decides and refuses rather than drops: the UCUM
system is written beside a code (R4qty-3),units_display_nameis the
counterpart ofunit, and amagnitude_statusno comparator states, a
magnitude with more places than itsprecision, a count outside FHIR...
0.0.10
The openEHR demographics release. The FHIR facade serves Patient,
Practitioner, PractitionerRole and Organization from FHIRconnect party
contexts over the ITS-REST 1.1.0 Demographic API, searches them through the
Cadasto experimental AQL demographic extension, chains clinical searches
through the patient identifier, and gives a created Patient its EHR. The
terminology lane authenticates with OAuth 2.0 client credentials, and the
static bearer token is gone from both upstreams.
Added
-
The terminology lane authenticates with the OAuth 2.0 client credentials
grant (#962):[terminology.credentials.oauth]takes the keys of
[cdr.credentials.oauth], and the same token cache obtains the token,
shares it across calls, renews it before it expires, and renews it once
when the terminology server answers401. A renewal that obtains no token
ends the call with the terminology server's refusal and the token
endpoint's error.ferrobridge-term0.1.129 adds
config::Credentials::OAuthover a caller-suppliedconfig::TokenProvider,
and theerror::Error::Tokenanderror::Error::Renewalvariants.
ferrobridge-validatormoves to 0.1.129 with it. -
The party search takes
name,_idand_count=0besideidentifier
(#931).namematches a name that starts with the value, case-insensitively
as R4 string search asks:[facade.party_search.types.<Type>] name_query
binds the value as typed, in lower case and capitalised, because the
extension'sLIKEis case-sensitive; other case forms and accents are a
stated gap._idreads the one party it names._count=0answers the
number of matches intotalwith no entries (R4 search §3.1.1.5.3), and
_countis capped atsearch_count_max. A bare identifier value two
parties carry answers both. A type'squeryis now optional, and the
CapabilityStatementdeclares exactly the parameters each type takes. -
A
Patientcreated in a party context gets its EHR under the subject link
when[facade] ehr_policyiscreate_on_first_write(#932): the facade
finds the EHR keyed by the new party's id, or creates it with that id in
EHR_STATUS.subject, so the clinical resources that name thePatientfind
it. Underexistingthe create sends no EHR call. A failed EHR call after
the party committed answers the EHR refusal with a warning naming the stored
Patient. No specification governs this: our own design. -
fhir-types0.1.127: everyschema::FieldSchemacarries
target_profiles, theElementDefinition.type.targetProfilecanonicals of
the element's types in definition order, in all five versions (#926), so a
consumer reads which resource types aReferenceadmits from the element
table. A consumer that builds aFieldSchemaliteral adds the field. -
The facade's subject search parameters take the
:identifiermodifier
(#923):Condition?patient:identifier=[system]|[value]matches the
Reference.identifierof a resource's subject (R4 search.html
§3.1.1.4.12). That identifier is the subject the identity map keys by
system and value, which the facade renders as an identifier. A subject
rendered as a literal reference carries none and matches nothing, and so
does|[value].[value]alone and[system]|answer400 not-supported,
because the map keys a subject by system and value. No specification
governs the identity map: our own design. -
The facade searches
Patient,Practitioner,PractitionerRoleand
Organizationbyidentifierthrough the Cadasto experimental AQL
demographic extension, behind[facade.party_search]with one configured
query per type (#480). Each page runs the query withoffsetandfetch
and reads every party it names over the Demographic API. A CDR that answers
400to the query, as one without the extension does, answers501with
not-supportednaming the extension. TheCapabilityStatementdeclares
search-typeandidentifieron exactly the configured types, and a
configured type no party context serves refuses to boot.
docs/architecture.md§4.12 writes down the dialect's semantics as the
extension's guide documents them and Cadasto observed them, with the
findings Cadasto plans to change. No specification governs the extension:
our own design. -
The FHIR facade serves
Patient,Practitioner,PractitionerRoleand
Organizationfrom party contexts over the ITS-REST 1.1.0 Demographic API,
DEVELOPMENT, behind[cdr] demographic(#470). Read, vread,
GET [type]/[id]/_history, create, update (overIf-Matchor the latest
version) andDELETE [type]/[id], which answernot-supportedfor a type no
party context serves; a party context with the key off is a boot refusal. The
id is the party'sversioned_object_uidandmeta.versionIdits version
tree id, with no identity-map entry; a Demographic API400answers500,
and404,409,412and422answer as themselves. The
CapabilityStatementdeclares the six interactions and no search per party
type. No specification governs a party context: our own design. -
A party context maps
ROLE.performer, the mandatoryPARTY_REFno template
node holds (RM Demographic IM, theROLEclass), as$archetype/performer,
so the facade creates and updates aPractitionerRole(#911).
PractitionerRole.practitionermust name aPractitionerthe facade
serves, relative or under its base, with nothing besidereference. It
becomesPARTY_REF {namespace "demographic", type "ACTOR", id HIER_OBJECT_ID <uid>}and reads back asPractitioner/<uid>, the type taken from the
element'stargetProfile. A reference of another server
(EngineError::ForeignParty), of another type, carrying a display, or local
to the request answers422, and aROLEwith noperformer, built or
served, is refused (PartyError::RoleWithoutPerformer). An element whose
reference admits no single type is refused at load
(fc-party-ref-target).fhirconnect0.1.151 addsRmValue::PartyRef,
thePARTY_REF-against-Referencepair,EngineError::ForeignPartyand
EngineError::PartyRefTarget, which breaks an exhaustive match over
either enum;openehr-mapping-core0.1.118 adds
PartyError::RoleWithoutPerformerthe same way. No specification governs
this correspondence: our own design. -
The facade's search chains through the patient identifier (#492):
Observation?patient.identifier=MRN-1,subject.identifierand
subject:Patient.identifier, on every type a search declaration answers.
With[facade.identifier_search] enabled, a configured demographic AQL
query in Cadasto's experimental extension resolves the identifier to its
parties, each party's uid names a patient, and the EHR comes from the
identity map orGET /ehr?subject_id=. An unknown identifier answers an
empty searchset with no clinical query, and_count=0answers the total
alone. A value naming a system needssystem_query. The
CapabilityStatementdocuments the chain on each subject parameter while
it is on. No specification governs the resolution: our own design. -
A party program runs through the engine (#905).
WebTemplateIndex:: build_partybuilds a canonicalPERSON,ORGANISATIONorROLEfrom the
node values a party context writes, through theopenehr-rmtypes: the
objects between two template nodes are the ones the OPT 1.4 constrains
there, named by their rubric, every list attribute is an array, no
composition attribute is written, and the result decodes strictly as the
root's class (PartyError::Invalidotherwise).openehr-sdt0.0.87 builds
no correct party (#897, FerroHEALTH/FerroEHR#3810).fhirconnect's
engine::traverse::party::to_partyandfrom_partymap a FHIR resource to a
party and back;WebTemplateIndex::readreads anyCanonicalDocument. No
specification governs a party build: our own design. -
FHIR
Organizationround-trips through the KDS laboratory request chain
(#543). The publishedKDS_Laborauftragtemplate is vendored by
scripts/vendor/kds-laborauftrag-opt.shat the openFHIR commit
docs/VERSIONS.mdpins, and a FerroBRIDGE project context compiles the
library'sorganisation.v1.ymlverbatim, reached through the service
request'sreferenceto its requester: a containedOrganizationmaps into
theEinsendercluster and comes back as a createdOrganizationthe
request references, and both lens laws hold.organisation.v1.ymljoins the
mapping-library pass list andkds_laborauftragthe round-trip list; every
published file of the chain that does not compile is pinned by file and
line. -
FHIRconnect party contexts compile (#898). A context whose operational
template is rooted at aPERSON,ORGANISATIONorROLEis a party
context, read from the RM type of the template root, andProgram::party
names the class. A party context refuses at load, each with a code of its
own:$composition(fc-party-composition-variable), a path naming a
composition attribute the defaults orctx/set
(fc-party-composition-field),participationsFunction
(fc-party-participation),link(fc-party-link) and entering a context
whosestartslots a composition (fc-party-sub-context-composition).
to_openehrandto_fhirrefuse a party program with
EngineError::PartyProgramuntil the party build lands (#897). No
specification governs a party context: our own design. Breaking for a
consumer that matchesResolveCodeorEngineErrorexhaustively: add the
new arms.
Changed
- Only the newest release is supported (#979).
SECURITY.mdsays that every
earlier release stops receiving fixes when a new one is published, with no
maintenance branches, no long-term-support line and no backports, and that
upgrading is free. Cadasto B.V. commits to keep publishing security fixes
for at least five years af...
0.0.9
Added
-
The ITS-REST 1.1.0 Demographic API, DEVELOPMENT, behind
[cdr] demographic
(off by default; #894). The Demographic OpenAPI document is vendored beside
the other ITS-REST documents, itsx-status: DEVELOPMENTchecked, and a test
holds the generatedopenehr-itsclient to every operation it declares.
CdrClient::demographicreads, creates, updates and deletesPERSON,
ORGANISATIONandROLE; a400,404,409,412or422maps to a
facade answer throughfacade::status::demographic. A Release 1.1.0
PARTYthat carriesreverse_relationshipsreads: the member is dropped
before the decode and the dropped entries are counted, because each one
restates a relationship the repository holds (RM Demographic IM Release
1.1.0 §2.2.1; #845). No FHIR resource is served from it yet. -
A FHIRconnect sub-context's
template.idis checked against the template
the parent's OPT 1.4 states at the slot node (C_ARCHETYPE_ROOT.template_id,
read by the newWebTemplateIndex::embedded_template). A different template
is refused asfc-sub-context-template-mismatch, and a slot node that states
none leaves the warningfc-sub-context-template-undecided
(sub-contexts.adoc§Validation errors;openehr-mapping-core0.1.115,
fhirconnect0.1.145; #886). -
FHIRconnect sub-contexts (#864,
types-of-mapping-files/sub-contexts.adoc).
fhirconnect0.1.143 readsslotContexton a mapping, andscope(root
orsub) andcontextson a context. The strict schemas carry all three,
withslotArchetypeandslotContextmutually exclusive.- The semantic rules refuse:
- a
slotContextor acontextsentry naming no loaded context; - a
slotContextatopenehr: $reference; - a
scope: subcontext no context lists; - a cycle through
contexts.
- a
- The resolver compiles a
slotContextinto the parent program as
Method::SlotContext, from the entered context'sstartwith that
context's own extensions and against the parent's template, and skips the
composition slot of a root context entered this way. It refuses:- a sub-context compiled as a root;
- a
slotContextthe entering context does not list; - a sub-context whose
startslots a composition; - a
startthat does not match the slot's archetype.
- The engine maps a sub-context into the parent composition in both
directions, andOutcome::consumednames the resource aslotContext
pulled in through areference. - The server loads only root contexts as programs and never fetches a
sub-context's template. A transaction passes over, as a root, an entry
another entry'sslotContextconsumed, and answers it200 OKwith no
location of its own. An entry nothing consumes is still processed as a
root.
- The semantic rules refuse:
-
fhir-types0.1.126 readsValueSetandCodeSystemrelease-neutrally
(#876).definition::ValueSetReadcovers the composition (includes,
excludes, filters, imports,inactive) and the expansion, and
definition::CodeSystemReadcovers content, hierarchy meaning, case
sensitivity, the declared properties and the concepts. A nested concept or
expansion entry is read through the same trait as its parent
(ConceptRead,ContainsRead). Every version implements them from its own
package, and STU3'suriimports read as R4's canonicals. The profile
validator now decides STU3 bindings from the STU3ValueSetsand
CodeSystemsof the package set as it does R4 ones.Releasenames the
release'sValueSetandCodeSystem,PackageSet::value_setand
code_systemanswer in the release's model, and
Reason::TerminologyNotReadis gone. -
A
Patientkeys its own EHR through the configured subject link (#867).
Under[facade] subject_id_form = "logical_id"or"uuid"a Patient create
or update finds or provisions its EHR by its logical id in
subject_namespace, the id aPatient/<id>reference of its resources
names, so on a CDR whose owner links each EHR under its own namespace the
Patient and its resources reach one EHR. A Patient with noid, or under
uuidone whoseidis no UUID, is refused naming
facade.subject_id_form. In a Bundle, a subject reference to a Patient
entry that carries anidkeys by that id too, and one without anid,
such as an HL7 v2 message's Patient, keeps the identifier key. Under
referencenothing changes. -
The profile validator validates STU3 resources against STU3 profiles
(#838).PackageSet::<Stu3>::load_releasereads a package set as STU3, and
Validatorover it walks the STU3 element table with the checks, refusals
and unevaluated listing of R4: cardinality, the types of a choice, the
single STU3type.profileandtype.targetProfile, slicing, the lexical
forms of the STU3 package, invariants as FHIRPath over the STU3 types, and
extension contexts in STU3'sresource,datatypeandextensioncodes.
The walk is generic over the sealedrelease::Release(R4,Stu3) and
reads every definition through the release-neutralfhir_types::definition
read.PackageSetandValidatortake the release as a type parameter
defaulting to R4, andPackageSet::loadandPackageSet::newstill read
R4. An STU3 binding is never decided from the package set, since its
ValueSetsandCodeSystemshave no release-neutral read yet (#876): it is
listed with the newReason::TerminologyNotReadand kept for a terminology
server. -
The facade's patient-to-EHR link is configured to match the CDR owner's own
link (#467).[facade] subject_typesets thePARTY_REF.typeof the
subject of an EHR the facade creates (defaultPERSON, until now fixed),
and[facade] subject_id_formsets how the id of a literal subject
reference is written:reference(the default,Patient/<id>as before),
logical_id(the bare<id>) oruuid(the bare<id>, refused with a
diagnostic naming the key when it is no UUID). Asubject_typeoutside
the BASEPARTY_REFType_validityset, or asubject_namespacethat
breaks theOBJECT_REFnamespace rule, refuses the boot naming the key;
both are checked throughopenehr-base. The bridge never derives a
subject id the CDR mints itself, such as a pseudonym. -
fhir-types0.1.124 completes the release-neutral definition read (#859).
ElementDefinitionReadgainsis_modifier, and its reads carry a type's
regex, a binding'smax_value_setand a constraint'sbest_practice,
read from the core extensions with those urls in every version (STU3
statesmaxValueSetas aReference, R4 as acanonical; the R5 and R6 core
packages define neither of the two binding and constraint extensions). The newStructureDefinitionReadreads the url,
version, type, base definition, kind,abstract, derivation, snapshot,
contexts and context invariants of every version: an STU3 context (one
contextTypebeside a list of strings) reads as the sameContextRead
entries as an R4 context, each release keeping its own type codes.
fhirconnectmoves to 0.1.140 for the requirement. Breaking for a consumer
that buildsTypeRead,BindingReadorConstraintReadliterals, or
implementsElementDefinitionReaditself. -
The ITS-REST 1.1.0 Overview and System OpenAPI documents are vendored
beside EHR, Query and Definition (#478). All five arex-status: STABLE
at tagRelease-1.1.0. The Overview defines the common headers the CDR
client sends (openehr-version,openehr-audit-details,
openehr-template-id), and System defines theOPTIONS /capability call.
scripts/vendor/its-rest.shfetches and checks all five, and the corpus
test reads each. -
The FHIRPath evaluator has an STU3 type model,
model::stu3::Stu3, over
the generated STU3 element table (#837), so paths,ofType(),isand
asresolve against STU3 types (an STU3valueAttachment,
Patient.animal). Every STU3 core invariant with a typed element passes
the static check, except the two the package publishes with a defect
(inv-1,sdf-15).
Changed
-
Breaking for a library consumer of
fhirconnect0.1.146: a demographic
Reference.referenceresolves through the newDemographicsseam
(engine::demographics, #469), and theSeamsdefault,NoDemographics,
refuses it. A consumer installsIssuerDemographics(the ids of its own
FHIR server, the fallbackengine/demographics.adocnames) or its own
DemographicswithSeams::with_demographics. The identity travels in
PARTY_IDENTIFIED.identifierswhere the FLAT format carries it, and in
PARTY_PROXY.external_refon the composer and on a participation's
performer; a read turns it back into the reference. The server installs
the facade-base port,[facade] base_urlis checked at boot as its
issuer, and the operations lane uses it when the facade is configured. -
ferrobridge-validator,ferrobridge-termandferrobridge-fhirpathjoin
the crate line at 0.1.126, leaving their 0.0.0 name reservations, so the
next publish ships the validator as it stands onmain. Pin each exactly,
as for every crate of the line (#432). -
The operator console draws with
ferrohealth-ui0.1.3, the FerroHEALTH
component library the four consoles share (#850). It keeps only its brand
theme and its screens: the shell, the cards, tables, pagers, code panels,
forms, refusals and empty states are the library's, its icons are the
library's Lucide glyphs, and the console's own Tailwind stylesheet, style
module and highlighter are gone; the site build no longer installs the
Tailwind CSS CLI (#890). The top bar carries the one theme toggle,
a moon in the light theme and a sun in the dark one, which posts with no
script and, once hydrated, swaps the theme in place while the server keeps
the choice in its cookie. The playground (its navigation entry now
reads "Playground"...
0.0.8
Added
-
fhirconnect0.1.136 holds every FHIR resource a run out of openEHR
produces or creates to R4ext-1before it leaves the engine (#651). An
extension with a url and no value, or with a value and nested extensions,
refuses the run as the newEngineError::Invariant, naming the constraint
and the instance path, so a facade read or a$tofhircall refuses it
instead of answering a resource that breaks an error-severity constraint
(R4 conformance-rules.html §2.1.0.6).engine::invariantholds the checks,
one per constraint key;docs/architecture.md§4.4 records why they are
targeted checks and not FHIRPath evaluation. A consumer matching
EngineErrorexhaustively gains a variant. -
The operator console has browser journeys, screenshots and a book page
(#602). The journeys drive headless Chrome through chromedriver with the
thirtyfourWebDriver client against a running bridge (ferrobridge serve's run path over awiremockCDR and a synthetic mapping tree) and
a running console serving its release site bundle, and fail on any error
the browser logs. They cover the sign-in, the shell and its theme switch
and sign-out, the engine state, every mapping file view, the transform
playground (an answer, a refusal, and an operations lane that is off) and
the mapping editor end to end: a refused draft leaves the disk and the
running set unchanged, a save is byte-identical and reloads the programs,
and the bridge's audit line names the actor and the file and nothing of
the draft. They run behindFERROBRIDGE_JOURNEYS=1in the new
journeys (browser)CI job at the Chrome for Testing release
docs/VERSIONS.mdpins, whichscripts/release/journey-tools.shinstalls
locally.FERROBRIDGE_SCREENSHOTS=1captures every console page in light
and dark at 1440 pixels for the book's operator console page, and a guard
in the ordinary suite fails on a console route without both images. The
test OpenID Provider of the testkit can now sign a real browser in. -
The FHIRPath evaluator admits the functions FHIRPath 3.0.0 adds as
Standard for Trial Use behind the opt-in
Environment::with_fhirpath_stu3_functions(#633), so the default stays
FHIRPath N1 2.0.0, the release FHIR R4 cites. This change implements
matchesFull(),trim(),split(),join(),encode(),decode(),
escape()andunescape(). HL7's FHIRPath R4 suite now counts as two
corpora with a badge each:fhirpath-r4(874 of 886, N1) and
fhirpath-r4-stu3(33 of 104, the tests that call one of the 13 3.0.0
functions, run with the opt-in). -
The FHIRPath 3.0.0 opt-in adds
lowBoundary(),highBoundary(),
precision()andcomparable()(#633). A decimal boundary is half a unit
of its last place away, rounded outward to the precision asked for. A date
and time boundary fills the missing components and keeps the value's own
offset, as the 3.0.0 examples show.fhirpath-r4-stu3moves to 85 of 104;
the suite cases that contradict those examples are the upstream report
#815. -
The FHIRPath 3.0.0 opt-in adds
sort(), with theascanddesckey
directions of the 3.0.0 grammar'ssortArgument(#633), which completes
the 13 functions.fhirpath-r4-stu3moves to 93 of 104. -
The FHIRPath evaluator has a strict ordering mode,
Environment::with_strict_ordering, off by default (#636). It refuses
first(),last(),tail(),skip(),take()and the indexer over a
collection derived fromchildren()ordescendants()with
EvalError::Unordered, the error FHIRPath N1 §3.1 lets an implementation
return for an order-dependent operation on a list whose order is
undefined. -
The profile validator checks a resource against a profile on the
abstractResourceorDomainResource(#620): a reference target, a
meta.profileclaim or aprofilediscriminator walks the resource over
the profile's elements and its own core definition for the rest, so it
conforms or fails instead of being listed.Reason::AbstractProfileis
gone, as nothing is listed for it any more. -
The profile validator holds every resolved extension to where its
definition admits it (#481): eachStructureDefinition.contextof the
typeselement,extensionandfhirpath, read as R4
defining-extensions.html §2.5.1.2 and theextension-context-typecode
system define them, and eachcontextInvariantevaluated on the element
holding the extension with%extensionbound to it. A misplaced
extension is anextension-contexterror and a broken context invariant
acontext-invarianterror; a context the walk cannot decide, and a
context invariant that does not parse or evaluate, stay listed as
unevaluated with the reason.Reason::ExtensionContextnow carries that
reason as aString, andConstraint::ContextInvariantis new: a
consumer matching the unit variant changes its pattern. -
A profile slice that holds too few items names why the closest item
failed it (#490): when aprofilediscriminator, or slicing with no
discriminator, keeps an item out of a slice that then falls short of its
minimum, the errors of the rejected item with the fewest are reported as
slice-rejectioninformation beside the cardinality error (an EPS
Bundle whose Patient lacksbirthDatenow namesbirthDate). -
The profile validator holds a
Referenceor acanonicalto its
element'stype.versioning(#514, R4 elementdefinition.html
§2.30.0.4.4): underspecifica REST reference without_history/[vid]
or a canonical without|[version]is aversioning-mismatcherror,
underindependentone with a version is, and under any rule a
Referencewithout a literalreferenceis. A reference that names no
FHIR REST server counts as version specific (references.html,
Reference.reference), soindependentlists it as unevaluated.
Constraint::Versioningand the reasonsNotRestfulReferenceand
VersioningRuleare new. -
The operator console ships as its own image,
ghcr.io/ferrohealth/ferrobridge-viewer(#603).docker/viewer/Dockerfile
builds it on the bridge image's distroless base, runs as65532:65532,
and probes itself with the binary'shealthchecksubcommand. The
reusablerelease-viewer.yml, called from the release lane, builds the
console's musl binaries withcargo auditableand its site bundle, attaches
them to the release with their checksums, provenance and SBOMs, and pushes
the multi-platform image with the same attestations and self-verification
as the bridge image; a cut refuses to publish without those assets.
compose.yamlgains aviewerprofile with a read-only root, every
capability dropped,no-new-privileges, and the OIDC client secret as a
file secret, and CI resolves the quickstart under every profile and
dry-runs the console image build. -
fhir-types0.1.118 resolves a JSON member name against the element
table (#483):TypeSchema::memberanswers the element an object key
names, the type code a choice form such asvalueQuantityselects, and
whether the key is the_sibling of a primitive (R4 json.html §2.6.2),
andFieldSchema::choiceslists a choice element's alternatives with
their type codes. The profile validator uses both and drops its own
copy of the choice matching. The change adds API and breaks none;
fhirconnectmoves to 0.1.132 with the requirement. -
fhir-types0.1.119 lists every primitive type with the type its
StructureDefinition.baseDefinitionnames, in each version's
schema::SCHEMAS.primitives, read bySchemas::primitive_base_of
(codespecializesstring) (#635). The newprimitivesfield breaks a
consumer that builds aSchemasvalue by hand: it adds the field.
fhirconnect0.1.133 follows the requirement.
Changed
-
ferrobridge_fhirpath::model::path_typestypes a path that continues
through a choice element (Observation.value[x].unit, theunitof
Quantity) or below a primitive (string.extension, theextensionof
Element), so the R4 core constraint sweep now also checks those 54
invariants (#572). Only the invariants of the five logical models remain
untyped. -
The profile validator and the HL7 v2 face each state their support for
an STU3 terminology server (#558). The validator supports one: a binding
to a versioned value set, which STU3$validate-codecannot carry, is set
aside with the client'sUnsupportedParameterand stays listed while the
other bindings are still sent, where before one such binding failed the
whole batch. The HL7 v2 face does not: its translations name each table
map by canonicalurl, which STU3$translatelacks, so the run fails
before anything is sent.ferrobridge-termgainsClient::check, which
answers whether the configured release can carry a request without
sending it, and the validator'sTerminologytrait gainssupports,
defaulted. -
fhirconnect0.1.135, the HL7 v2 face and the profile validator name a
choice element's JSON members through the element table's
FieldSchema::choicesandTypeSchema::member(#813), so the R4
json.html §2.6.2 naming rule lives infhir-typesalone. Breaking for a
consumer offhirconnect::tree::element::Move:Move::Choicecarries
schema: &'static FieldSchemain place ofvariants, whose alternatives
schema.choices()lists. -
The profile validator indexes each Bundle once per validation, its
entries byfullUrland by their resource, so resolving a reference
inside a Bundle no longer scans every entry twice (#515). A synthetic
document of 12002 entries validates in 3.6 s instead of 9.9 s in a
release build; the matching rules of R4 bundle.html §2.36.4.1 are
unchanged. -
The profile validator checks an invariant a profile declares on a choice
element it narrows against the types the profile keeps (#573, R4
elementdefinition.html §2.3...
0.0.7
Changed
-
A facade search translates a
conceptmapcode once per request (#763):
the page and itsBundle.totalshare the answers of one terminology
session, so a code repeated across their entries costs one
ConceptMap/$translatecall. Nothing is kept past the request. -
The facade, the FHIRconnect operations lane,
mapping checkand the
operator API load a FHIRconnect set through one path,
mappings::compile(#725): one read, one template resolution from the
template directory or the CDR, one compile loop. The boot refusals are
unchanged. -
fhirconnect0.1.131: the four seam traits,ReferenceSource,
IdentitySink,TerminologyandMappingFunctions, require
Send + Sync, and a compile-time assertion keepsSeamsSend, so an
async caller holds the seams of a run across an.await(#764). This
breaks the crate's public API: an implementation that holds aCellor a
RefCellmoves to aMutexor an atomic. The facade's transaction path
now looks a reference up in the Bundle's own entries through
BundleReferencesinstead of copying them into its resolved set. -
A facade search lists every resource a
hierarchy.splitwith
create: resourcecreates beside the entry's own resource, each once
(#731). A page holds at most_countresources and may end between two
occurrences of one entry,Bundle.totalcounts every resource (the count
reads the rows for such a context), and an_idnaming a created resource
answers that resource alone instead of matching nothing. -
fhirconnect0.1.130: the fouroperations::runentry points
(to_fhir,to_fhir_with_warnings,to_openehr,
to_openehr_with_warnings) take the caller's&Seamsin place of a
&dyn MappingFunctions(#722), so a caller supplies the terminology server
beside the mapping functions. This breaks the crate's public API: a
consumer passes&Seams::default().with_functions(functions)where it
passedfunctions.$toopenehrresolves a reference outside the request
Bundle through the reference source the seams carry. -
The facade resolves a reference a request names and does not carry, for a
referencemapping that reads it (#224). A relative reference, or one under
[facade] base_url, is read through the identity map and the CDR; an
absolute one is fetched only from a base listed in the new
[facade.references] fetch_bases(empty by default, so nothing is fetched
until you list a base), with redirects refused,timeout_ms(default
10000) per fetch andmax_depthlevels (default 2), each reference once. A
reference that is not resolved is a declared skip the write proceeds
without; the log names the reference, the base and the upstream status, and
$validateanswers it as awarningissue. In a transaction Bundle an
entry answers a reference to itsfullUrlor its<Type>/<id>first
(#753). -
ferrobridge-termtranslates by concept map with an optional target
system and an optionalreverse(#721). This breaks the crate's public
API:Client::translatetakes aTranslation(Translation::new(system, code)withwith_version,with_concept_map,with_target_systemand
with_reverse), andRequest::Translatewraps one. Each ofversion,
url,targetsystemandreverseis sent only when it is set, as R4
ConceptMap/$translatedeclares each0..1, so a FHIRconnect
conceptmap, which names only the map, can be translated in both
directions. -
A resource the facade's outbound mapping creates, a further
hierarchy.splitoccurrence withcreate: resourceor the target of a
referencemapping, is no longer carried as a contained resource with a
#idreference (#225). It gets an identity-store binding of its own under
an id derived from its parent's entry, the creating mapping and the openEHR
occurrence, stable across re-runs and composition versions, and the parent
references it as<Type>/<id>.GET /fhir/<Type>/<id>and the vread answer
it, aPUTof it answers405, and a type only areferencecreates is
declared withreadandvreadin theCapabilityStatement. The identity
store writes schema 3 and reads schemas 1 to 3; a file of schema 1 or 2
opens unchanged and is stamped 3, and a build before this one refuses a
schema 3 file by name. -
The FHIRconnect operations lane reads its mapping directory through the
walk the facade uses (#524), so a.YMLor.YAMLfile is now read by both
lanes; the operations lane read only the lower-case spellings before. -
The README, the book's Licensing page and the landing page answer "do you
need a commercial licence?" at a glance (#111): a table of what you are
doing, what you need and the part ofLICENSEthat decides it, the same
shape as the FerroHEALTH family table, with the change date and the
commercial-licence contact beside it. The README's top navigation links the
table, and theferrobridge-fhirpathandferrobridge-validatorREADMEs
state the terms like the other BUSL-1.1 crates. -
SECURITY.mdandCONTRIBUTING.mdkeep what is particular to FerroBRIDGE
and link the FerroHEALTH family book at https://ferrohealth.eu/docs/ for
the rest (#402).SECURITY.mdkeeps the supported versions, the reporting
route, the response times, the scope and release verification, and links
the family policy for disclosure, advisories and the support period.
CONTRIBUTING.mddescribes the current build and test gate,
scripts/checks/fast.sh. The README and the book's introduction link the
family book for the manufacturer, the Cyber Resilience Act, how the
products fit together, and licensing and trademarks. -
The identity store records its schema (#298): a file with no schema row,
which 0.0.6 or earlier wrote, reads as schema 1 and is stamped on open, and
a file in a schema this build does not read stops the start with an error
naming the file, the schema found and the schemas this build reads, leaving
the file unchanged. The schema this build writes is in the entry for #225.
Added
- The console shows the mapping files (#607): the list from
GET /operator/mappingswith each file's language, kind, owner, whether it is
writable and its diagnostics count, and each file at/files/{path}from
GET /operator/mappings/{path}, verbatim, one numbered line per line, its
YAML highlighted on the server and its SHA-256 from theETag. Beside
each file are the running load's diagnostics about it, read into
openehr_mapping_core::diagnostic::Diagnosticand each linked to its
line. A file that is not UTF-8 is refused, never shown altered, and a path
that is not plain names below a root is refused before the bridge is
asked. - The console shows the engine state (#604). The dashboard has the
bridge's build facts, pins, lanes and listeners fromGET /health/info,
its readiness indicators fromGET /health/readiness, and the counts of
its running load fromGET /operator/state. The capability screen shows
the R4CapabilityStatementas cards for its resources with their
interactions, search parameters and operations, the system level and the
security, with the JSON behind a disclosure and the SMART discovery
document beside it. The mappings overview shows each context's program
with its template, profile, resource type, models, extensions and search
declaration, the templates with their source, the OMOCL files, and every
diagnostic, read intoopenehr_mapping_core::diagnostic::Diagnostic. Each
screen is drawn on the server. A refused or unreachable call draws its
status and diagnostics, or the fault, in its section. - The console has its shell and visual system (#601): a role layer
(surface,ink,muted,accentand the status tints) derived from the
"Indigo & Iron" brand tokens, the light, dark and system themes drawn by
the server from a cookie and switched by a plain form post, the top bar
with the bridge's status and version as a word and a tint, the theme
switch and the operator menu, the navigation grouped Overview, Mappings,
Tools and Bridge with a drawer on a narrow screen, a skip link, an About
page naming Cadasto B.V., and the page for a path the console does not
serve. A test computes WCAG 2.2 contrast for every text and ground pair in
both themes (4.5:1 for text, 3:1 for a control edge and the focus ring),
and the scroll padding keeps a focused control clear of the top bar (SC
2.4.11). The WebAssembly budget rises to 244 KiB with the measurement in
.claude/rules/leptos-ui.md. - The operator API saves search declarations (#766):
PUT /operator/mappings/fhirconnect/{name}.search.ymlchecks the declaration
against the context it names and writes it under
mapping_dir/fhirconnect/, where it was refused with400before. The
reload binds every declaration, provisioned and console, and swaps them in
with the facade's programs. A declaration that does not bind answers422
with anfb-search-declarationdiagnostic and changes nothing. - The operator API saves OMOCL files (#757):
PUT /operator/mappings/omocl/{path}
checks the draft with the whole set and writes it under
mapping_dir/omocl/, where it was refused with409before.etl run
reads that directory beside[mappings] omoclwhenever the operator API is
on, through the same OMOCL load the reload checks with: a provisioned file
owns a path both directories hold, and two files that define one mapping
refuse the run. - The operator API checks, saves and reloads mapping files (#597), with
[operator] mapping_dirset:POST /operator/mappings/check?path=answers
a draft's diagnostics over the running set;PUT /operator/mappings/{path}
withIf-Match(orIf-None-Match: *) and aFerrobridge-Reasonheader
saves a FHIRconnect file undermapping_dir/fhirconnect/when the whole
set compiles with it, written to a synced ...
0.0.6
Added
- A FerroBRIDGE OMOCL
Personmapping for the KDS person template (#568),
crates/omocl/tests/fixtures/projects/ferrobridge/kds_person/kds_person_data.yml.
The corpus fileperson_data/person_data_v0.ymlreads gender at
items[at0019], whichKDS_Persondoes not carry, so every KDS person
tookgender_concept_id0. This file reads the administrative gender at
items[at0022]: its code resolves through the loaded OHDSI vocabulary
intogender_concept_idand is kept ingender_source_value, and a person
with no gender, or a code with no standard concept, takes concept 0. Point
[mappings] omoclat a directory holding it in place of the corpus file. [etl.vocabulary_aliases]maps a terminology id, such as a URI or an OID,
to the OHDSIvocabulary_idthe ETL looks a coded value up in (#625).
The table is added over the defaults (LOINCtoLOINC,SNOMED-CTto
SNOMED) and checked at load: an empty id or vocabulary, or a vocabulary
longer than the 20 characters of OMOP CDM v5.4VOCABULARY.vocabulary_id,
refuses the start. A KDS administrative gender coded under
http://terminology.hl7.org/CodeSystem/v2-0001now reaches
person.gender_concept_idonce that id is aliased to the vocabulary that
holds its codes; before, any terminology id longer than 20 characters
resolved to concept 0.- The FHIR facade answers
batchBundles onPOST [base](#531). Each entry
runs as the read, vread, search, create or update itsrequestnames,
through the same handler as the single interaction, withifMatchand
ifNoneExistas its conditional headers and the request's
Prefer: returnapplied to it, and the answer is abatch-response
Bundle with one entry per request entry in the same order, each carrying
its status,location,etagand resource, or itsOperationOutcomein
response.outcome(R4 http.html §3.1.0.11). A CDR refusal of one entry is
that entry's status through the status table and the others still run.
Under[auth]each entry is authorised on its own, and an entry the token
does not cover, or one outside apatient/token's compartment, answers
403inside the response. An entry referencing another entry'sfullUrl
answers400, as R4 calls it non-conformant, and a Bundle with an entry
that has norequest, or aPOSTorPUTwith no resource, is refused
whole with400. Each entry leaves its own audit line, with its position
asentry, beside the request's line, whose interaction readsbatch. The
CapabilityStatementdeclaresbatchbesidetransaction. - The FHIR facade answers search (#98):
GET [base]/{type}?…and
POST [base]/{type}/_searchover an AQL projection declared beside the
context mapping, in a<name>.search.ymlfile that names the context, the
subject parameters, thetoken,stringanddateparameters with the
repeated node each is read under and its path relative to that node, and
the total order pages are read in. The query binds that node in itsFROM
once per parameter occurrence, so a token's code and system always come
from one coded value (#526), a path crossing a node the template lets repeat
below the bound one is refused at load, and a composition matching on
several nodes is one entry, counted once. FHIRconnect leaves
search out, so the format is FerroBRIDGE's own. Every declaration is checked
and every query it can build is parsed at boot, and a declaration that does
not parse refuses the start. A search answers asearchsetBundle with an
id,meta.lastUpdated, one entry per composition with a uniquefullUrl
andsearch.mode = match,totalcounting matches, andselfandnext
links over the CDR'soffsetandfetchpaging._id,_count(capped by
the new[facade] search_count_max, default pagesearch_count),_count=0
and_summary=count,_sortand_totalare supported. A parameter the
type does not declare is a400naming it unless the client sends
Prefer: handling=lenient; an unsupported modifier is always a400. An
unknown subject or id is an empty searchset with no CDR call, and a CDR
refusal maps through the facade's status table, a query400to a500and
a query408to a502. TheCapabilityStatementnamessearch-typeand
exactly the declared parameters with_id. Under[auth], a search needs
thespermission of its type, and apatient/token's search is held to
its patient's EHR. - FHIR
Patientfrom the KDS person template through FHIRconnect (#468).
The published KDS person chain of the FHIRconnect mapping library compiles
against the publishedKDS_Personoperational template, which
scripts/vendor/kds-person-opt.shvendors from the openFHIR test resources,
under a FerroBRIDGE project context, and a synthetic MII PersonPatient
holds both lens laws through it. The published files that do not load,
compile or convert are replaced by stand-ins, each refusal pinned by file
and line; the defects are recorded on #475 and #468. Seven library files
join the mapping-library pass list and the chain joins the round-trip one.
fhirconnect0.1.114 adds theDV_DATEagainstdateandDV_BOOLEAN
againstbooleancells, readsvalueon a primitive as the primitive
itself, the form FHIRconnect writes in a condition, and writes the
context'shealth_care_facilityas the_health_care_facilityfamily. The
facade keys aPatientby its first identifier with a value, so a
Patientwritten through it is stored as theKDS_Personcomposition of
its own EHR and reads back. - The terminology client speaks FHIR STU3 (3.0.2) beside R4 and R4B (#455).
[terminology] wire_version = "stu3"selects it, and every operation and
the batch go through the generated STU3 operation contracts. The client
sends a code system version as STU3'sversionon$validate-code, reads
STU3'scode-typed$lookupproperty values, and reads the same
$translatematch parts and equivalence codes as R4. A request naming a
parameter STU3 does not declare (a concept map URL on$translate, a
value set version on$validate-code) is refused with
Error::UnsupportedParameterbefore anything is sent. - The FHIR facade authenticates its callers as a SMART App Launch 2.x
resource server (#400). A new[auth]section, off by default, names the
issuer and the audience; the issuer's metadata and key set are read at
boot, and every request under/fhirneeds a bearer JWT access token
(RFC 9068 profile by default) exceptGET /fhir/metadataand the new
/.well-known/smart-configurationdocument. A missing or invalid token
answers401and a token whose SMART v2 scopes (patient/,user/,
system/withcruds, v1.readand.writeincluded) do not permit
the request answers403, neither naming a claim or a scope. A
patient/token reaches only its patient's compartment, a transaction is
authorised entry by entry and fails whole, a create that revises a
resource the facade holds needsubesidec, a scopeless token gets system
rights only for a listed subject, and every FHIR request leaves one audit
line on theferrobridge::audittarget without the token or the body.
TheCapabilityStatementcarriesrest.securitywith the SMART service
and theoauth-urisextension. With[auth]off the facade stays open,
and the server warns at start-up. - The R4 profile validator evaluates every invariant on every element in
play, the core definitions' and each profile's, withferrobridge-fhirpath
on each occurrence of its element (#439). The focus is the element,
%resourcethe resource holding it and%rootResourceits container when
it is contained. A failed invariant is an issue of typeinvariantunder
its key and declaring canonical with the constraint's own severity; a
best-practice one (elementdefinition-bestpractice) is a warning unless
Validator::with_best_practice(BestPractice::Error)asks for errors. An
empty result neither meets nor breaks the rule, which asks for "true"
(conformance-rules.html §2.1.0.6), and is listed (Reason::InvariantEmpty).resolve()reaches contained resources
and Bundle entries,memberOf()reads the value sets of the package set
andconformsTo()validates against a profile of it. An invariant whose
expression does not parse, does not fit its element's type or does not
evaluate, including a call the run cannot answer, is listed as unevaluated
with the error (Reason::InvariantRefusedandReason::NoExpression
replaceReason::Invariants), and the published defects of
cid-0,inv-1anddom-3name their upstream report. A constraint the
snapshot repeats from the core is evaluated once per occurrence.
ferrobridge-fhirpathaddsFocus::withinto name the resources
%resourceand%rootResourcestand for.
and the server warns at start-up. The guard classifies every route under
/fhirby name, and a route it does not classify answers403without
reaching a handler, so a route added without a classification fails closed
(#547). fhir-types0.1.111 names each type's base type in the element table
(TypeSchema::base, fromStructureDefinition.baseDefinition, and for a
backbone element theBackboneElementorElementits element names), in
every version, and carries the abstract types a base chain passes through
(Resource,DomainResource,BackboneElement, and from R5Base,
DataTypeandBackboneType) as table-only entries.
Schemas::base_ofandSchemas::specializeswalk the chain.
ferrobridge-fhirpathreads it, sois,as,ofTypeand a leading type
name seeAgeas aQuantityandPatientas aDomainResourceand a
Resource; the R4 profile validator takes a resource under an element typed
DomainResourceonly when its type specializes `...
0.0.5
Changed
- The repository moved to the FerroHEALTH organization
(https://github.com/FerroHEALTH/FerroBRIDGE, #385); the old
rubentalstra/FerroBRIDGEURLs redirect. The image now publishes to
ghcr.io/ferrohealth/ferrobridge, and the quickstart, the book and the
landing page name that reference. Everything published up to v0.0.4 stays
available underghcr.io/rubentalstra/ferrobridge, and its signatures name
rubentalstra/FerroBRIDGEas the repository that built it (SECURITY.md).
The roadmap board is now https://github.com/orgs/FerroHEALTH/projects/3.
fhir-typessteps to 0.1.107 for its newrepositoryfield and README
links.