OZO FHIR implementation guide
0.9.0 - ci-build

OZO FHIR implementation guide - Local Development build (v0.9.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions

Changelog

Changelog

All notable changes to the OZO FHIR Implementation Guide will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

0.9.0 - 2026-10-07

Adopts RFC - Team Messaging Model (0.8.4) as a compatibility release. The three changes alter the CommunicationRequest, Task, Communication and AuditEvent contracts, but 0.9.0 accepts the 0.8.x shape of each resource next to the new one: the duplicate recipient is a validation warning, the acting-team extensions are inferred when absent, and per-member Tasks remain a supported server mode. The 0.9.0 package can therefore be installed under the 0.8.x AAA proxy without behaviour change, and 0.8.x clients keep working while the proxy switches behaviours per environment behind configuration flags. The strict cut-over is the release after 0.9.0. Implementation steps are on the new page AAA Proxy - Changes for 0.9.0.

Added

Search parameters

  • participant (SearchParameter/ozo-communicationrequest-participant) - Reference search parameter on CommunicationRequest with a union expression over recipient and extension[senderCareTeam], so one parameter matches every thread party. The AAA proxy scopes threads with participant= and messages with part-of:CommunicationRequest.participant=. Same construction as the base R4 Observation.combo-code. Advertised in the OZO-Client and OZO-System CapabilityStatements. HAPI needs a one-off reindex of CommunicationRequest after installation.

Extensions

  • OZOAgentCareTeam (ozo-agent-careteam) - Extension on AuditEvent.agent with Reference(OZOOrganizationalCareTeam): the team on whose behalf the agent acted. A read receipt names the team whose Task the OZO FHIR Api completes. FHIR R4 agent.who does not allow CareTeam.

Examples

  • Notify-Clinic-B, Notify-Pharmacy-A - Team Tasks with owner set to the CareTeam, replacing the per-member Tasks in the team messaging walkthrough. The initiating team's Task starts completed.
  • Manu-Read-Team-Thread, Pieter-Read-Team-Thread - Read receipts in the team thread with agent.extension[careTeam]; one with the CommunicationRequest entity only (no message yet), one with the viewed Communication as second entity.

Documentation

  • AAA Proxy - Changes for 0.9.0 - New page under Technical Walkthrough: contract changes, order of operations (HAPI first, reindex, proxy, migrations, clients), changes per proxy component with class and method references (query rewrite, ProfileInjector, content validation, response validation, ReadListService), proposed configuration properties, the three data migrations (duplicate recipients, team Tasks, stored Subscription criteria), the client checklist and a verification checklist.

Changed

Profiles

  • OZOCommunicationRequest - The initiating team should no longer be listed in recipient. The invariant ozo-cr-sender-careteam-in-recipient (0.8.0, error) is replaced by ozo-cr-sender-careteam-not-in-recipient with severity warning: the 0.8.x shape (team in both places) is deprecated but still accepted, and the duplicate has no effect because the thread parties are the set union of recipient and the extension. The severity becomes error in the release after 0.9.0. The 0.8.0 duplicate existed because the proxy could not OR across recipient and sender-careteam; the union participant parameter removes that need. Element descriptions updated.
  • OZOSenderCareTeam - Context set to CommunicationRequest and Communication (was unspecified, defaulting to Element). Description covers both uses.
  • OZOCommunication - New extension[senderCareTeam] (0..1, OZOSenderCareTeam), the organizational team on whose behalf the message is sent. When present it must reference an organizational team of the thread the sender participates in (the proxy rejects it with 422 otherwise). It becomes required in the release after 0.9.0 for senders who participate in an organizational team of the thread; in 0.9.0 a missing extension is accepted and the team is inferred (one candidate) or handled as in 0.8.x (all candidates, with a proxy warning).
  • OZOAuditEvent - New agent.extension[careTeam] (0..1, OZOAgentCareTeam), same rule and same transition for read receipts.
  • OZOTask - owner allows Reference(OZOPractitioner or OZORelatedPerson or OZOPatient or OZOOrganizationalCareTeam) (additive). The OZO FHIR Api gains a team-Task mode, one Task per organizational team with owner = the CareTeam, next to the per-member mode of 0.8.x; an environment switches when its clients accept a CareTeam as Task.owner. Per-member Tasks for organizational teams are removed in the release after 0.9.0. One Task per member of a patient care team or individually addressed person stays in both modes. OZOPatient resolves the gap left by 0.7.8 (self-reliant patients in their own care team already received Tasks the profile did not allow).

Examples

  • Pharmacy-to-Clinic - recipient lists Clinic-B only; Pharmacy-A is in extension[senderCareTeam].
  • Clinic-Response-to-Pharmacy, Pharmacy-Followup-by-Pieter - Carry extension[senderCareTeam] (Clinic-B and Pharmacy-A).
  • OZO-Client, OZO-System, OZO-Server - Version 0.9.0; participant search parameter added; resource documentation describes the new scoping and the extension rules.

Documentation

  • Team-to-Team Messaging - Rewritten for the new model: thread parties, one Task per team, acting team on every action, transition rule, walkthrough with two Tasks per thread, new query patterns (participant, shared inbox by Task.owner), updated sequence diagram and example list. Page changelog row added.
  • Individual Messaging - Note that per-person read state applies to patient care teams and individuals; organizational teams follow the team page.
  • Overview - CommunicationRequest, Communication, Task field tables and the team-level messaging section updated; new examples listed. Messaging data model diagram updated (Communication.partOf, Task.owner, AuditEvent.agent.extension[careTeam]).
  • AAA Proxy - Query rewriting (participant), content validation (extension rules, 422), response validation (thread parties, team Tasks), event table (Task per party, acting team, transition), new "Request rejected with 422" troubleshooting section, "Task subscription not firing" updated. The 0.8.x recipient injection is documented as removed.
  • CapabilityStatements - Per-role filters, write validation and the custom search parameter table (two parameters).
  • HAPI installation - Two custom search parameters, reindex and chained-search verification; version references to 0.9.0.
  • AuditEvent for NEN7510 - agent.extension[careTeam] documented; team read receipt examples listed.
  • RFC - Team Messaging Model - Status "Adopted in 0.9.0" with the decisions on the five open questions (participant as name; reuse OZOSenderCareTeam on Communication plus new ozo-agent-careteam; one-release transition without rejections; OZOPatient added to Task.owner; decoupled rollout behind proxy flags), a sixth decision on compatibility with 0.8.x implementations, and one correction: the proxy's response validation must include extension[senderCareTeam] among the thread parties, which the RFC had understated.

Deprecated

Accepted in 0.9.0, removed in the release after 0.9.0:

  • Listing the initiating team in CommunicationRequest.recipient next to extension[senderCareTeam] (the 0.8.0 shape). Validation warning ozo-cr-sender-careteam-not-in-recipient.
  • Communication and read receipt AuditEvent resources in team threads without the acting-team extension. The OZO FHIR Api infers the team meanwhile.
  • One Task per member of an organizational team. The per-member engine mode stays available for one release.

Migration notes

  • The 0.9.0 package can be installed at any time; reindex CommunicationRequest afterwards. The AAA proxy ships with three flags (participant scoping, team Tasks, acting-team inference) and is deployed with 0.8.x-compatible defaults. Switch scoping after the reindex and rewrite stored CommunicationRequest/Communication subscription criteria from recipient to participant; remove duplicate recipients from existing team threads only after that switch. Switch to team Tasks per environment together with the Task recomputation (member Tasks become cancelled). Details on the AAA Proxy 0.9.0 page.
  • Transition for one release: a missing extension[senderCareTeam] or agent.extension[careTeam] is accepted; the proxy infers the team when the person is in exactly one organizational team of the thread and falls back to the 0.8.x behaviour (all of the person's teams in the thread) otherwise. An extension that names a wrong team is rejected with 422. The extensions become required in the release after 0.9.0.

0.8.4 - 2026-10-01

Added

Documentation

  • RFC - Team Messaging Model - New page under RFCs with the proposed 0.9.0 changes that answer the AAA proxy team's review of the team messaging design: the initiating team leaves CommunicationRequest.recipient (access scoping moves to a union SearchParameter over recipient and extension[senderCareTeam]), one Task per organizational team with Task.owner set to the CareTeam, and an explicit team on every team-side action (extension[senderCareTeam] on Communication, an agent extension on the read receipt AuditEvent). Not normative until adopted; the current messaging pages stay authoritative.

Fixed

Examples

  • Subscription-Communication, Subscription-CommunicationRequest - criteria changed from Communication?id and CommunicationRequest?id to Communication? and CommunicationRequest?. id is not a FHIR search parameter (the resource id parameter is _id). HAPI accepted the old form only because MatchUrlService.translateMatchUrl drops parameters without a value, so Task?id behaved as Task?; with a value it would have been rejected as an unknown parameter. HAPI does require the ?: a bare Task fails Subscription validation with "must be in the form {Resource Type}?[params]", so the empty form is the minimal valid criteria. Raised in the proxy team's review.

Documentation

  • Individual Messaging, Team-to-Team Messaging, AAA Proxy - Same replacement in the subscription guidance (Task? for read receipt detection) and in the "Task subscription not firing" entry, plus a note explaining the criteria form.

Build Infrastructure

  • make build failed on the dead fhir.nl.gf download - install-dependencies still depended on install-nl-gf, which fetched the NL Generic Functions package from build.fhir.org. That dependency was dropped in 0.7.0 and the CI build URL now returns 404, so every make build and make build-minimal (local and GitHub Actions) stopped at tar: Error is not recoverable. The target is removed.

0.8.3 - 2026-10-01

Changed

Documentation

  • Team-to-Team Messaging - The "sender's team" definition is tightened to match the OZO FHIR Api. Only recipient CareTeams that are organizational teams (OZOOrganizationalCareTeam, no subject) and list the sender as a participant count; the OZO FHIR Api distinguishes the two CareTeam types by the presence of subject. A patient care team (OZOCareTeam) is never the sender's team, so a reply or read receipt in a patient network does not mark the message read for the other members. Also documented that extension[senderCareTeam] must be an organizational team the requester participates in; the thread is rejected otherwise. Raised by the proxy implementation: the previous wording ("any recipient CareTeam in which the sender is a participant") left connecting platforms asking whether patient teams count.
  • Individual Messaging - Corrected the claim that a read by one practitioner marks the message read for all members of the patient CareTeam. Read state in a patient care team is per person; team-wide read applies to organizational teams only.
  • AAA Proxy - Content validation for CommunicationRequest now lists the sender check and the extension[senderCareTeam] check (an organizational CareTeam the authenticated user is a participant of). The event table describes team-wide read for organizational teams.
  • AAA Proxy - The "Task subscription behavior" paragraph and the "Task subscription not firing" troubleshooting entry still claimed that Task subscriptions do not fire when a Task is already requested and that clients should subscribe to Communication instead. The proxy patches Task.focus on every new message (documented on the messaging pages since 0.7.5), so Task?status=requested fires every time and is the only subscription a client needs. Both texts rewritten; the troubleshooting entry now lists the real causes (Task without owner, subscriber is the sender or in the sender's team, outdated proxy). Removed the readlist.force-task-update configuration row: the option was dropped from the proxy together with the Task.focus change.
  • Team-to-Team Messaging, Overview - Communication.inResponseTo is now described as optional. The reply steps on the team messaging page read as if it were always set. It is the FHIR quote-reply link to one specific earlier message; the OZO thread model links messages to the thread via partOf and the OZO FHIR Api does not use inResponseTo for Task handling. Platforms without a reply-to-message concept can leave it out. The profile was already unconstrained (FHIR R4 base, 0..*).
  • Individual Messaging, Team-to-Team Messaging - Read receipt AuditEvent: "the entity.what field has two values" replaced by "two entity entries, each with one what", which is what the profile allows (entity 0..*, entity.what 0..1) and what the examples show. Documented that the CommunicationRequest entity is required (the OZO FHIR Api finds the Task through it and ignores receipts without it) and that the Communication entity is optional but recommended (the OZO FHIR Api only completes the Task when it is the newest message in the thread; it also records which message was viewed).
  • Individual Messaging, Team-to-Team Messaging - Added a note that "mark as unread" is not part of the messaging model. The read state lives in the Task and only the OZO FHIR Api changes it; clients have read-only access to Task and no AuditEvent type sets a Task back to requested. A platform offering "mark as unread" keeps that state locally.

Fixed

Documentation

  • Team-to-Team Messaging - The 0.8.0 row of the page changelog rendered with misplaced code spans (an escaped pipe inside a code span was mangled in 0.8.2). Rewritten without the pipe.

0.8.2 - 2026-09-17

Added

Documentation

  • Team-to-Team Messaging - Page-level changelog at the top of the page, listing per IG version what changed on this page (0.6.0 through 0.8.0), with a link to the full project changelog.

0.8.1 - 2026-09-17

Fixed

Build Infrastructure

  • Slow builds caused by tx.fhir.org - Since mid 2026 tx.fhir.org drops the IG Publisher's server-side cache sessions, so every terminology validation call takes minutes. The 0.8.0 CI build spent 37 of its 40 minutes in "Validating Resources" because it started with an empty terminology cache (earlier builds took 3 minutes in total). Same workaround as in Koppeltaal-2.0-FHIR:
    • CI persists the publisher's local terminology cache (input-cache/txcache) across runs with actions/cache, so repeated validations never hit the network.
    • New TX_OPTS Makefile variable is passed to the IG Publisher. CI builds main with -resetTxErrors (retry previously failed terminology calls, keep cached successes) and feature branches with -tx n/a (no terminology validation, fast feedback). build_with_image.sh passes TX_OPTS through for local builds, e.g. TX_OPTS="-tx n/a" sh build_with_image.sh.
    • IG Publisher bumped from 2.0.15 to 2.2.10, the version Koppeltaal-2.0-FHIR builds with.

0.8.0 - 2026-09-17

Added

Search parameters

  • sender-careteam (SearchParameter/ozo-communicationrequest-sender-careteam) - Reference search parameter on CommunicationRequest.extension[senderCareTeam]. GET /CommunicationRequest?sender-careteam=CareTeam/Pharmacy-A returns the threads a team initiated. Advertised in the OZO-Client and OZO-System CapabilityStatements. Replaces the invalid _has:Extension:url=... query that the team messaging page used to show.

Documentation

  • Authentication Practitioner - New "Background access and subscription-driven pulls" section. Documents how connecting platforms keep the practitioner context alive for background requests (e.g., pulling after a subscription notification): the NUTS node does not implement OAuth2 refresh tokens, so the refresh happens at the IdP level — the platform requests offline_access at login, stores the IdP refresh token per practitioner, mints a fresh id_token via the refresh grant, wraps it in a new NutsEmployeeCredential, and requests a new access token through its NUTS node. Lists the conditions under which OZO accepts assertions obtained through a refresh grant (trusted IdP, assertion validity, maximum authentication age via auth_time, audit attribution to the practitioner).
  • CapabilityStatements - Subscription support section now cross-references the background access pattern, since notify-then-pull requires a valid access token at pull time even without an active user session.

Changed

Profiles

  • OZOCommunicationRequest - BREAKING: for team-to-team threads the initiating CareTeam (the one in extension[senderCareTeam]) must now also be listed in recipient. The new invariant ozo-cr-sender-careteam-in-recipient enforces this. Rationale: the AAA proxy scopes access to threads, messages and Tasks on recipient, and HAPI cannot OR across search parameters (_filter is blocked), so without this entry the members of the initiating team could not see the thread they started and the Task engine had no way to address them.
  • OZOAuditEvent - Added iso-21089-lifecycle#access to the required type ValueSet. This is the type clients use for read receipts and the only type the OZO FHIR Api recognises when completing Tasks; the profile previously rejected it.

Examples

  • Pharmacy-to-Clinic - Now lists both Clinic-B (addressed team) and Pharmacy-A (initiating team) as recipient.
  • Manu-Read-Messages, Mark-Read-Messages, Kees-Read-Messages - Changed from type = rest with subtype = read to type = iso-21089-lifecycle|access without subtype, matching what the messaging pages prescribe and what the OZO FHIR Api and the clients actually use. Titles and descriptions now identify them as read receipts.

Documentation

  • Team-to-Team Messaging - Query patterns fixed: Communication links to its thread via partOf, so the searches use part-of (was based-on, a different element). Documented that recipient lists both teams, how the OZO FHIR Api determines the sender's team for Task handling (team-wide read), and the read-receipt AuditEvent type. Sequence diagram updated accordingly.
  • Overview, CapabilityStatements, AuditEvent for NEN7510, AAA Proxy, HAPI installation - Updated for the changes above: recipient rule, custom search parameter, read-receipt type, SearchParameter in supported_resource_types and the reindex step.

Fixed

Documentation

  • Overview - Fixed the broken link to the OZOAuditEvent profile page. The link used the FSH profile name (StructureDefinition-OZOAuditEvent.html) while the IG Publisher names the page after the profile Id (StructureDefinition-ozo-auditevent.html).

0.7.9 - 2026-05-19

Added

Profiles — uniqueness invariants

Audit-driven addition of Severity: #error invariants on every OZO profile field where listing the same FHIR Reference twice has no semantic meaning. Triggered by a staging incident on CareTeam.participant.member (see below); the audit found the same data-integrity class of bug latent across four other fields. AuditEvent's agent and entity are intentionally excluded — same actor in different agent.type (e.g. user + system) is a legitimate audit-chain pattern and would be falsely rejected.

  • OZOCareTeam - ozo-careteam-unique-members on participant.member.reference. A staging CareTeam was found with the same Practitioner/<uuid> referenced from two different participant entries, which made FHIR Patch delete operations fail with HAPI-1267: Multiple elements found ... when deleting (per spec, delete requires the FHIRPath to return a single element).
  • OZOCommunicationRequest - ozo-communicationrequest-unique-recipients on recipient.reference. Threads with the same recipient listed twice are semantically empty noise.
  • OZOCommunication - ozo-communication-unique-recipients on recipient.reference and ozo-communication-unique-partof on partOf.reference. Same shape as CommunicationRequest plus thread-linkage symmetry. (recipient is documented as unused in OZO; the invariant is defensive against accidental misuse.)
  • OZOTask - ozo-task-unique-basedon on basedOn.reference. Linking the same thread twice is meaningless.

All invariants follow the pattern <field>.reference.distinct().count() = <field>.reference.count() — comparing literal reference strings. Logical references via identifier are not de-duplicated. If OZO ever needs to differentiate by role/period (CareTeam) or other discriminators, the invariants must be relaxed accordingly.

Deploy order matters: existing resources that already violate any of these invariants become non-updatable until cleaned up (HAPI validates write-side, not read-side). A pre-deploy scan on staging found exactly one offending CareTeam — already patched in this iteration (142de2d6-9f32-4f7b-9e98-5ecb92af05e1, v4 → v5, 4 → 3 unique participants). Rollback: revert to the previous IG version in ozo-cloud-deployment; no schema or data migration involved.

Validation requires meta.profile to be set on the resource (HAPI is configured with DECLARED mode on staging/production). The OZO Matrix bridge already sets meta.profile = OZOCareTeam/OZOCommunication/etc. on its writes, so bridge-originated data is covered.

0.7.8 - 2026-04-15

Changed

Profiles

  • OZOCareTeam - Added OZOPatient to allowed types on participant.member. Self-reliant patients ("zelfredzame cliënten") can now participate in their own care network directly as Patient, without needing a separate RelatedPerson record.

0.7.7 - 2026-04-14

Changed

Profiles

  • OZOOrganizationalCareTeam - Relaxed category from 1..* to 0..*. The SNOMED CT practice setting list lacks coverage for primary care and the social domain, making it impractical to require a coded category for all team types. Category is now optional — teams can provide any code system (SNOMED CT, Dutch organization type list urn:oid:2.16.840.1.113883.2.4.15.1060, or plain text).

0.7.6 - 2026-04-02

Changed

Documentation

  • Subscription guidance - With Task.focus being updated on every new Communication, Task?status=requested is now sufficient as the primary subscription for both unread tracking and new-message notification. Both messaging pages updated to:
    • Mark Task?status=requested as the only required subscription
    • Mark Communication?id as optional (only needed to see own sent messages)
    • Mark CommunicationRequest?id as optional (only needed for thread lifecycle events)
    • Reorder subscription tables and example lists with Task first
    • Document the no-op problem and how Task.focus updates solve it
    • Note that Task?id is only needed when the platform also wants to detect read receipts (REQUESTED → COMPLETED transitions)

0.7.5 - 2026-04-02

Added

Profiles

  • OZOTask - Added focus field (0..1, Reference(OZOCommunication)) to point to the latest Communication in the thread. When a new message arrives, the OZO FHIR Api updates Task.focus to reference the new Communication. This ensures Task subscriptions fire even when the status value doesn't change (the resource content genuinely changes), and gives clients a direct pointer to the most recent unread message.

0.7.4 - 2026-04-02

Fixed

Examples

  • Subscription examples - Reverted status back to requested (correct for examples showing what a client would create). The HAPI activation issue is solved by the minimal package stripping examples.

0.7.3 - 2026-04-02

Fixed

Examples

  • Subscription examples - Changed status from requested to off to prevent HAPI from activating example subscriptions with unreachable endpoints on server restart. Changed endpoint URLs from example.nl to example.com.

Build

  • Minimal package - Example resources (Patient, Communication, Task, etc.) are now removed from the minimal package. Only conformance resources (profiles, ValueSets, CapabilityStatements) are kept. Prevents example data from being installed on production HAPI FHIR servers.

0.7.2 - 2026-04-02

Added

Profiles

  • OZODevice - New profile for system components (e.g., AAA proxy) that appear as source.observer in AuditEvents. Resolves HAPI HAPI-0575 validation error where a plain Device resource was rejected because it didn't conform to any of the installed Nictiz Device profiles (medical devices only). The proxy can now upsert a Device with meta.profile = OZODevice and it will be accepted.

0.7.1 - 2026-03-30

Changed

Profiles

  • OZOAuditEvent - source.observer no longer constrained to Reference(Device). Now accepts any reference type with logical identifiers (system/value) — no Device resource needs to exist on the server.
  • OZOAuditEvent - Relaxed entity.what from 1..1 to 0..1. Empty search results are access attempts that must be logged for NEN7510 but don't reference a specific resource — the search query in entity.query serves as the audit trail. Aligns with FHIR R4 base.

Examples

  • Normalized OZO naming systems - All examples now use https://www.ozoverbindzorg.nl/namingsystem/{type} without ozo/ or ozo-connect/ prefixes: .../person, .../professional, .../organization, .../team, .../network-relation, .../email, .../device
  • AuditEvent examples - source.observer changed from literal Reference(Device/ozo-aaa-proxy-001) to logical identifier with system = .../device, value = aaa-proxy-001
  • Device example - Restored with normalized naming system (https://www.ozoverbindzorg.nl/namingsystem/device)

Documentation

  • Identifier Systems - New page under Compliance listing all OZO and Dutch national identifier systems. Documents the open-slicing approach where profiles do not enforce specific systems.
  • Updated HAPI installation guide: removed all fhir.nl.gf references from configuration, dependency table, troubleshooting, and complete example
  • Added Task?id note on both messaging pages: needed for read-list tracking (REQUESTED → COMPLETED transitions)

0.7.0 - 2026-03-28

Changed

Dependencies

  • BREAKING: Removed fhir.nl.gf (NL Generic Functions) dependency. OZOPractitioner and OZOOrganization no longer extend NL-GF profiles — they now extend base FHIR R4 Practitioner and Organization directly. This eliminates the AssignedId slice, the HAPI-0574 workaround, and the dependency on an unpublished package.

Profiles

  • OZOPatient - BREAKING: Simplified identifiers to 0..* MS with open slicing. No named slices, no invariants. Any identifier system accepted.
  • OZORelatedPerson - BREAKING: Simplified identifiers to 0..* MS with open slicing. Removed all 5 named slices and invariant.
  • OZOPractitioner - BREAKING: Rebased from NlGfPractitioner to Practitioner. Simplified identifiers to 0..* MS with open slicing. Removed AssignedId slice and invariant.
  • OZOOrganization - BREAKING: Rebased from NlGfOrganization to Organization. Simplified identifiers to 0..* MS with open slicing. Removed AssignedId and URA slices.

Examples

  • All 9 Practitioner examples: identifier system updated to ozoverbindzorg.nl/namingsystem/professional
  • All 4 Organization examples: identifier system updated to ozoverbindzorg.nl/namingsystem/organization
  • Patient and RelatedPerson examples: removed named slice references (now positional)

Documentation

  • Updated overview.md identifier tables for all resource types
  • Updated interaction-network.md identifier requirements section

0.6.3 - 2026-03-27

Changed

Profiles

  • OZOCommunication - Added OZOPatient to allowed sender types. Production data shows Patient resources are used as senders (4 out of 192 Communications).
  • OZOCommunicationRequest - Added OZOPatient to allowed requester and sender types. Production data shows Patient resources are used as requester/sender (2 out of 33 CommunicationRequests).

Documentation

Documentation

  • Resource Lifecycle and Deletion Policy - New page documenting the no-DELETE policy. Resources must use status transitions instead of deletion to preserve AuditEvent referential integrity (NEN7510). Only Patient/$expunge is supported for AVG/GDPR right-to-erasure. Includes status mapping per resource type, security labels, and proxy enforcement guidance.

Examples

  • All AuditEvent examples - Changed entity.what references to version-specific format ({ResourceType}/{id}/_history/{version}). NEN7510 requires audit events to reference the exact version of the resource accessed, not the mutable current version.

Fixed

  • AuditEvent NEN7510 page - Added requirement that entity.what must use version-specific references for NEN7510 compliance. Non-versioned references become broken links when resources are deleted, undermining the legal audit trail.
  • Production data conformance analysis documented in work-documents. Key findings: 94% of Communication resources missing required status field, and AuditEvent entity references not version-specific.

0.6.2 - 2026-03-27

Changed

Profiles

  • OZOCommunication - Relaxed recipient from 1..* to 0..*. Thread participants are defined on CommunicationRequest.recipient — individual messages do not have separate addressing. The field is kept from the parent profile for FHIR compliance but documented as unused in the OZO messaging model. Matches production data where no Communication resources have a recipient.

Examples

  • Removed recipient from all Communication examples (Reply-Manu-to-Kees, Reply-Kees-to-Netwerk, Clinic-Response-to-Pharmacy, Pharmacy-Followup-by-Pieter)

Documentation

  • Updated Communication fields table in overview.md to show recipient 0..* as unused
  • Updated interaction flows in both messaging pages to note recipient is not set on Communications
  • Updated team messaging query pattern to use part-of:CommunicationRequest.recipient instead of Communication.recipient

0.6.1 - 2026-03-27

Added

CapabilityStatements

  • OZO-Server - Base CapabilityStatement showing server identity, security requirements (Nuts + DPoP), and supported profiles.
  • OZO-System - Full CRUD access to all resources. For server-to-server (OzoSystemCredential) access.
  • OZO-Client - Shared CapabilityStatement for Practitioner, RelatedPerson, and Patient roles. All three roles have the same resource types and interactions — the AAA proxy scopes access differently per role via auto-applied search filters. Per-role filtering details are documented on the CapabilityStatements page.

Examples

Examples

  • Subscription-Communication, Subscription-Task-Unread, Subscription-CommunicationRequest - New Subscription examples demonstrating the notify-then-pull pattern (empty channel.payload as required in Dutch healthcare). Covers new message detection, unread tracking, and thread lifecycle.

Documentation

Documentation

  • CapabilityStatements - New documentation page explaining the CapabilityStatement structure, AAA proxy access filtering per role, write validation, and Subscription support

Changed

Examples

  • Clinic-Response-to-Pharmacy - Removed inResponseTo reference (was pointing to deleted Pharmacy-Initial-Message; this is now the first reply in the thread, responding to the CommunicationRequest payload)
  • Notify-Manu-van-Weel, Notify-Mark-Benson, Notify-Kees-Groot - Changed Task examples from #completed to #requested (initial state when created by the OZO FHIR Api). Added Title and Description.

  • Messaging pages - Replaced inline pseudo-code blocks with links to FSH example pages. Task state transitions and notification annotations remain inline as narrative.
  • Subscription guidance - Clarified subscription behavior on both messaging pages:
    • Changed recommended subscription from Task?id to Task?status=requested to avoid subscription storms and scope via AAA proxy
    • Added "Subscription behavior" section explaining when each subscription fires and when it does not fire
    • Clarified that Communication subscription is the primary mechanism for new-message detection, not Task
    • Fixed misleading interaction flows that implied Task notifications detect new messages — Task is a read/unread indicator only
  • Notify-then-pull pattern - Added explanation that Dutch healthcare requires empty subscription notifications; clients must pull data after notification
  • Messaging example walkthroughs - Added detailed concrete examples to both messaging pages showing the complete flow including Tasks, AuditEvents, and subscription notifications at each step

Removed

  • Pharmacy-Initial-Message - Deleted Communication example that duplicated the CommunicationRequest payload. The CommunicationRequest carries the initial message; no separate Communication is created at thread initiation.

0.6.0 - 2026-03-27

Added

Profiles

Profiles

  • OZOOrganizationalCareTeam - New profile for organizational/department teams used in team-to-team messaging. Represents a department or organizational unit (e.g., pharmacy team, clinic team) for shared inbox functionality. Key constraints:
    • subject 0..0 — organizational teams have no patient
    • managingOrganization 1..1 — required link to the owning Organization
    • category 1..* — required SNOMED CT coded team type
    • name 1..1 — team display name required
    • participant.member restricted to OZOPractitioner only (no RelatedPerson in org teams)

Documentation

  • Team-to-Team Messaging - New dedicated documentation page (interaction-messaging-team.md) with stepwise walkthrough of team-to-team messaging flows, including thread creation, replies from both teams, follow-up by different team members, and read receipts
  • Added PlantUML sequence diagram for team-to-team messaging interaction

Changed

  • OZOCareTeam - BREAKING: Clarified as patient care team profile only. Updated description to distinguish from OZOOrganizationalCareTeam. participant.member now also allows OZOOrganizationalCareTeam for nested team references (fixes existing conformance bug where Netwerk-Jan-de-Hoop referenced Department-Thuiszorg as CareTeam participant but the profile did not allow it)
  • OZOCommunication - recipient now also allows OZOOrganizationalCareTeam in addition to existing types
  • OZOCommunicationRequest - recipient now also allows OZOOrganizationalCareTeam. OZOSenderCareTeam extension tightened from Reference(CareTeam) to Reference(OZOOrganizationalCareTeam) (formalizes existing practice)

Examples

  • Pharmacy-A, Clinic-B, Department-Thuiszorg - Changed from OZOCareTeam to OZOOrganizationalCareTeam profile. Removed fake Patient/example-unassigned subject references that were a workaround for the previous subject 1..1 constraint

Documentation

  • Split individual messaging page from team-to-team messaging into separate pages
  • Updated overview.md with separate CareTeam (Patient) and CareTeam (Organizational) sections
  • Updated interaction-network.md to reference both CareTeam profiles
  • Updated HAPI installation guide with OZOOrganizationalCareTeam profile and canonical URL
  • Updated PlantUML data model diagrams to show both CareTeam types
  • Fixed documentation to correctly describe the senderCareTeam extension pattern (sender field is always an individual, extension provides CareTeam reply-to address)

0.5.4 - 2026-03-11

Added

Documentation

  • Caching and Pagination - New technical walkthrough page covering Cache-Control header requirements for FHIR requests (no-cache vs no-store), pagination with _count and Bundle next links, and the OZO proxy Warning: 199 header for no-store detection

Changed

Examples

  • Normalized example Instance names - Removed abbreviated prefixes (CT-, Msg-, Tsk-, AE-) that caused ugly doubled page URLs (e.g., CareTeam-CT-H-de-Boer.html). The IG Publisher already prepends the resource type to page URLs, making prefixes redundant.
    • CareTeam: CT-H-de-Boer → Netwerk-H-de-Boer, CT-Jan-de-Hoop → Netwerk-Jan-de-Hoop, CT-Department-Thuiszorg → Department-Thuiszorg, CT-Clinic-B → Clinic-B, CT-Pharmacy-A → Pharmacy-A
    • Communication: Msg-RelatedPerson-to-CareTeam → Reply-Kees-to-Netwerk, Msg-Team-Reply-1-Initial-Message → Pharmacy-Initial-Message, Msg-Team-Reply-2-Clinic-Response → Clinic-Response-to-Pharmacy, Msg-Team-Reply-3-Pharmacy-Followup → Pharmacy-Followup-by-Pieter
    • Task: Tsk-Practitioner-Manu-Example → Notify-Manu-van-Weel, Tsk-Practitioner-Mark-Example → Notify-Mark-Benson, Tsk-RelatedPerson-Example → Notify-Kees-Groot
    • AuditEvent: AE-System-Access → System-Read, AE-Practitioner-Manu-Access → Manu-Read-Messages, AE-Practitioner-Mark-Access → Mark-Read-Messages, AE-RelatedPerson-Access → Kees-Read-Messages, AE-REST-Create-Example → REST-Create, AE-REST-Search-Example → REST-Search, AE-REST-Update-Failure → REST-Update-Denied

Added

Examples

  • Reply-Manu-to-Kees - New Communication example: Practitioner Manu van Weel replies to RelatedPerson Kees Groot in the Thread-Example thread. Replaces the broken Msg-Practitioner-to-Practitioner example (which had sender = recipient = same person and wrong payload text)

Removed

Examples

  • Msg-Practitioner-to-Practitioner - Deleted broken example where sender and recipient were both Manu van Weel and payload text was "Message from RelatedPerson to CareTeam"

Fixed

Profiles

  • OZOPractitioner, OZOOrganization - Fixed HAPI FHIR validation error HAPI-0574: Slicing cannot be evaluated: Could not match discriminator ($this) for slice Practitioner.identifier:AssignedId:
    • Added ^patternIdentifier.system to the AssignedId slice on both profiles
    • The AssignedId slice (inherited from NL-GF parent profiles) uses a value:$this discriminator but lacked a top-level patternIdentifier, preventing HAPI from matching identifiers to the slice
    • OZOPractitioner: https://ozo.headease.nl/practitioners
    • OZOOrganization: https://ozo.headease.nl/organizations

Documentation

  • Updated all example links in overview.md, interaction-messaging.md, interaction-network.md, and auditevent-nen7510.md to match new Instance names
  • Updated cross-references in CommunicationRequest, Communication, and AuditEvent FSH files
  • HAPI Installation Guide - Updated all version references from v0.5.1/v0.5.2 to v0.5.4

0.5.3 - 2026-03-10

Changed

Documentation

  • HAPI Installation Guide - Major rewrite for HAPI FHIR 8.6.0 compatibility:
    • BREAKING: Replaced fetchDependencies: true approach with explicit dependency listing — transitive dependencies pull in hl7.fhir.r4.core and hl7.fhir.uv.extensions.r4 which contain R5-only SearchParameters (DeviceUsage, DomainResource) that crash HAPI R4
    • Added hl7.fhir.uv.extensions.r4 as STORE_ONLY entry to satisfy dependency resolution without installing problematic SearchParameters
    • Added explicit nictiz.fhir.nl.r4.zib2020 and nictiz.fhir.nl.r4.nl-core entries as STORE_AND_INSTALL
    • Added fhir.nl.gf as a separate implementation guide entry (with direct packageUrl to CI build)
    • Set install_transitive_ig_dependencies: false to prevent recursive dependency installation
    • Updated prerequisites to HAPI FHIR v8.6.0+ and Java 17+
    • Updated all version references to v0.5.2 and recommended minimal package for production
    • Added troubleshooting entries for:
      • HAPI-1684: Unknown resource name "DeviceUsage" / "DomainResource" (R5-only SearchParameters)
      • HAPI-1301: Unable to locate package fhir.nl.gf#0.3.0
      • Database schema errors after upgrading HAPI (stale NOT NULL constraints, CHECK constraints)
    • Updated Package Dependencies table with install modes and extensions package warning
    • Updated both the Step 2 configuration and the Complete Configuration Example

0.5.2 - 2026-03-04

Added

Documentation

  • mTLS Walkthrough - Added "Using mTLS with a browser" section covering:
    • PKCS#12 certificate conversion from PEM files (with macOS LibreSSL workaround)
    • Browser import instructions for macOS (Safari/Chrome/Edge, Firefox), Windows (Chrome/Edge, Firefox), and Linux (Chrome, Firefox)
    • CA trust configuration for untrusted certificates
    • Command-line import via security tool on macOS
    • curl alternatives for direct endpoint access (including Homebrew curl and PKCS#12 usage on macOS)

Fixed

Documentation

  • mTLS Walkthrough - Removed stray backticks at the start of the file

0.5.1 - 2026-02-19

Changed

Profiles

  • All 9 OZO profiles - Removed individual ^version overrides (values like "0.2.1", "1.0.0", "2.0.0") that were misleading. The IG Publisher sets StructureDefinition.version to the IG package version from sushi-config.yaml, making per-profile version overrides redundant. All profiles now consistently report the IG version.

Documentation

  • HAPI Installation Guide - Major update:
    • Added Version Discovery section documenting how to find the active OZO IG version on a HAPI FHIR server via StructureDefinition queries and ImplementationGuide resource
    • Updated all version references from v0.1.0 to v0.5.1
    • Added fhir.nl.gf v0.3.0 to the package dependencies table with manual installation note
    • Added ImplementationGuide and StructureDefinition to the recommended supported_resource_types configuration
    • Documented known HAPI limitation: CapabilityStatement does not auto-populate implementationGuide field

0.5.0 - 2026-02-19

Changed

Examples

  • All example instances - Removed resource type prefix from FSH Instance names to fix broken example page links:
    • The IG Publisher generates pages as {ResourceType}-{id}.html. Previously, Instance names like Patient-H-de-Boer produced page URLs like Patient-Patient-H-de-Boer.html (doubled prefix), causing 404 errors from documentation links
    • Patient instances: removed Patient- prefix (e.g., Patient-H-de-Boer → H-de-Boer)
    • Practitioner instances: removed Practitioner- prefix (e.g., Practitioner-Manu-van-Weel → Manu-van-Weel)
    • RelatedPerson instances: removed RelatedPerson- prefix (e.g., RelatedPerson-Kees-Groot → Kees-Groot)
    • Organization instances: removed Organization- prefix (e.g., Organization-Ziekenhuis-Amsterdam → Ziekenhuis-Amsterdam)
    • CareTeam instances: replaced CareTeam- with CT- prefix (e.g., CareTeam-H-de-Boer → CT-H-de-Boer)
    • CommunicationRequest instances: removed CommunicationRequest- prefix (e.g., CommunicationRequest-Thread-Example → Thread-Example)
    • Communication instances: replaced Communication- with Msg- prefix (e.g., Communication-RelatedPerson-to-CareTeam → Msg-RelatedPerson-to-CareTeam)
    • Task instances: replaced Task- with Tsk- prefix (e.g., Task-RelatedPerson-Example → Tsk-RelatedPerson-Example)
    • AuditEvent instances: replaced AuditEvent- with AE- prefix (e.g., AuditEvent-System-Access → AE-System-Access)
  • Removed explicit * id overrides from 13 instances that had numeric IDs (e.g., * id = "1209") — the Instance name now serves as the id
  • Converted string-based references with numeric IDs (e.g., "Practitioner/1208") to FSH Reference() syntax (e.g., Reference(Marijke-van-der-Berg)) in CareTeam and RelatedPerson examples
  • Updated all cross-references across 43 example files to use new Instance names

Documentation

  • Updated example links in overview.md, interaction-network.md, interaction-messaging.md, and auditevent-nen7510.md to match new Instance names and generated page URLs

0.4.0 - 2026-02-18

Changed

Profiles

  • OZOPractitioner - BREAKING: Rebased from Practitioner to NlGfPractitioner (nl-gf-practitioner):
    • Now extends the NL Generic Functions Practitioner profile for mCSD care services directory compliance
    • Inherits from nl-core-HealthProfessional-Practitioner via nl-gf-practitioner
    • Inherits AssignedId identifier requirement (1..1) with assigner pattern linking practitioners to their employing organization
    • Removed custom identifier slices (ozoProfessionalId, ozoConnectProfessionalId, email) — incompatible with NL-GF value:$this slicing discriminator. OZO identifiers are still validated via ozo-practitioner-has-professional-id invariant and supported through open slicing
    • Profile version bumped to 2.0.0

Examples

  • Updated all 9 Practitioner examples for NL-GF compliance:
    • Added AssignedId identifier with https://ozo.headease.nl/practitioners system, practitioner slug as value, and employing organization's URA as assigner
    • Affected: Manu van Weel, Mark Benson, A.P. Otheeker, Pieter de Vries, Johan van den Berg, Annemiek Jansen, Lars Hendriks, Marijke van der Berg, Sophie de Boer

Documentation

  • Updated Practitioner section in Overview page with NL-GF parent profile information and AssignedId requirement
  • Updated Care Services Directory page with OZOPractitioner profile hierarchy and practitioner identifier requirements

0.3.0 - 2026-02-17

Added

Dependencies

  • NL Generic Functions IG (fhir.nl.gf v0.3.0) - Added as a dependency to support care services directory compliance and IHE mCSD alignment

Documentation

  • Care Services Directory - New documentation page explaining OZO's participation in the Dutch care services directory ecosystem, including directory roles (Admin Client, Update Client, Query Client), identifier requirements, and NL-GF profile references
  • Added care services directory architecture diagram (care-services-directory.plantuml)
  • Added "Care Services Directory" bullet to Key Features on the home page

Changed

Profiles

  • OZOOrganization - BREAKING: Rebased from Organization to NlGfOrganization (nl-gf-organization):
    • Now extends the NL Generic Functions Organization profile for mCSD care services directory compliance
    • Removed custom URA identifier slice (now inherited from nl-gf-organization via nl-core-HealthcareProvider-Organization)
    • Inherits AssignedId identifier requirement (1..1) with assigner pattern
    • Inherits ura-identifier-or-partof invariant: organizations must have a URA identifier or be partOf another organization
    • Profile version bumped to 2.0.0

Examples

  • Updated all 4 Organization examples for NL-GF compliance:
    • Organization-Ziekenhuis-Amsterdam - Added AssignedId identifier, type (V4 Ziekenhuis), updated URA system to canonical URL
    • Organization-Ziekenhuis-Amsterdam-2 - Added AssignedId identifier, type (V4 Ziekenhuis), updated URA system to canonical URL
    • Organization-Huisarts-Amsterdam - Added AssignedId identifier, type (Z3 Huisartspraktijk), updated URA system to canonical URL
    • Organization-Apotheek-de-Pil - Added AssignedId identifier, type (G2 Apotheek), updated URA system to canonical URL

Documentation

  • Updated Organization section in Overview page with new profile information, field table, and link to Care Services Directory page

Build Infrastructure

  • Added install-nl-gf Makefile target to download fhir.nl.gf package from CI build (package is not published on FHIR registry)
  • Added scripts/get_dependencies.py to parse sushi-config.yaml dependencies for automated installation

0.2.5 - 2026-01-13

Changed

Profiles

  • All profiles - Converted identifier systems to valid FHIR URIs:
    • OZO/Person → https://www.ozoverbindzorg.nl/namingsystem/ozo/person
    • OZO-CONNECT/Person → https://www.ozoverbindzorg.nl/namingsystem/ozo-connect/person
    • OZO/Professional → https://www.ozoverbindzorg.nl/namingsystem/ozo/professional
    • OZO-CONNECT/Professional → https://www.ozoverbindzorg.nl/namingsystem/ozo-connect/professional
    • OZO/Team → https://www.ozoverbindzorg.nl/namingsystem/ozo/team
    • OZO-CONNECT/Team → https://www.ozoverbindzorg.nl/namingsystem/ozo-connect/team
    • OZO/NetworkRelation → https://www.ozoverbindzorg.nl/namingsystem/ozo/network-relation
    • email → https://www.ozoverbindzorg.nl/namingsystem/email (temporary - should migrate to telecom)
    • ura → http://fhir.nl/fhir/NamingSystem/ura (Nictiz standard)
    • did_web → urn:ietf:rfc:3986 (value is itself a URI)
  • Updated invariant expressions to match new URI patterns

Build Infrastructure

  • Migrated Docker image from GitLab Container Registry to GitHub Container Registry (ghcr.io)
  • Updated build_with_image.sh to use ghcr.io image
  • Added GHCR push step to GitHub Actions workflow

Documentation

  • Updated overview.md and interaction-network.md with new identifier URI patterns
  • Removed outdated GitLab references from README.md and CLAUDE.md

Examples

  • Updated all FSH and JSON example files with new identifier system URIs

0.2.4 - 2025-12-11

Changed

Profiles

  • OZOCommunicationRequest - Fixed CareTeam sender support using extension:
    • FHIR R4 CommunicationRequest.sender does not allow CareTeam references
    • Added OZOSenderCareTeam extension to support team-level messaging where a CareTeam needs to be the reply-to address
    • Updated team-to-team example to use the new extension pattern

Build Infrastructure

  • Added changelog to implementation guide:
    • New copy-changelog Makefile target copies CHANGELOG.md to history.md during build
    • Changelog now accessible via "Changelog" menu item in the published guide

0.2.3 - 2025-12-04

Changed

Profiles

  • OZOCommunicationRequest - Added support for team-level messaging:
    • Added sender field constraint allowing OZOPractitioner, OZORelatedPerson, or OZOCareTeam
    • sender serves as the reply-to address for team-level messaging and provides team-level authorization
    • requester remains restricted to individuals (OZOPractitioner or OZORelatedPerson) to preserve auditability
    • Enables "shared inbox" pattern where teams (e.g., pharmacies, clinics) can send and receive messages as a unit

Documentation

0.2.2 - 2025-01-19

Added

Build Infrastructure

  • Minimal package generation - Added support for building optimized FHIR packages for server deployment:
    • New build-minimal and build-ig-minimal Makefile targets
    • Minimal packages retain snapshots for faster FHIR server installation
    • Strips narratives, mappings, and documentation to reduce package size
    • Creates both full (with documentation) and minimal (server-optimized) packages

Scripts

  • Added scripts/convert_ig_to_package.py - Converts ImplementationGuide to package.json format
  • Added scripts/create_index.py - Creates .index.json for FHIR package structure
  • Added scripts/strip_narratives.py - Strips narratives and mappings while preserving snapshots

Changed

CI/CD Pipeline

  • GitHub Actions workflow updated to build and publish both package types:
    • Builds full and minimal packages in parallel
    • Publishes both packages to GitHub Packages (minimal with -minimal suffix)
    • Creates GitHub releases with both package variants
    • Separate artifacts for full (fhir-package-full) and minimal (fhir-package-minimal) builds

Repository

  • Updated .gitignore to exclude /output-minimal/ and additional build artifacts

0.2.1 - 2025-01-14

Changed

Profiles

  • Enhanced identifier system flexibility for OZOPatient, OZOPractitioner, and OZORelatedPerson profiles:
    • Updated invariant expressions to use regex pattern matching (`^OZO[^/]*/ResourceType) instead of explicit system enumeration
    • Now supports any OZO-prefixed identifier system (e.g., OZO/Person, OZO-CONNECT/Person, OZO-MOBILE/Person, OZO-WEB/Person)
    • Enhanced slicing descriptions to clarify that additional OZO-* systems are supported through open slicing
    • Maintains validation requirement for at least one OZO identifier while allowing future system extensions

Examples

  • Fixed identifier slice names in 9 Practitioner example instances:
    • Changed from ozoProfessionalId to ozoConnectProfessionalId for identifiers using the OZO-CONNECT/Professional system
    • Affected examples: A.P. Otheeker, Annemiek Jansen, Johan van den Berg, Lars Hendriks, Manu van Weel, Marijke van der Berg, Mark Benson, Pieter de Vries, Sophie de Boer

Technical

  • Moved invariant definitions outside profile blocks to comply with FSH syntax requirements

0.2.0 - 2025-11-04

Added

Profiles

  • Added ^url, ^name, and ^description metadata elements to all OZO FHIR profiles for improved canonical URL support and HAPI FHIR server compatibility:
    • OZOAuditEvent - http://ozoverbindzorg.nl/fhir/StructureDefinition/OZOAuditEvent
    • OZOCareTeam - http://ozoverbindzorg.nl/fhir/StructureDefinition/OZOCareTeam
    • OZOCommunication - http://ozoverbindzorg.nl/fhir/StructureDefinition/OZOCommunication
    • OZOCommunicationRequest - http://ozoverbindzorg.nl/fhir/StructureDefinition/OZOCommunicationRequest
    • OZOOrganization - http://ozoverbindzorg.nl/fhir/StructureDefinition/OZOOrganization
    • OZOPatient - http://ozoverbindzorg.nl/fhir/StructureDefinition/OZOPatient
    • OZOPractitioner - http://ozoverbindzorg.nl/fhir/StructureDefinition/OZOPractitioner
    • OZORelatedPerson - http://ozoverbindzorg.nl/fhir/StructureDefinition/OZORelatedPerson
    • OZOTask - http://ozoverbindzorg.nl/fhir/StructureDefinition/OZOTask

Changed

Repository Structure

  • Reorganized FSH files: moved example instances from input/fsh/input/fsh/instances/ to input/fsh/examples/ for improved organization and clarity
  • Moved aliases.fsh from input/fsh/input/fsh/ to input/fsh/ (root level)
  • Moved profile files from input/fsh/input/fsh/profiles/ to input/fsh/profiles/

0.1.0 - 2025-10-20

Added

Profiles

  • Initial release of OZO FHIR profiles:
    • OZOPatient - Patient profile for the OZO platform with OZO Person identifier and BSN support
    • OZOPractitioner - Practitioner profile with OZO Professional identifier and email slicing
    • OZORelatedPerson - RelatedPerson profile for informal caregivers with OZO Person and NetworkRelation identifiers
    • OZOOrganization - Organization profile with URA and OZO Organization identifiers
    • OZOCareTeam - CareTeam profile representing care networks with practitioners and related persons
    • OZOCommunication - Communication profile for messages with thread linking via partOf
    • OZOCommunicationRequest - CommunicationRequest profile for message threads
    • OZOTask - Task profile for work assignments and referrals with thread linking via basedOn
    • OZOAuditEvent - AuditEvent profile for NEN7510 compliance with W3C Trace Context extensions

Examples

  • Added comprehensive example instances for all resource types:
    • Patients: H. de Boer, Jan de Hoop
    • Practitioners: Manu van Weel, Mark Benson, A.P. Otheeker, Annemiek Jansen, Johan van den Berg, Lars Hendriks, Marijke van der Berg, Pieter de Vries, Sophie de Boer
    • RelatedPersons: Kees Groot, Jane Groen, Maria Groen-de Wit, Thomas Groen, Willem Bakker
    • Organizations: Ziekenhuis Amsterdam, Ziekenhuis Amsterdam 2, Huisarts Amsterdam, Apotheek de Pil
    • CareTeams: H. de Boer care team, Jan de Hoop care team, Department Thuiszorg
    • Communications: Practitioner-to-practitioner message, RelatedPerson-to-CareTeam message
    • CommunicationRequests: Thread example
    • Tasks: Practitioner Manu example, Practitioner Mark example, RelatedPerson example
    • AuditEvents: System access, Practitioner access (Manu and Mark), RelatedPerson access, REST operations (create, search, update failure)
    • Device: OZO AAA Proxy device for audit logging

Infrastructure

  • Added aliases.fsh with common system and profile aliases
  • Established FSH-first authoring workflow