<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:nexus="https://fhir.apps.health/ns/releases"><channel>
    <title>Nexus IG releases</title>
    <link>https://well-polaris.github.io/nexus-ig/changelog.html</link>
    <description>Every release of the Nexus IG (FHIR 4.0.1). Each item links the release notes and attaches the FHIR NPM package.</description>
    <language>en</language>
    <item>
      <title>Nexus IG 1.25.1</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1251-2026-09-10</link>
      <guid isPermaLink="false">health.apps.nexus-1.25.1</guid>
      <pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.25.1.tgz" length="1263014" type="application/gzip"/>
      <description><![CDATA[<ul><li><code>Consent.policyRule</code> is no longer fixed to <code>cric</code> on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-app-consent.html">app consent</a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-item-consent.html">item consent</a>; both now require <code>policy.uri</code> instead. <code>consentpolicycodes#cric</code> is 45 CFR 46 -- the United States Common Rule for informed consent in human-subjects research. It is not a communication-preference policy, not a data-sharing policy, and not Canadian, and the code system it belongs to contains no Canadian concept at all: its 27 codes are US federal and state instruments plus three European ones. Rather than substitute another wrong code, both profiles now name the actual governing policy by URI, which satisfies R4's <code>ppc-1</code> invariant and is jurisdictionally accurate. Consumer action: a writer that emitted the fixed <code>policyRule</code> must emit <code>policy.uri</code> carrying the applicable policy instead; a reader that keyed on <code>cric</code> to recognise a Nexus consent must key on <code>category</code>. Every shipped example is migrated in this release.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-communication.html"><code>Communication.sender</code> and <code>.recipient</code></a> now admit <code>RelatedPerson</code>. Rights over a record are exercisable by an individual and their substitute decision-makers, and a proxy must not be flattened onto the Patient: where a right is exercised by proxy the record has to show that authority was delegated, because that is what gets examined when the exercise is challenged. Consumer action: a reader that switched exhaustively on the reference target type of <code>sender</code> or <code>recipient</code> will meet a type it has not seen. Widening a reference is breaking for consumers even though it is additive for writers.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-item-consent.html">Item consent</a> moves its decision from <code>status</code> to <code>provision.type</code>, and stops writing <code>rejected</code>. Provided is now (<code>status = active</code>, <code>provision.type = permit</code>); Declined or withdrawn is (<code>status = active</code>, <code>provision.type = deny</code>). <code>provision</code> moves from <code>0..1</code> reserved-and-unused to <code>1..1</code> with a required <code>type</code>. Consumer action: a reader that tested <code>status = 'active'</code> for Provided and <code>status = 'rejected'</code> for Declined must read <code>provision.type</code> instead. A reader that treated any non-<code>active</code> status as "not permitted" now sees <code>active</code> on a declined item and will read it as permission unless it changes. Every shipped example is migrated in this release.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-app-consent.html">App consent</a> moves its decision to the root <code>provision.type</code>. Refusal was a nested provision with <code>type = deny</code>; a grant was the absence of one. Both are now stated on <code>provision.type</code> at the root, which is <code>1..1</code>. Consumer action: a reader that walked the provision tree looking for a nested <code>deny</code> must read the root <code>provision.type</code>. A writer that expressed a grant by omitting the nested denial must now state <code>permit</code>.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaireresponse.html"><code>QuestionnaireResponse</code></a> is now listed in the server capability statement. The profile has declared read-only SMART exposure since the release that gave every scope a reachable permission, but the statement did not list the type, so a scope naming it resolved to nothing and an application asking for it was refused. Read-only: an application that could rewrite a response could rewrite an answer after the fact. Consumer action: none for existing clients. An application that previously had <code>questionnaireresponse:read</code> refused may now be granted it. FHIR-465.</li><li>[<code>Consent.category[item]</code>](fhir/StructureDefinition-nexus-emr-core-item-consent.md) moves from <code>1..1</code> to <code>0..1</code>. It is no longer the only way an item consent identifies its item: a clinic-defined item carries no catalogue coding at all, and identifies itself on the new <code>clinicDefined</code> slice instead. The new <code>item-consent-item-is-identified-once</code> invariant (error) keeps exactly one of the two slices present, so no resource is left identifying nothing. Consumer action: a reader that reached straight for <code>category[item]</code> and assumed it was present must handle its absence, and must read the item from <code>category[clinicDefined]</code> -- the tenant coding for the code, and <code>text</code> for the label -- when it is the slice in play. A reader that treated the catalogue coding's absence as malformed will now reject valid item consents. Separately, a consumer that LISTS a patient's items must add <code>http://loinc.org|59284-0</code> to its <code>category</code> search or every clinic-defined item will read as Not Recorded. Writers are unaffected: a governed item consent is written exactly as before. FHIR-466.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference.html"><code>DocumentReference</code></a> gains a status reason: the new <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-document-status-reason.html"><code>nexus-document-status-reason</code></a> extension (<code>0..1</code>, free text) is sliced onto the profile as <code>statusReason</code>, carrying why a document was marked <code>superseded</code> or <code>entered-in-error</code>. R4 <code>DocumentReference</code> has no <code>statusReason</code> element, and the code alone cannot say whether a retired consult was replaced by a corrected copy or filed on the wrong chart. The reason rides the version that recorded it -- the store's version history is the audit of who changed the status, when, from what to what, and why</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationstatement.html"><code>MedicationStatement</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationdispense.html"><code>MedicationDispense</code></a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-familymemberhistory.html"><code>FamilyMemberHistory</code></a> now declare salient fields, so all three gain synthesized accessors and a Salient fields tab, and a consumer rendering them into a chart or an LLM context is reading the profile's own statement of what matters rather than the whole envelope. Until now these three declared none: they were reachable and validated, but had no reader surface, so they arrived as bare elements. The sets are <code>medication</code> / <code>status</code> / <code>dosage</code> / <code>effective</code> / <code>asserted</code> / <code>reason_code</code> on MedicationStatement, <code>medication</code> / <code>status</code> / <code>quantity</code> / <code>days_supply</code> / <code>handed_over</code> / <code>dosage</code> on MedicationDispense, and <code>relationship</code> / <code>status</code> / <code>date</code> / <code>condition</code> / <code>deceased</code> on FamilyMemberHistory. The two medication sets deliberately mirror <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationrequest.html"><code>MedicationRequest</code></a> where they overlap, so one drug vocabulary covers prescribed, reported and dispensed. Additive only -- no element, cardinality or binding changes, and nothing a current consumer reads moves. Two of them collapse a repeating element and say so in their <code>comment</code>: <code>condition</code> is the FIRST recorded condition's code, and <code>deceased</code> reads only the boolean arm of <code>deceased[x]</code>, so a relative whose death is recorded as an age or a date leaves it absent. Absent means "not stated in that form", never "no". FHIR-355.</li><li><code>Appointment.participant.type</code> is documented and Must Support, with the participation type each actor carries — <code>PART</code> (Participation) on the patient, <code>PPRF</code> (primary performer) on the provider, both inside the bound <code>encounter-participant-type</code> value set. Consumers outside this ecosystem read the type rather than the referenced resource type, and Ocean drops a patient participant that has none, so an untyped booking never reaches its reminders list. No constraint is tightened: the element stays <code>0..</code> on the base extensible binding, and the four appointment examples now carry it. No ticket yet. Every reportable field now has an identity, and this specification is where it lives. Three new code systems: <a href="https://well-polaris.github.io/nexus-ig/fhir/CodeSystem-nexus-field.html">Nexus Field</a> carries 458 concepts, one per reportable field, coded <code>&lt;category&gt;.&lt;field&gt;</code>; <a href="https://well-polaris.github.io/nexus-ig/fhir/CodeSystem-nexus-field-category.html">Nexus Field Category</a> carries its 21 domains and <a href="https://well-polaris.github.io/nexus-ig/fhir/CodeSystem-nexus-field-subcategory.html">Nexus Field Subcategory</a> the 73 groups inside them. A field concept declares 26 properties and carries 24: where the field sits in the picker, which element and profile realise it, its data type, cardinality and repeat semantics, the code and the code system that identify it within its resource -- by name in <code>clinicalCodeSystem</code> and by canonical URI in <code>codeSystemUri</code> -- its expected unit, the permission needed to read it, how strongly it identifies a person, whether it is computed rather than stored, and the comparison family a report builder should offer, and -- where the path alone does not identify the field -- which entry of a repeating element it means (<code>selector</code>) and under what condition on the resource (<code>gate</code>). English displays sit beside fr-CA designations. Renamed before release: these three were <code>nexus-reporting-criteria</code>, <code>nexus-reporting-category</code> and <code>nexus-reporting-subcategory</code> when they first landed on <code>main</code>. They never appeared in a cut release, but they were on <code>main</code> for a day and were announced internally under those names, so anything written against them in that window needs re-pointing: the ids and canonical URIs above, and the <code>criteriaCode</code> key in <code>reporting-catalog.json</code>, which is now <code>fieldCode</code>. Codes, concepts, properties and the <code>&lt;category&gt;.&lt;field&gt;</code> shape are unchanged -- only the three system names and that one key moved. The reason is that the concepts are reportable FIELDS: a criterion is a field plus an operator plus a value, and these carry only the field. <code>nexus-reporting-picker-id</code> and its ConceptMap keep their names, because they genuinely are the frozen record of what the report builder's picker shipped. One field's CONTENT changed, and it is not part of the rename. <code>demographics.sociodemographic-equity-set</code> moved from <code>pending</code> to <code>mapped</code>: it gained <code>fhirPath: Observation.value[x]</code> and an <code>elm</code> mapping from a source change already on <code>main</code>, and the regeneration in this release is where that surfaces. It is named here because it was not attributable from the diff, which otherwise reads as a rename touching a generated table. As first generated it projected UNGATED. <code>Observation.value[x]</code> with no code discriminator writes every Observation's value into the equity-set columns -- unlike <code>occupation</code> beside it, which gates on LOINC 11341-5 -- and that is not a narrower value but a value belonging to a different question. The projection now REFUSES it: the columns exist in the marts and stay NULL, with the reason named in the generated header, under the rule that an entry reading <code>Observation.value[x]</code> with no usable code is refused rather than emitted. Making the field project needs a code discriminator stated upstream on the concept; it is not something the projector can decide. <code>codeSystemUri</code> is the machine-readable half of <code>clinicalCodeSystem</code>, and it is deliberately incomplete. A projection that filters on a coded criterion has to emit <code>system</code> and <code>code</code> together; a display name like <code>LOINC</code> or <code>CDS-S CT-012 Phone Number Type</code> cannot be matched against stored data, so a consumer had to keep its own name-to-URI table and every consumer kept a different one. 104 of the 138 concepts that name a code system now carry its canonical. The other 34 do not, because their <code>clinicalCodeSystem</code> names more than one system (<code>CVX / Health Canada DIN</code>, <code>LOINC (observation code); SNOMED CT (value)</code>) or names a table with no established canonical (the CDS-S concept tables, <code>ICD-9-CA</code>, CA Baseline birth sex). A guessed canonical is worse than an absent one -- it produces a query that matches nothing and reports zero rows rather than failing -- so where the system is not certain the property is absent, and absence means "not established", never "none". Before this there was no identifier for a reportable field at all. Consumers keyed on a domain number and a prose name, or on ordinals minted from a design mock, so nothing could be joined and a stored report survived a rename by luck. A code here is permanent. Adding one is routine; removing or renaming one invalidates every stored report and cohort that carries it, so retirement is <code>status = deprecated</code> plus <code>replacedBy</code>, and the release checks refuse a concept-level removal. <code>identifierClass</code> is a first pass and is not yet a masking control. It says whether a field identifies a person directly, narrows a population, or neither, which is what a de-identified export needs to key on. It was assigned by rule and classified up wherever it was arguable. It has not been through privacy review, and nothing should rely on it to mask until it has. The same caution applies to the fr-CA designations: coverage is complete at 458 of 458, but none of it has been through linguistic review, and complete is not the same as correct. That is why these systems ship as draft. Element prose was carrying the wrong things, and 21 profiles were corrected. <code>short</code> is a one-line summary of what an element IS -- the same contract <code>SalientField</code> states for its own prose</li><li>A form template can say which of its fillable fields a chart value pre-fills -- the new <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-form-template-field-mapping.html"><code>nexus-form-template-field-mapping</code></a> extension on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference.html"><code>DocumentReference</code></a> (PSD-1594): a list of rules, each naming a fillable field of the template's file by its AcroForm field name, verbatim, and the chart value that fills it, coded from the new <a href="https://well-polaris.github.io/nexus-ig/fhir/CodeSystem-nexus-form-chart-value.html"><code>nexus-form-chart-value</code></a> code system (<a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-form-chart-value.html">value set</a>: <code>patient.fullName</code>, <code>patient.firstName</code>, <code>patient.lastName</code>, <code>patient.birthDate</code> with its <code>.day</code> / <code>.month</code> / <code>.year</code> parts, <code>patient.gender</code>, <code>patient.phone</code>, <code>patient.address</code> with its <code>.street</code> / <code>.city</code> / <code>.province</code> / <code>.postalCode</code> parts, <code>patient.socialInsuranceNumber</code>, <code>patient.healthNumber</code> with its <code>.number</code> / <code>.versionCode</code> parts, and <code>patient.mrp</code>, the most responsible provider). A form started from a mapped template opens with those fields filled from the chart and every value still editable; an unmapped field, or one whose value cannot be resolved, stays blank. Rules are keyed by field name rather than widget because a name can be drawn on several pages and every widget carrying it is filled. The binding is extensible -- a deployment may carry a key the set does not list yet, and a reader that does not know a key leaves the field blank. Only a template carries the extension: the new <code>nexus-documentreference-field-mapping-only-on-template</code> invariant refuses it on any other document. The system-provisioned WSIB Form 8 template ships mapped; its example carries the full rule list. &lt;!-- PSD-993 --&gt;</li><li>The <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-reviewed.html">Reviewed</a> extension's context widens to <code>DocumentReference</code>: a document now carries who signed it off and when, on the resource the question is asked about, so a reader renders the checkmark from the document alone rather than joining to the review task. It repeats there — a document is assigned to reviewers individually, and each stamp is one reviewer signing off for themselves. Absent still means unreviewed.</li><li>New <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-resource-note.html">Resource Note</a> extension: an attributed note on a resource with no <code>note</code> element of its own, anchored at <code>DomainResource</code> so every such resource gets the same thread the same way. Each repeat is one <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-task-note.html">Task Note</a> turn — author and time required, machine authors as identifier-only references — and the thread is append-only, read oldest first by <code>time</code>. First use: the comment thread on a document, riding the <code>DocumentReference</code> itself, so reading the thread is reading the resource. Where a resource defines a native <code>note</code> element, that element remains the home.</li></ul>]]></description>
      <nexus:version>1.25.1</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>false</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.25.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1250-2026-08-31</link>
      <guid isPermaLink="false">health.apps.nexus-1.25.0</guid>
      <pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.25.0.tgz" length="1058451" type="application/gzip"/>
      <description><![CDATA[<p><strong>This release contains a breaking change.</strong></p><ul><li>The site build is 43% faster and the published site four times smaller, from four Material navigation features -- <code>navigation.prune</code>, <code>navigation.instant</code>, <code>navigation.instant.prefetch</code> and <code>navigation.instant.progress</code>. Measured on this branch with the pre-build hook disabled, so the numbers are mkdocs alone: 24.3s -&gt; 13.9s, and 650 MB -&gt; 158 MB on disk. Once the validator is off the path (<code>publish --fast</code>), the site build is the release cost. The navigation was 61% of every page. Material renders the whole site's nav into all 1,203 pages, so the largest reference page shipped 519 KB of nav and 1,701 links before a byte of its own content. <code>prune</code> emits only the active branch plus its ancestors and siblings; a cousin profile collapses to one link. It touches nav markup and nothing else -- <code>sitemap.xml</code>, the search index and the <code>&lt;article&gt;</code> of all 1,207 pages are byte-identical to the unpruned build, so no published URL moves and the URL and fragment gates are unaffected. What it costs and what pays it back. A cousin profile becomes a link rather than an in-place expander, so reaching a different profile costs a navigation instead of a free CSS toggle. <code>navigation.instant</code> turns that navigation into an XHR content swap rather than a document reload, <code>.prefetch</code> starts the fetch on hover, and <code>.progress</code> shows a bar past 400ms. Handbook pages render identically either way: what <code>prune</code> strips there is the reference tree that was in the DOM but hidden behind a tab.</li><li>A second 29% off the site build by removing an extension and a plugin that did nothing: <code>include-markdown</code> and <code>codehilite</code>. 14.8s -&gt; 10.5s, output byte-identical. Profiling the build rather than guessing is what found them: <code>include-markdown</code> ran <code>on_page_markdown</code> across all 1,203 pages scanning for a directive that appears in no page and never has (the includes in use are <code>pymdownx.snippets</code> <code>--8&lt;--</code> markers), and <code>codehilite</code> is an alternative to <code>pymdownx.highlight</code> rather than a layer under it, so registering both left the second one inert. Together with the navigation work above, a strict site build is now ~31s -&gt; ~16s end to end.</li><li>The site build is stock MkDocs now: no plugins beyond search, no <code>hooks:</code>, no <code>watch:</code>. Navigation moves from the <code>mkdocs-awesome-nav</code> plugin's per-directory <code>.nav.yml</code> files to one ordinary <code>nav:</code>, assembled by <code>bin/gen-nav.ts</code> from an authored <code>src/nav.yml</code> plus the generated reference tree and read through mkdocs' own <code>INHERIT</code>. Rendering <code>docs/fhir/</code> moves from the pre-build hook into <code>bin/site.ts</code>. Output is byte-identical. We were using none of awesome-nav's features -- no globs, no sort, no flatten, no hide -- only its ability to split the nav across directories, while the reference tree that is 96% of the entries was generated regardless. Removing it produced an identical 1,207-page site. <code>hooks:</code> and awesome-nav were the two things tying this site to MkDocs. Material for MkDocs reaches end of life on 5 November 2026 and its successor, Zensical, supports neither yet. Nothing here commits us to that migration; it removes what would have blocked it, and it costs one dependency and one Python file rather than adding anything. <code>doc/fhir/bin/</code> is now Python-free. What it costs, named. <code>mkdocs serve</code> no longer re-renders <code>docs/fhir/</code> when the IG source changes, so a bare <code>mkdocs build</code> is no longer self-sufficient -- <code>npm run site</code> is the entry point, and <code>npm run site-kick</code> restarts the server after an FSH or <code>src/pages</code> edit. Edits under <code>docs/</code> live-reload as before. <code>INHERIT</code> is resolved at config load, before any hook could run, so the nav could never have been written from a hook anyway; the build gate grew a <code>nav is current</code> check so a stale nav fails loudly instead of publishing pages with no sidebar, which mkdocs reports only as INFO.</li><li><code>check-blast-radius</code> resolves the base branch instead of assuming <code>origin/main</code>. IG releases stack -- 1.23.0 -&gt; 1.24.0 -&gt; 1.25.0, each PR based on the last -- and against <code>main</code> a stacked branch inherits every unmerged parent's diff. This branch measured 1,687 changed files that way, of which 1,295 were a single 1.23.0 commit untracking the rendered pages and only 67 were its own. A reviewer reads a number like that as noise, which is the exact failure the gate exists to prevent. The base now resolves in order: <code>--base</code>, then <code>GITHUB_BASE_REF</code> (set by GitHub Actions on a pull_request event, and authoritative there), then <code>gh pr view</code> for the current branch, then <code>origin/main</code>. Every path is printed, including the fallback, because a wrong base fails silently in both directions -- too far back and the diff drowns, too far forward and real changes stop being counted.</li><li><code>check-blast-radius</code> gains a declared-IG-consumer list, and <code>NativeFHIR/seed-generated.sh</code> is its first entry. That script reads <code>igVersion</code> and <code>sourceContentHash</code> out of the generated meta to decide whether a cached seed dataset is stale -- it is the only one of NativeFHIR's eleven files that reads any of it, and IG releases have legitimately edited it before (1.20.0, and again this release after 1.23.0 deleted the <code>sourceCommit</code> field it had been reading). The test is "does this file read the IG's generated metadata", not who owns it: ownership is what the gate prints so you know who to ask, and it moves. Declared consumers are counted and printed but do not fail the gate, because an exemption nobody can see is one nobody re-examines.</li><li><code>set-version</code> stamps one site it used to miss; sixteen other version stamps were deleted instead. Cutting this candidate found seventeen places still naming 1.24.0: five <code>using Nexus version '&lt;v&gt;'</code> declarations and all twelve measurement-catalog <code>ObservationDefinition-.json</code> resources. Only one of the seventeen turned out to be worth keeping. Neither set was silent by accident. <code>ts/test/cql-model-version.test.ts</code> exists because the <code>using</code> bump "was made four releases running, and the fourth is the one that shipped"; <code>ts/test/measurements.test.ts</code> recorded the catalog stamp being walked by hand through 1.21.0</li><li>The measurement catalog drops its <code>version</code> field entirely, and says plainly that it is test data. Twelve <code>ObservationDefinition</code> resources that exist to exercise the CQL engine's unit-vouching -- that a unit-bearing threshold is refused unless something vouches for the convention. Nothing in production consumes them: no service outside TypedFhir imports the module, and every caller of <code>compileToTrigger</code> that passes a catalog is a test or a test-golden generator. Defining measurements for production is expected to be a richer mechanism that has not been designed. The field tracked nothing and was read by nothing -- the catalog keys entries on <code>code|system</code> and never looks at it -- so it was noise with a maintenance cost. <code>measurements.test.ts</code> now asserts the field stays absent, with the reasoning in the test, so it cannot creep back as a stamp. <code>gen-measurements.ts</code> no longer reads <code>igVersion()</code> at all, and the module and generator headers now say what the content is for rather than describing an unbuilt deployment/tenant resolution model as though it existed. See FHIR-102 for the related finding that these resources' canonicals are declared nowhere -- which this reframes: they are test fixtures, so the question is whether they should be in the <code>fhir.apps.health</code> namespace at all.</li><li>Two Handbook pages were orphaned from the navigation and are now in it: <code>guide/features/scheduling/converter-contracts</code> and <code>guide/features/scheduling/oscar-template-schema-notes</code>, both FHIR-18/FHIR-19 working notes for the Oscar-side converter owners. A page absent from the nav renders with no sidebar in mkdocs-material, and mkdocs reports that as INFO rather than a warning, so <code>strict: true</code> stayed green while they published unnavigable. Both are still marked Draft.</li><li>BREAKING -- TypedFhir's multi-IG selector is gone. If you pass <code>ig:</code> to any ingest entry point, or read <code>igKey</code> / <code>ig_key</code> off a report, remove it. <code>fhirToResources</code>, <code>fhirToResourcesLenient</code> and their Python twins no longer accept an <code>ig</code> argument, <code>DecodeReport</code> no longer carries the key, and <code>DEFAULT_IG</code> / <code>resolveKey</code> / <code>resolve_key</code> / <code>registeredIgKeys</code> are no longer exported. <code>getIg()</code> takes no argument. Callers that never passed a selector -- which is every caller we can find -- need no change. Why. Nothing selected a second IG. The .NET port never implemented the selector at all; no service, no frontend and no generator passed one; and the only non-default consumer in the tree was the <code>synthetic-v1.0.0</code> fixture, which existed to prove multi-IG selection worked. A capability whose sole user demonstrates that capability is not one. What it was costing. The <code>&lt;igId&gt;-v&lt;version&gt;</code> key put the IG version into two hand-maintained registries and two pinned tests, and needed a key-vs-generated-meta agreement check to catch the drift those literals invited. Removing it removes all five.</li><li>The IG version is no longer written anywhere by hand. There were nine version sites -- eleven occurrences across prose, worked CQL examples, the two registries and three pinned tests -- each walked forward every release, each having drifted at least once. All nine are gone: <code>ts/codegen/lib/ig-specs.ts</code> derives from the compiled IG via <code>igVersion()</code>; <code>ts/test/ig.test.ts</code> compares <code>IG_META.igVersion</code> to the same source rather than to a literal; the guide's worked criterion declares bare <code>using Nexus</code>, as the <code>DM-01-nexus</code> fixture always did; and <code>README.md</code> no longer pins a version. <code>sushi-config.yaml</code> is the only place a version is written, and the generated stamps are asserted against it.</li><li><code>docs/theme/js/tab-anchors.js</code>, dead since 1.16.0. It activated ancestor content tabs so an inbound <code>#inv-&lt;key&gt;</code> anchor landed on content the reader could actually see; one page per tab made every view separately addressable and dropped the script's <code>extra_javascript</code> entry in that release, leaving the file orphaned and loaded by nothing. Confirmed unnecessary rather than merely unwired: across all 1,204 content pages 26,481 fragment links resolve to visible content, none missing and none inside an unselected tab, and exactly one page in the site -- the hand-written CQL artifacts guide -- still uses a content tab at all.</li></ul>]]></description>
      <nexus:version>1.25.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>true</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.24.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1240-2026-08-29</link>
      <guid isPermaLink="false">health.apps.nexus-1.24.0</guid>
      <pubDate>Sat, 29 Aug 2026 00:00:00 +0000</pubDate>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.24.0.tgz" length="1058466" type="application/gzip"/>
      <description><![CDATA[<ul><li>A machine-written <code>Task</code> declares WHO produced it, on <code>requester</code> -- two new identifier authorities, <code>NamingSystem/nexus-cds-rule</code> (a decision-support rule) beside the existing <code>NamingSystem/nexus-harness-graph</code> (an AI-harness graph). Both are used the same way, as a logical <code>Device</code> reference: <code>Reference.type = "Device"</code> plus <code>Reference.identifier</code> under the producing registry's namespace, resolving to no <code>Device</code> resource on the server. A consumer telling producers apart now reads ONE declared field. (FHIR-90) Two authorities rather than one, because two separately owned registries mint these values and either could mint the same string. That is not only an attribution problem: producer identifiers feed the business keys below, and a key is SEARCHED and the resource it finds is UPDATED, so a shared namespace lets one producer's re-run overwrite the other producer's work item. The system names the registry that ISSUED the identifier, never the runtime that executed the rule -- a rule invoked as a tool from elsewhere keeps its identifier.</li><li>A decision-support rule keys its work under its own namespace: <code>NamingSystem/nexus-cds-key</code>, the exact counterpart of <code>NamingSystem/nexus-harness-key</code> and separate from it for the reason above. Same rule, and the same one way to get it wrong: the value is derived from WHAT THE TASK IS ABOUT (the patient and the gap), never from the evaluation that produced it. CDS Hooks supplies a <code>hookInstance</code> and a card uuid, and both are per-firing values that mint a fresh key every evaluation. (FHIR-90)</li><li>An attachment packet is a <code>List</code>: the ordered set of chart items assembled to travel with something going out. New profile <code>StructureDefinition/nexus-attachment-packet</code> with <code>NamingSystem/nexus-attachment-packet</code> for its identity. Membership and order are <code>List.entry</code>, <code>mode</code> is <code>working</code>, <code>subject</code> is the patient. The host points at the packet with a reference element it already has: a letter uses one <code>Composition.section.entry</code>, a referral uses <code>ServiceRequest.supportingInfo</code>. Both are <code>Reference(Resource)</code> in base R4, and <code>ServiceRequest.supportingInfo</code> is what Ontario eReferral profiles for referral attachments, so a packet is legal in each today and what this release adds is the sanction. (SD-175, SD-222) Why a <code>List</code> and not a document. R4 has a resource for exactly this shape -- <code>DocumentManifest</code>, "a collection of documents compiled for a purpose together with metadata that applies to the collection", carrying <code>content</code>, <code>recipient</code>, <code>related</code> and <code>subject</code> -- and it is REMOVED in R5, replaced by <code>List</code>. So the shape is right and the container it would ship in is a dead end. IHE MHD reaches the same place: <code>IHE.MHD.Comprehensive.SubmissionSet</code> constrains <code>List</code>, and MHD's <code>ihe-intendedRecipient</code> extension sits ON THAT LIST rather than on a document -- recipient belongs to the packet prepared for someone, not to the document, which is why <code>DocumentReference</code> gains no <code>recipient</code> element here. Modelling the packet as its host's own sections was the alternative and it does not survive contact with the second host: a <code>ServiceRequest</code> has no sections, so an eReferral would have needed a second design, and so would every other host in the requirement. <code>entry.item</code> is deliberately not type-constrained. Enumerating the kinds shipped today would reintroduce the per-type modelling this profile replaces; a consumer renders the kinds it knows and reports the ones it does not.</li><li>A packet member can say which of its pages were left out -- <code>StructureDefinition/nexus-attachment-packet-excluded-page</code> on <code>List.entry</code>, repeating, one occurrence per excluded page, 1-based. IG-defined rather than a house extension because a third-party consumer is a named future reader and can only implement what is published. One occurrence per page rather than a range expression (<code>"2-4,7"</code>): a range is a second syntax this specification would have to define and every reader would have to parse identically to agree on what was sent, where a repeating integer needs no parser and a validator can check each value alone. Page numbers are meaningful only relative to the render they were taken from -- a different renderer may paginate the same member differently -- so they record what the assembler chose, not a durable re-rendering instruction. What the recipient received is the document stored on send.</li><li>LOINC <code>28562-7</code> "Chart section Set" joins <code>ValueSet/nexus-composition-section</code>, which is what an enclosures section codes to, and a new <code>enclosures</code> code joins <code>CodeSystem/note-block-type</code> so an attachments block renders through the same dispatch as every other block. <code>28562-7</code> is <code>SCALE_TYP = Set</code> / <code>CLASS = ATTACH.CLINRPT</code>: a SECTION code. LOINC <code>11503-0</code> is the DOCUMENT code for the rendered packet PDF and belongs on <code>DocumentReference.type</code>, never in a section slot -- the distinction this value set's extensible binding exists to catch. (SD-175)</li><li><code>Task.requester</code> is the producer, and the two things it is NOT are now stated on the elements themselves. <code>intent</code> is not a machine marker -- humans raise proposals, and the element says what the owner is being asked to do. <code>groupIdentifier</code> is a DISPLAY GROUPING and nothing more: grouping is available to every producer, since a harness capability proposing several chart entries from one note is one evaluation raising a set exactly as a decision-support card is. A consumer that infers the producer from either, or from the ABSENCE of either, is reading a coincidence of current behaviour. (FHIR-90)</li><li><code>Task.identifier</code>, <code>Task.owner</code> and the Task Note profile name both producer families. <code>owner</code> admits a rule as a logical <code>Device</code> alongside a graph, while the approve/resume undertaking stays the harness's own (assigning a task to a rule promises no resume), and <code>nexus-note-agent-author</code> was widened so a rule-authored turn is held to the same identifier-only shape as a graph-authored one. (FHIR-90)</li><li><code>DocumentReference.context.related</code> is sanctioned as the BACK pointer from a rendered outbound artifact to the packet it renders and the host that packet travelled with. Ontario eReferral profiles this element the same way, so the pattern stays; what changes is that it stops being the ONLY link, now that the host carries a forward reference. Do not discover the relationship by searching it: <code>related</code> is not among the search parameters this server declares for <code>DocumentReference</code>, and an undeclared parameter is dropped silently rather than refused, so a search that appears to work may be returning the whole compartment. Resolve the reference. (SD-175)</li><li><code>NamingSystem/nexus-harness-key</code> drops its documented legacy CDS-connector key shape (<code>{hookInstance}:{cardUuid}:{suggestionIndex}</code>). It was per-firing, so it minted a fresh key on every evaluation and defeated the duplicate suppression the key exists for -- the one shape in that file that broke the file's own derive-from-the-gap rule. CDS keys now live in their own namespace (<code>nexus-cds-key</code>, above). Consumer action: a producer fed by CDS Hooks derives its key from the subject and the gap, never from the firing. (FHIR-90)</li></ul>]]></description>
      <nexus:version>1.24.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>false</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.23.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1230-2026-08-29</link>
      <guid isPermaLink="false">health.apps.nexus-1.23.0</guid>
      <pubDate>Sat, 29 Aug 2026 00:00:00 +0000</pubDate>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.23.0.tgz" length="1040800" type="application/gzip"/>
      <description><![CDATA[<p><strong>This release contains a breaking change.</strong></p><ul><li>The Patient profile gains the Indigenous-profile fields. The Indian Act registration or status number is a <code>Patient.identifier</code> under the Canadian URI Registry's official system (<code>…/ca-indigenous-northern-affairs-number</code>; 9–10-digit value or a data-absent-reason while other card facets are recorded first; the validity period carries the card's issue/expiry, and the new <code>nexus-emr-indian-status-card-type</code> extension on the identifier carries the presented document form — SCIS, CIS, or TCRD). Three optional flat extensions carry the rest: Indian Act registration status (<code>nexus-emr-indian-act-registration-status</code>) and the First Nation registry group and community (<code>nexus-emr-first-nation-registry-group</code> / <code>nexus-emr-first-nation-community</code>), both coded from the curated seed-managed band list (<code>ValueSet/nexus-first-nation-band</code>, code = federal band number). Every field is independently recordable, records what the patient states (never verified against the Indian Register), and a recorded expiry does not imply a registration-status change.</li><li>Form documents are marked, and found, by one identifier system — the new <code>NamingSystem/nexus-form</code> (PSD-1230): a <code>DocumentReference</code> carrying an identifier under <code>https://fhir.apps.health/NamingSystem/nexus-form</code> is a form, its value a kebab-case slug naming the form type (<code>wsib-form-8</code>), and a patient's forms are enumerable with the standard <code>identifier</code> search's system-only token — the marker-identifier convention <code>nexus-template</code> established, applied to <code>DocumentReference</code>.</li><li>Form templates are marked by a sibling identifier system — the new <code>NamingSystem/nexus-form-template</code> (PSD-1230): a subject-less <code>DocumentReference</code> carrying an identifier under <code>https://fhir.apps.health/NamingSystem/nexus-form-template</code> is the tenant-wide blank of a form type, its value the same slug its filed <code>nexus-form</code> instances carry, and a tenant's templates are enumerable with the same system-only <code>identifier</code> token search.</li><li>Form templates are searchable by title (PSD-1230): the server declares the standard <code>DocumentReference</code> <code>description</code> string search, and <code>DocumentReference?identifier=https://fhir.apps.health/NamingSystem/nexus-form-template|&amp;description:contains={text}</code> finds the templates whose title carries the text anywhere, case-insensitively -- so a template picker reads pages of the matches rather than the whole catalogue.</li><li>Form templates are uploaded and deleted by a tenant (PSD-1230): an uploaded template is a subject-less <code>DocumentReference</code> created with its PDF inline, <code>description</code> the title as typed, and the <code>nexus-form-template</code> marker's value the kebab-case slug of that title (<code>WSIB Form 8</code> -&gt; <code>wsib-form-8</code>) -- the form type every form later filled from it carries. A tenant holds one template per form type: an upload whose slug is already marked by a live (not entered-in-error) template is refused, so a client must probe <code>DocumentReference?identifier=https://fhir.apps.health/NamingSystem/nexus-form-template|{slug}</code> before creating. A template is removed with the standard <code>delete</code> interaction unless it carries the readonly tag (<code>https://fhir.apps.health/tags/document-reference/readonly|true</code>, the system-provisioned templates) -- those are never offered for deletion. Forms already filled from a deleted template stay on their charts: they carry the form type by slug and reference no template.</li><li>A C# consumer can ask, at runtime, which IG the package was built against. <code>TypedFhir.Facade.Generated.IgMeta</code> carries <code>IgId</code>, <code>IgName</code>, <code>IgVersion</code>, <code>FhirVersion</code>, <code>Canonical</code>, <code>SourceContentHash</code>, <code>ProfileCount</code>, <code>ValueSetCount</code> and <code>InvariantCount</code>. The TypeScript and Python ports have carried the same facts as <code>IG_META</code> for several releases; the .NET package had them only in a generated header comment, where no program could reach them. All three ports are now populated from one derivation, so they cannot disagree about their own provenance. (FHIR-93)</li><li>A form template no longer has to name a patient, and every other document still does. <code>DocumentReference.subject</code> relaxes from <code>1..1</code> to <code>0..1</code>, guarded by the new invariant <code>nexus-documentreference-subject-unless-template</code>: a <code>DocumentReference</code> SHALL carry a subject unless it carries an identifier under <code>NamingSystem/nexus-form-template</code>. A template is the tenant-wide blank of a form type and is about no patient, which is the shape the form-template guidance describes, and the profile previously required a subject on it. Read the cardinality with the invariant, not on its own -- for every document that is not a template the requirement is exactly what it was, and it is now stated in evaluable FHIRPath rather than left to a cardinality. A consumer that treated <code>subject</code> as always present must handle the template case. Stated as one invariant rather than a second profile, because a template profile answers the question once per resource type. Both form systems now ship a worked example: a filed WSIB Form 8 and its template. (FHIR-94)</li><li><code>nexus-first-nation-registry-group</code> and <code>nexus-first-nation-community</code> bind <code>required</code>, not <code>extensible</code>. The extensible binding permitted a code from any system while both definitions said a band outside the curated list could not be recorded; <code>required</code> is what the definitions describe. It costs nothing to record a band the list is missing, because <code>ValueSet/nexus-first-nation-band</code> is seed-managed reference data rather than an IG artifact -- membership updates ship as data and need no release, so a closed binding never becomes a release gate on recording a patient. (FHIR-94)</li><li><code>nexus-first-nation-community</code> now states that the band list APPROXIMATES its domain. A band is a registry group; a community is a place and a people. One band may hold several communities and reserves, and a person can affiliate with a community whose band does not hold their registration. Both extensions bind the band list because it is the only curated Indigenous reference data this specification carries. Read a <code>community</code> value as the community the patient named, resolved to a band, and never as a claim about registration. (FHIR-94)</li><li>The IG version is no longer stamped into the header comment of every generated file. It has a structured home in each port -- <code>IG_META</code> in TypeScript and Python, <code>IgMeta</code> in C# -- and that is where a consumer reads it. Generated files carrying a version string drop from roughly two hundred to eight: the IG-table modules, <code>Metadata.cs</code> and <code>PatientCompartmentMap.cs</code>, each of which has a better claim to naming its IG than a per-resource facade does. No API moves; the affected lines are banner comments. (FHIR-93)</li><li>BREAKING for library consumers: <code>IG_META.sourceCommit</code> is removed from <code>@awaremd/typed-fhir</code> and the Python package. Consumer action: read <code>IG_META.sourceContentHash</code> instead -- a <code>sha256:&lt;hex&gt;</code> digest of the IG artifacts the tables were generated from, which is what a provenance stamp is for and which this release does not otherwise change. <code>sourceCommit</code> was derived from the source repository's commit log and was unsatisfiable by construction: it named a commit that did not exist until after the commit carrying it was made, so it could never be correct in a working tree. Nothing in the published surface read it. The field-dictionary manifest, the delta register and the seed-generator manifest move their <code>ig</code> block from <code>sourceCommit</code> to <code>sourceContentHash</code> for the same reason. Named as breaking here rather than signalled by the version number, per this changelog's own rule: versions are sequential, not SemVer, and the entry carries the compatibility contract. The consumer action is one field name. (FHIR-93)</li></ul>]]></description>
      <nexus:version>1.23.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>true</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.22.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1220-2026-08-26</link>
      <guid isPermaLink="false">health.apps.nexus-1.22.0</guid>
      <pubDate>Wed, 26 Aug 2026 00:00:00 +0000</pubDate>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.22.0.tgz" length="1037159" type="application/gzip"/>
      <description><![CDATA[<p><strong>This release contains a breaking change.</strong></p><ul><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-imaging-modality.html"><code>Imaging Modality</code></a> -- modality on the report, because the withdrawal of <code>ImagingStudy</code> left the requirement with nowhere to go. Modality is an <code>ImagingStudy</code> property in R4, and this guide no longer profiles that resource; the imaging capability that requires it (ON RFP 1.5.4.2) did not go away with it. <code>0.. MS</code> on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-diagnosticreport.html"><code>DiagnosticReport</code></a>, repeating so a PET-CT report says two rather than choosing. It describes the DOCUMENT, not an acquisition. Saying a report came from a CT asserts nothing about series, instances or SOP UIDs, and needs no PACS to be honest about -- which is what lets this estate record modality while still declining to model <code>ImagingStudy</code>. <code>DiagnosticReport.code</code> is not a substitute, and that is the objection worth answering. A human reader infers modality from "Chest X-ray"; a results list filtering "show me the CT reports" cannot, without maintaining a procedure-to-modality mapping outside the record and getting it wrong silently. An implied fact every consumer must re-derive is not a recorded fact. Bound extensible to DICOM CID 29 -- the same value set and the same strength R4 binds <code>ImagingStudy.modality</code> to, so a consumer that already knows R4's imaging model needs no second rule, and heritage feeds carrying local modality codes stay conformant.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/CodeSystem-nexus-composition-type.html"><code>Nexus Composition Type</code></a>, for the document kinds LOINC cannot name. Three generated-summary kinds exist in production and a consumer has to tell them apart: <code>nexus-daysheet-summary</code> (written ahead of a clinic for a booked patient), <code>nexus-interval-summary</code> (what happened between two points in time) and <code>nexus-encounter-recap</code> (one encounter, after it). All three are LOINC 34133-9 as a CLASS and none is distinguishable from the others by any LOINC code -- and they are not interchangeable, since a recap asserts that the encounter it covers took place. Plus <code>nexus-letter-template</code>, so the retired <code>http://services.well.com/fhir/categories/letter-template</code> has a home on this guide's base if one is still needed (templates are <code>List</code> as of 1.18.0, so check first).</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-meta-updated-by.html"><code>Meta Updated By</code></a>, an extension this EMR has been writing undeclared on <code>Resource.meta</code> since before this guide described it. It names the user account that last wrote a version, so a version list can say who touched each row without fetching a <code>Provenance</code> per row. It is a display convenience, not an audit record -- anything reasoning about authorship should read <code>Provenance</code>. The value is an identity-provider subject (<code>auth0|...</code>), NOT a <code>Reference</code>: it names an account, not every writer has a <code>Practitioner</code>, and a dangling reference would be worse than a string a consumer can match on. Like the two note extensions above it publishes at this guide's base while production still writes <code>http://services.well.com/fhir/StructureDefinition/UpdatedBy</code>. This one differs in a way that matters: it rides <code>meta</code> on every version of every resource ever saved, so the old address does not stop appearing when writers move -- it stops appearing on NEW versions, and history keeps it. Readers should plan to see both indefinitely and match on the URL suffix.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-first-nation-band.html"><code>First Nation Bands</code></a> and the <a href="https://well-polaris.github.io/nexus-ig/fhir/CodeSystem-nexus-first-nation-band.html"><code>First Nation Band CodeSystem</code></a> behind it -- a canonical this guide bound two extensions to and declared nowhere. The First Nation registry group and community extensions added in 1.21.1 bind <code>https://fhir.apps.health/ValueSet/nexus-first-nation-band</code>, and nothing published it, so a consumer reading either extension could not discover the value domain and the link did not resolve. The canonical is unchanged: it is the one the EMR already writes, declared rather than minted, so no stored <code>Coding</code> moves. The content stays out (<code>content = #not-present</code>). The membership is the Indigenous Services Canada band list, held as seed-managed reference data on the same footing as the curated problem and procedure lists, and it changes on that list's schedule rather than this guide's release schedule. This publishes the system's identity and leaves its content where it lives, so an expansion is available only from a terminology server loaded with that seed. Both bindings are <code>extensible</code>, which is the honest strength: a band absent from the curated list cannot be coded. The code is the federal band number and the display is the band name as registered. Band names beginning with a literal <code>?</code> are the names as registered, not encoding damage, and sort before "A" under ordinal comparison. The Canadian URI Registry names the same registry for IDENTIFIER use as <code>.../NamingSystem/ca-federal-firstnation-band-id</code>; this system is the CODING view of the same registry, which is why the two URLs differ and both are correct.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-composition-block-type.html"><code>Composition Block Type</code></a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-composition-block-data.html"><code>Composition Block Data</code></a>, the two extensions a block-authored encounter-note section carries, together with the <a href="https://well-polaris.github.io/nexus-ig/fhir/CodeSystem-note-block-type.html">Note Block Type</a> code system and <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-note-block-types.html">Note Block Types</a> value set the first of them binds. The note body is authored in a block editor -- an ordered stack of independent pieces, each with its own identity, heading and kind -- and the EMR has been writing that shape undeclared. A block is one <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.section"><code>Composition.section</code></a>: <code>section.id</code> is its identity, <code>section.title</code> its heading, <code>section.text</code> its narrative, and R4's own ordering of <code>section</code> carries the sequence. A block raised and left blank is kept, with an <code>empty</code> narrative and an <code>emptyReason</code> of <code>notstarted</code>, because the gap is part of what the author wrote. This is the block surface returning on the terms 1.14.0 set for <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html">Composition</a> itself: there is a committed consumer. It is not the shape 1.11.0 withdrew. That one nested sections recursively and carried its kinds in a complex extension whose slicing was among the unevaluable-slicing defects the removal cleared; these are two flat extensions on an ordered, non-recursive <code>section</code>. It does enumerate block kinds as <code>nexus-emr-embedded-section-types</code> did, and the difference is what is enumerated: one kind that has shipped, rather than four that had not. The narrative is authoritative, and that is the invariant to build on. Every block-authored section carries its content in <code>section.text</code> whatever its kind, so a consumer that ignores both extensions reads a correct, complete note. A block kind that puts clinical content in the structured value and nothing in the narrative is malformed however well it round trips. The block-kind vocabulary is <code>extensible</code>, and a reader that meets a kind it does not know must write that kind back unchanged. Every block-authored section declares its kind, <code>text</code> included; a section carrying no kind at all predates the extension and reads as <code>text</code>, which is tolerance for data filed before block authoring existed rather than a default, and is retirable once no such section remains. <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-note-block-types.html"><code>Note Block Types</code></a> is how a kind becomes NAMED -- a writer whose kind is listed uses that code rather than a synonym -- but a kind the guide has not named yet is conformant. Rendering an unrecognised kind as text is correct; storing <code>text</code> in its place is data loss. Both extensions are <code>draft</code>, and the vocabulary grows as kinds ship rather than ahead of them. Both extensions publish under this guide's canonical base, <code>https://fhir.apps.health/StructureDefinition/...</code>. They were first minted under <code>http://services.well.com/fhir/...</code>, the hostname three older <code>Composition</code> extensions in the same library already use, and were moved before publication -- the only moment that move was free, since no note carrying either had been filed. Published canonicals are forever, and from this release these are published.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-composition-billing.html"><code>Composition Billing</code></a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-composition-ehr-share.html"><code>Composition EHR Share</code></a>, two extensions this EMR has been writing undeclared. Billing raised at note closeout (the service code, the diagnostic codes supporting it, and units where the fee code is charged per unit), and one record per completed share of a signed note to an EHR outside the practice. Both were live on filed notes while this guide described neither, so a reader saw a <code>Composition</code> profile with no billing concept and no sharing concept at all. These are declared at this guide's canonical base, which is NOT the URL the software writes today. Production emits them under <code>http://services.well.com/fhir/StructureDefinition/...</code>; they publish here under <code>https://fhir.apps.health/...</code>. The block extensions added above could simply be moved, because nothing had been filed against them yet. These have live clinical data behind them and cannot be moved by editing a constant, so the specification states where they belong and the implementation is knowingly behind it on the URL. Writers: write the canonicals declared here. Readers: expect both for as long as filed notes carry the old address. Matching on the URL suffix (<code>composition-billing</code>, <code>composition-ehr-share</code>) reads both; resolving only the canonical silently misses billing and sharing on every note written before the writers move.</li><li>Twenty-four conformance rules that the generated validators reported as unverifiable are now CHECKED at runtime, in all three ports. The unverifiable set goes from 36 to 12. Consumer action: a resource that carries one of these defects now raises an error where it previously produced an <code>invariant-unverifiable</code> note. Every one of them was already enforced by the HL7 validator, so a resource that passed a full FHIR validation is unaffected; what changes is that the in-process validator no longer needs a second tool to see them. Callers that cannot absorb a new error use <code>validate()</code> and triage the issues rather than <code>assertValid()</code>. Newly checked: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-appointment.html"><code>Appointment</code></a> <code>app-2</code> / <code>app-3</code>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-appstate.html"><code>Basic</code></a> <code>app-state-system-inv</code>, the nine <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationrequest.html"><code>MedicationRequest</code></a> <code>tim-</code> dosage-timing rules, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-organization.html"><code>Organization</code></a> <code>org-1</code>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaire.html"><code>Questionnaire</code></a> <code>que-1</code> / <code>que-10</code> / <code>que-13</code>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaireresponse.html"><code>QuestionnaireResponse</code></a> <code>qrs-1</code>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-riskassessment.html"><code>RiskAssessment</code></a> <code>ras-1</code>, the three "resolves to a contained Bundle" rules this guide states itself -- <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-template-list.html"><code>List</code></a> <code>nexus-template-entry-is-contained-bundle</code>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html"><code>Task</code></a> <code>nexus-sugg-2</code> and <code>Questionnaire</code> <code>questionnaire-extract-bundle-is-contained</code> -- and the three "that contained Bundle is a transaction" rules beside them: <code>List</code> <code>nexus-template-bundle-is-transaction</code>, <code>Task</code> <code>nexus-sugg-3</code> and <code>Questionnaire</code> <code>questionnaire-extract-bundle-is-transaction</code>. Also newly checked, and an element rule rather than an invariant: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html"><code>Composition</code></a> <code>section.text.status</code>, which R4 requires at 1..1 and which nothing here checked -- a section written as <code>{"text": {"div": "..."}}</code> passed this library and failed a full FHIR validation. The profile adds no constraint; it restates the base cardinality so the generated validators can see it. No profile changed. These are the same published rules, checked where they were previously only reported. The compiled FHIRPath subset gained membership (<code>in</code>), union (<code>|</code>), <code>%resource</code>, <code>%ucum</code>, <code>substring()</code>, numeric addition, boolean literals, <code>trace()</code>, <code>(expr).not()</code>, boolean equality, and the ability to evaluate a rule declared on an element below the resource root. What is still not machine-checked, and why, so the remaining gap is a stated one rather than an absence: <code>CareTeam</code> <code>ctm-1</code> needs reference resolution (<code>resolve()</code>); <code>Questionnaire</code> <code>que-2</code> and <code>questionnaire-extract-is-bundle-only</code> need a recursive <code>descendants()</code> walk; <code>Observation</code> <code>obs-7</code>, <code>Condition</code> <code>con-3</code> and the two <code>Patient</code> <code>-instances-clean</code> rules need set algebra over projected values; <code>Questionnaire</code> <code>que-7</code> and <code>RiskAssessment</code> <code>ras-2</code> need element-level type tests (<code>is</code> / <code>as</code> against a datatype rather than a resource); <code>Consent.category</code> and <code>Encounter.class</code> bind value sets that cannot be expanded offline; and the <code>DocumentReference</code> attachment-content rule is verified at document assembly rather than per resource. All twelve are still enforced by the HL7 validator and by any conformant external validator, and all twelve are still reported as <code>invariant-unverifiable</code> at runtime rather than silently skipped.</li><li>BREAKING: the block-kind binding is <code>extensible</code>, and a reader must write an unknown kind back unchanged. <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-note-block-types.html"><code>Note Block Types</code></a> bound <code>required</code> through 1.21.x, and 1.21.1 stated the consequence in as many words: the vocabulary was closed, and a client reading a section whose kind was ahead of its own read and rewrote that section as <code>text</code>, losing the kind. That rule is withdrawn. The binding is now <code>extensible</code>, and <a href="https://well-polaris.github.io/nexus-ig/fhir/CodeSystem-note-block-type.html"><code>Note Block Type</code></a> carries two more codes beside <code>text</code> -- <code>merge-field-body</code> (the letter composer) and <code>cited-claims</code> (the summary graphs). Why it changed. <code>required</code> made this guide a release gate on the editor: ship a block kind and every note carrying one is nonconformant until the IG cuts a release, which is not a dependency a specification should impose on the software it describes. It also did not protect the record. A reader that cannot represent a kind writes the section back as <code>text</code>, so closing the set converted "a kind this guide has not named" into "a kind the record no longer holds". Consumer action: a reader built to 1.21.1's rule must stop rewriting an unrecognised block kind as <code>text</code>. Render it as text -- there is no widget for a kind you do not know, and <code>section.text</code> is authoritative, so nothing clinical is lost -- then write the code back unchanged. Display and storage are different decisions. A reader that keeps collapsing unknown kinds destroys <code>merge-field-body</code> and <code>cited-claims</code> on every round trip. Rendering an unrecognised kind as text is correct; storing <code>text</code> in its place is data loss. A writer whose kind is named in the value set uses that code rather than a synonym; a writer shipping a kind the guide has not named yet is conformant carrying its own.</li><li>The block-type extension is the RENDER axis, not the authoring tool -- and this corrects how 1.22.0 described it earlier in its own development. A section answers three independent questions and each has its own element: what it is clinically (<code>section.code</code>), who produced it (<code>section.author</code>, which already admits <code>Device</code>), and how to render it (<a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-composition-block-type.html"><code>composition-block-type</code></a>). Read the last as "which editor widget wrote this" and a letter and a generated summary have no kind at all, and a consumer is forced to infer rendering from <code>author</code>, which answers a different question. Keeping the three apart is what makes an encounter note, a letter and a summary the same object: a problem-list section is 11450-4 whoever produced it, and a claims section renders identically however it was assembled. No constraint changed -- the definitions did.</li><li><code>composition-block-data</code> carries an <code>Attachment</code>, not a JSON string. <code>contentType</code> makes the envelope readable even where the contents are not described here; a JSON string in a <code>valueString</code> is self-describing to nobody, and no published international IG carries structured state that way. Reach for SDC first: where a render kind is really a form (vitals, diabetes review, flowsheet), a <code>Questionnaire</code> plus a <code>QuestionnaireResponse</code> is the modelled answer and gets <code>section.entry</code> for free. Consumer action: a writer emitting <code>valueString</code> must move to <code>valueAttachment</code>. Nothing is filed against this extension yet. Also states plainly that unreadable is not absent</li><li>BREAKING: <code>Composition.type</code> and <code>Composition.category</code> swap roles. <code>type</code> is the CLASS and the element to switch on. <code>type</code> (1..1) binds <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-emr-composition-classification.html"><code>Composition Classification</code></a> extensible and carries exactly one of three LOINC codes: <code>34109-9</code> "Note", <code>34133-9</code> "Summary of episode note", <code>51852-2</code> "Letter". <code>category</code> (0..) binds <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-composition-kind.html"><code>Composition Kind</code></a> preferred and carries the refinement underneath -- which kind of note (<code>11506-3</code>, <code>11488-4</code>, <code>18842-5</code>, <code>34117-2</code>, <code>34748-4</code>), which kind of summary (the codes in <a href="https://well-polaris.github.io/nexus-ig/fhir/CodeSystem-nexus-composition-type.html"><code>nexus-composition-type</code></a>). <code>Composition.section.code</code> binds the new <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-composition-section.html"><code>Composition Section</code></a> extensible, unchanged. Earlier drafts of this release had these two the other way round, and told readers to classify on <code>category</code>. That was wrong, and the reason is structural rather than a matter of taste: <code>type</code> is 1..1 in base R4 and cannot be relaxed, so it is the only element guaranteed present on every Composition. The one question every consumer must be able to answer -- am I rendering clinician-authored content or machine-generated content -- has to live there. <code>category</code> is 0.. and may be absent, which makes it the right home for refinements a producer may or may not know, and the wrong home for the distinction nobody can afford to miss. Consumer action: switch on <code>type</code>, and search on it. A search for every summary a patient has, of every kind, is <code>type=http://loinc.org|34133-9</code>. Reading <code>category</code> alone will miss documents. Producer action: write the class on <code>type</code> and the refinement on <code>category</code>. A progress note is <code>type</code> = 34109-9 with <code>category</code> = [11506-3]. A day-sheet summary is <code>type</code> = 34133-9 with <code>category</code> = [<code>nexus-daysheet-summary</code>]. Converters need remapping: OSCAR sends LOINC 11488-4 "Consult note" on every <code>casemgmt_note</code> whatever the note is, and that is a refinement code -- it belongs on <code>category</code>, with the real class written to <code>type</code>. Repeating the <code>type</code> code on <code>category</code> is allowed and is the ordinary thing to do where a document has no kind finer than its class. The refinement set is a strict superset of the class set so the repeat always validates, and a build gate enforces that nesting rather than leaving it to prose. <code>section.code</code> is bound for the first time, and <code>extensible</code> on purpose. LOINC supplies both document codes and section codes out of one system in one format: <code>34109-9</code> ("Note", a document) and <code>8716-3</code> ("Vital signs", a section) are indistinguishable as data, so a document code in the section slot is a mistake the format itself cannot prevent and no reader can detect after the fact. Preferred would document the vocabulary and warn on nothing; extensible warns on a code outside the set, which is exactly what a document code there is. A legitimate section kind the set does not yet name will also warn -- accepted, because growing the set is one line and the alternative is catching this by eye forever. The strengths are asymmetric on purpose, and the stronger one sits on the smaller vocabulary. <code>type</code> is extensible because its set enumerates the class axis completely -- note, summary, letter is the whole space -- so a code outside it is nearly always a refinement written into the class slot, which is worth a warning. <code>category</code> is preferred because LOINC's document axis is large and no set here enumerates it: a producer holding a more precise code should use it without being penalised for the precision.</li><li>The narrative/structured contract is written down on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html"><code>Composition</code></a>, and it is the most load-bearing rule in the profile. A section carries its content twice on purpose: the structured data is the display path for this EMR's UI, the narrative is for everyone who is not that UI. A renderer shows the structured data and ignores the narrative -- nothing appears twice. The consequence is that both sides must be complete: anything the UI needs must be structured, and anything clinically meaningful must also be in the narrative, including negatives. "No active problems" is a finding, not filler. Booleans and scalars count -- a value living only inside a structured payload leaves every consumer who is not this UI reading an incomplete document.</li></ul>]]></description>
      <nexus:version>1.22.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>true</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.21.1</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1211-2026-08-26</link>
      <guid isPermaLink="false">health.apps.nexus-1.21.1</guid>
      <pubDate>Wed, 26 Aug 2026 00:00:00 +0000</pubDate>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.21.1.tgz" length="1359567" type="application/gzip"/>
      <description><![CDATA[<ul><li>The CQL toolchain is now embeddable from .NET and Python, so the chain this specification documents -- CQL in; validated ELM, a module-definition <code>Library</code> and a manifest out -- runs in-process from all three client languages with no service to deploy. One translator is embedded rather than reimplemented per language: every additional engine that can decide what a criterion means is a new authority on clinical semantics, and such engines diverge exactly where it shows least (null propagation in three-valued logic, interval boundary inclusivity, timezone handling at date boundaries, unit conversion). A divergence of that kind inside a signed clinical rule is a patient-safety problem rather than a bug. The surface is opt-in in every language -- <code>@awaremd/typed-fhir/cql</code>, <code>Well.Services.TypedFhir.Cql</code>, <code>typed-fhir[cql]</code> -- so a consumer who wants a facade, a patient cache or a FHIR query starts no engine and acquires no language runtime. Which of the three are published today is stated in <a href="https://well-polaris.github.io/nexus-ig/guide/features/cql/single-patient.html#what-you-need">Evaluating one patient</a>; consumers of compiled criteria need none of them and a JSON parser is enough.</li><li>Three extensions that let a criteria artifact carry what its ELM cannot say. A module-definition <code>Library</code> says which resources a criterion needs; it does not say which of their elements the logic reads. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-criteria-elements-read.html"><code>Criteria Elements Read</code></a> records one element path per repeat, relative to the resource retrieved. That is finer-grained than <code>dataRequirement</code>, which bounds which resources are fetched rather than which of their fields have to be materialised for the logic to evaluate -- so a consumer projecting a narrow view can size it from the artifact instead of from the CQL. It is a lower bound: derived from retrieves and property accesses, without inference across included libraries, so an absent path is not proof the logic never reads it.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-criteria-relative-date.html"><code>Criteria Relative Date</code></a> says whether a criterion's membership can go stale on its own. <code>true</code> means the logic is anchored to a moving reference point ("no visit in the last six months"), so membership changes with the clock and a periodic re-evaluation is required; <code>false</code> means it changes only when data changes, so a change feed is sufficient. A consumer deciding whether to schedule re-evaluation reads this rather than inferring it from the logic.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-measurement-rationale.html"><code>Measurement Rationale</code></a>, required on every measurement definition, records the specific ambiguity or unit trap that definition prevents. The failures it guards against -- affine unit conversions, off-by-one ordinal scales -- produce numbers that render and validate while being wrong, so a definition that cannot name the failure it prevents is a guess. R4's <code>ObservationDefinition</code> has no narrative element, which is why this is an extension; it retires into <code>description</code> on a move to R5.</li><li>The CQL model this specification is authored against, published as an artifact. <a href="https://well-polaris.github.io/nexus-ig/fhir/Library-nexus-cql-modelinfo.html"><code>nexus-cql-modelinfo</code></a> carries the generated Nexus ModelInfo, so a criteria author writing <code>using Nexus version '&lt;x.y.z&gt;'</code> can fetch the model from the specification rather than reconstructing it from the profiles.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/cql.html">CQL</a> is now a documented part of this specification, with a companion page on <a href="https://well-polaris.github.io/nexus-ig/guide/features/cql/artifacts.html">criteria artifacts</a> covering the boundary that surprises implementers most: you do not need a CQL compiler to consume clinical logic from this specification. Translation happens once, when a criterion is authored. Everything downstream reads JSON.</li><li>The <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient.html"><code>Patient</code></a> profile gains the Indigenous fields. This entry was written when the work merged and was missed when 1.21.1 was cut, so it is recorded here late. The Indian Act registration or status number is a <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient-elements-details.html#el-Patient.identifier"><code>Patient.identifier</code></a> under the Canadian URI Registry's official system (<code>.../NamingSystem/ca-indigenous-northern-affairs-number</code>): a 9 or 10 digit value, or a data-absent-reason while other card facets are recorded before a number is. The identifier's validity period carries the card's issue and expiry, and the new <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-indian-status-card-type.html"><code>Indian Status Card Type</code></a> extension on the identifier carries the presented document form: SCIS, CIS or TCRD. Three optional flat extensions carry the rest: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-indian-act-registration-status.html"><code>Indian Act Registration Status</code></a>, and the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-first-nation-registry-group.html"><code>First Nation Registry Group</code></a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-first-nation-community.html"><code>First Nation Community</code></a> affiliations, the latter two coded from the curated seed-managed band list (the code is the federal band number). Every field is independently recordable, and each records what the patient states rather than anything verified against the Indian Register. A recorded expiry does not imply a change of registration status.</li><li>Five profiles now declare the element a bare CQL retrieve filters on, via HL7's own <code>cqf-modelInfo-primaryCodePath</code> extension: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference.html"><code>DocumentReference</code></a>, <code>ImagingStudy</code>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-invoice.html"><code>Invoice</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-schedule.html"><code>Schedule</code></a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-slot.html"><code>Slot</code></a>. Base R4's own CQL ModelInfo declares no primary code path for these five, and the consequence is not a compile error: <code>[Invoice: "some-code"]</code> compiles, the translator only warns, and the criterion silently filters on nothing while its data-requirements manifest emits a <code>codeFilter</code> with no <code>path</code> -- which violates FHIR's own <code>drq-1</code> invariant. Authoring against this specification's model makes the natural form correct rather than merely accepted. &lt;!-- PSD-1237 --&gt;</li><li>Declared the two extensions a block-authored encounter-note section carries — Composition Block Type and Composition Block Data — which the EMR has been writing undeclared, together with the <a href="https://well-polaris.github.io/nexus-ig/fhir/CodeSystem-note-block-type.html">Note Block Type</a> code system and <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-note-block-types.html">Note Block Types</a> value set the first of them binds. This is the block surface returning on the terms 1.14.0 set for <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html">Composition</a> itself: there is a committed consumer. It is not the shape 1.11.0 withdrew — one section per block on R4's own <code>section</code> ordering rather than recursive containment, and two flat extensions rather than the sliced complex one whose slicing was among the unevaluable-slicing defects that removal cleared. It does enumerate block kinds as <code>nexus-emr-embedded-section-types</code> did, and the difference is what is enumerated: one kind that has shipped, rather than four that had not.</li><li>The block-kind vocabulary is closed, and a kind outside it is not preserved. The binding is <code>required</code> and every block-authored section declares its kind, text included. A client reading a section whose kind is ahead of its own reads and rewrites it as text: narrative, heading, identity and structured value survive, the kind does not. That is a deliberate trade — a specification that can describe everything the record holds, against forward compatibility with writers that are ahead — and deployments spanning versions should upgrade readers before writers. A section carrying no kind at all predates the extension and reads as <code>text</code>; that is tolerance for legacy data rather than a default, and is retirable once no such section remains.</li><li>Both extensions are published under this IG's canonical base, <code>https://fhir.apps.health</code>. They were first drafted at the address the EMR front end already wrote (<code>http://services.well.com/fhir/StructureDefinition/...</code>), on the reasoning that declaring a URL nothing emits would document a fiction. That was settled the other way before publication and the front end moved: published canonical URLs are forever, and reconciling the namespaces was cheapest while no note carrying either extension had been filed. One open question remains, and it is a modelling question rather than a naming one: a block's editor state is carried as a JSON-encoded extension rather than in <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.section.entry"><code>section.entry</code></a>.</li></ul>]]></description>
      <nexus:version>1.21.1</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>false</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.21.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1210-2026-08-25</link>
      <guid isPermaLink="false">health.apps.nexus-1.21.0</guid>
      <pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.21.0.tgz" length="1288925" type="application/gzip"/>
      <description><![CDATA[<p><strong>This release contains a breaking change.</strong></p><ul><li><code>CodeSystem/nexus-emr-suggestion</code> is deleted. It shipped in 1.20.0; its canonical no longer resolves, and stored <code>Coding.system</code> values pointing at it are now unresolvable. Both its codes moved -- see Removed.</li><li><code>Task.code</code> no longer accepts <code>suggestion</code>. A search for <code>Task?code=...|suggestion</code> returns nothing after this release.</li><li><code>Task.status</code> binds a required subset. <code>requested</code>, <code>received</code>, <code>rejected</code>, <code>failed</code> and <code>entered-in-error</code> are no longer conformant. Every stored task carrying <code>requested</code> needs rewriting to <code>ready</code>.</li><li>Every stored template needs reshaping, and so does every stored suggested-resource task: the prototypes move into a contained transaction Bundle.</li><li>Every stored form needs the same reshaping, and its per-item <code>templateExtract</code> extensions removed. <code>NexusEmrCoreQuestionnaire</code> now prohibits that spelling -- prototypes are entries of the Bundle named by <code>templateExtractBundle</code>. See Added.</li><li><code>AIAST</code> binds producers and is not retroactive. Nothing backfills it, so an absent label means unknown, not human until every producer applies it. Read it as evidence a machine was involved, never as evidence one was not.</li><li>Nine categories for <code>Task.code</code> -- <code>reminder</code>, <code>call</code>, <code>appointment</code>, <code>review-report</code>, <code>prevention</code>, <code>referral</code>, <code>billing</code>, <code>medication</code>, <code>other</code> -- in the new <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-task-codes.html">Task Codes</a> value set, bound extensibly. <code>review-report</code> is named for the work rather than the source on purpose: diagnostic imaging and other non-laboratory reports arrive on the same inbound stream, so a category called <code>lab</code> would either exclude them or quietly redefine <code>lab</code>. (FHIR-71)</li><li>A required subset of <code>TaskStatus</code> (<a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-task-statuses.html">Clinical Task Statuses</a>): <code>draft</code>, <code>ready</code>, <code>accepted</code>, <code>in-progress</code>, <code>on-hold</code>, <code>completed</code>, <code>cancelled</code>. These are meanings, not a path -- any state may follow any other, and <code>ready</code> straight to <code>completed</code> is an ordinary day's work. <code>on-hold</code> is present for snooze and pause. (FHIR-71)</li><li><code>intent = #option</code> joins the <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-emr-task-intent.html">Clinical Task Intent</a> value set, for a proposal that is one of a set of alternatives. Approving one moots its siblings, which are then <code>cancelled</code> with a <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.statusReason"><code>statusReason</code></a> recording that they stopped being on offer rather than that anyone declined them. Additive: no existing writer changes. (FHIR-71)</li><li><code>CodeSystem/nexus-task-input-type</code>, giving <code>Task.input.type</code> a published label for the one slot a consumer branches on: <code>suggested-resource</code>, which points at the contained Bundle. The element stays otherwise free-text. (FHIR-71)</li><li>A priority below <code>routine</code>, as the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-task-priority-detail.html">priority-detail extension</a> carrying <code>trivial</code>. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.priority"><code>Task.priority</code></a> binds required to <code>request-priority</code>, whose floor is <code>routine</code>, and a profile may only strengthen a binding; the element is also a bare <code>code</code> with no second coding slot. So the refinement rides beside it under a rule that makes it safe to ignore: when the extension is present <code>Task.priority</code> shall be <code>routine</code>, so a consumer that does not read it under-states the task rather than mis-sorting it. (FHIR-71)</li><li><code>NamingSystem/nexus-cds-card</code>, the identifier namespace for a decision-support card. One evaluation raises several proposals; each is its own Task, and every member carries the card on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.groupIdentifier"><code>groupIdentifier</code></a> so the set comes back from one <code>Task?group-identifier=</code> search with no parent resource. Values follow the harness key's rule -- derived from the gap the advice addresses, never from the evaluation that produced it. (FHIR-71)</li></ul>]]></description>
      <nexus:version>1.21.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>true</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.20.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1200-2026-08-24</link>
      <guid isPermaLink="false">health.apps.nexus-1.20.0</guid>
      <pubDate>Mon, 24 Aug 2026 00:00:00 +0000</pubDate>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.20.0.tgz" length="1287517" type="application/gzip"/>
      <description><![CDATA[<p><strong>This release contains a breaking change.</strong></p><ul><li>The package id is <code>nexus</code>, not <code>nexus-emr</code> -- one line in your dependency declaration. No canonical in the namespace changed and nothing in stored data moves.</li><li>The DIN code system URI moves, and that one IS in stored data, on <code>MedicationRequest</code>.</li><li>279 accessors change return type. Audit for <code>.coding</code> / <code>.system</code> / <code>.code</code> / <code>.id</code> reached directly off an accessor named in the table under TypedFhir libraries.</li><li><code>validate()</code> is stricter twice over -- unknown elements now error, and twenty-two base-R4 required bindings are enforced that previously could not be read. Run your corpus through it before upgrading.</li><li>A <code>Referral</code> profile -- the IG could not describe a referral, and now can. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-core-referral.html"><code>NexusCoreReferral</code></a> (<a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-core-referral.html"><code>https://fhir.apps.health/StructureDefinition/nexus-core-referral</code></a>) is a new <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-servicerequest.html"><code>ServiceRequest</code></a> profile for a request that another clinician or service take the patient on. It is additive: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-servicerequest.html"><code>NexusEmrCoreServiceRequest</code></a> is unchanged in every constraint, so laboratory and imaging orders keep the guarantees they already had. A referral could not claim the order profile, and this was not a near miss. That profile fixes <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-servicerequest-elements-details.html#el-ServiceRequest.intent"><code>intent = order</code></a>, binds <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-servicerequest-elements-details.html#el-ServiceRequest.category"><code>category</code></a> (required) to the five-concept base FHIR value set, and requires <code>code 1..1</code>. A referral is <code>intent = proposal</code> -- the referrer asks a receiving service to accept the patient and has no authority over whether it does -- its <code>category</code> is the receiving service or specialty, which that five-concept set cannot express, and the Ontario eReferral contract sends no <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-servicerequest-elements-details.html#el-ServiceRequest.code"><code>code</code></a> element at all. Three constraints, three mismatches. The new profile is a sibling derived from base R4, not a child of the order profile: a derived profile may tighten its parent but never loosen it, so a fixed <code>order</code> and a required binding are not recoverable downstream. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-servicerequest-elements-details.html#el-ServiceRequest.intent"><code>intent</code></a> is fixed to <code>proposal</code>, <code>category</code> is <code>1..</code> bound extensibly to the new <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-referral-service-type.html"><code>NexusReferralServiceType</code></a> value set, <code>code</code> is <code>0..1</code> with an invariant requiring <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-servicerequest-elements-details.html#el-ServiceRequest.code.text"><code>code.text</code></a> when it is present, and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-servicerequest-elements-details.html#el-ServiceRequest.requester"><code>requester</code></a> is required. A second invariant, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-core-referral-invariants.html#inv-referral-category-coded"><code>referral-category-coded</code></a>, asks for at least one SNOMED coding on <code>category</code> at warning severity rather than error, for the same reason the binding is extensible: destinations do arrive with no usable code, and the right answer for one of those is to carry the text rather than map it to an approximate neighbour, because an approximate destination routes the patient approximately. This aligns with the pan-Canadian and Ontario standards rather than inventing beside them. CA-eReC fixes <code>intent = proposal</code> and requires <code>requester</code> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-servicerequest-elements-details.html#el-ServiceRequest.authoredOn"><code>authoredOn</code></a>; the Ontario eReferral profile derives from CA-eReC; this IG already carries <code>ca.on.erec.r4</code> as a pinned dependency. Two divergences are deliberate and documented on the profile itself: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-servicerequest-elements-details.html#el-ServiceRequest.performer"><code>performer</code></a> stays <code>0..</code> where CA-eReC requires it (that profile governs electronic messaging, where a destination is definitionally known, while this one also covers referrals recorded in the chart that were never sent electronically), and <code>category</code> does not adopt CA-eReC's binding -- see below.</li><li>A <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-referral-service-type.html"><code>NexusReferralServiceType</code></a> value set for referral destinations, mirroring Canada Health Infoway's active <code>ReferralServiceCategoryCode</code> over SNOMED CT Canadian Edition reference set <code>379431000087101</code>. It is deliberately not called a specialty value set, and that is not cosmetic. Several destinations a primary-care referral routinely targets exist in SNOMED CT only as service concepts, with no specialty concept at all -- Sports medicine, Sleep medicine, Spinal surgery and Clinical neurophysiology among them. A specialty-only value set cannot describe the destinations this EMR already offers, which is why Infoway's set is a union of healthcare services and provider specialties. Implementers building a destination picker should expect both kinds of concept and must not filter to the specialty hierarchy. CA-eReC's own <code>category</code> binding is not adopted. It binds <code>InterventionCodeSubsetCare</code>, which represents "the care procedures performed by a Provider" -- an intervention taxonomy, which is what <code>code</code> means, not the destination <code>category</code> carries -- and which Infoway retired in April 2026 along with the Primary Health Care EMR Minimum Data Set, marking it "not recommended for continued use". <code>code</code> is therefore left with the base R4 binding until Infoway publishes a replacement. The binding is extensible, not required, and that is load-bearing rather than a hedge: Ocean sends <code>17561000 |Cardiologist|</code> -- an occupation concept -- in <code>category</code>, and it is not a member of this value set. A required binding would make the referrals actually received non-conformant. Preserve the source coding exactly as received and add the Nexus coding alongside it in the same <code>CodeableConcept</code>; do not rewrite or drop the original. The new <a href="https://well-polaris.github.io/nexus-ig/guide/features/referrals/overview.html">handbook page</a> covers the Ocean relationship and the coding guidance in full, and the shipped example demonstrates the dual-coding pattern.</li><li>A <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaire.html"><code>Questionnaire</code></a> profile, and forms are now the same mechanism as letter templates. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaire.html"><code>NexusEmrCoreQuestionnaire</code></a> closes the half of forms the IG never modelled: it profiled the answer set (<a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaireresponse.html"><code>QuestionnaireResponse</code></a>) and not the form that produced it, so a response pointed at a definition the spec did not govern. The profile requires <code>url</code> and <code>version</code> -- a response is only interpretable against the version it answered, because the question text, item types and answer options all live in the form -- and binds answers to the chart through <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaireresponse-elements-details.html#el-QuestionnaireResponse.item.definition"><code>item.definition</code></a> and <code>item.code</code> rather than a private extension. The structural news for implementers is that a form and a template are one mechanism. Both carry contained prototypes of what they produce and are instantiated by cloning them and filling in what the definition could not know; they differ only in what drives the fill (a <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaireresponse.html"><code>QuestionnaireResponse</code></a>, or an instantiation context). The handbook's Templates page now documents that once for both, and each profile page points at it. Named as not settled rather than approximated: approximate dates and durations (a real clinical requirement with no FHIR datatype), body diagrams, note generation, and FHIRPath expressions. SDC extraction is governed by two invariants, and nothing checks them at runtime. (Both were removed in 1.21.0 along with the spelling they governed -- see that release. Named here without links, because the anchors they had are gone.) <code>questionnaire-extract-templates-are-contained</code> requires every <code>sdc-questionnaire-templateExtract</code> to target a prototype contained in the form, and <code>questionnaire-extract-templates-resolve</code> requires that <code>#id</code> to resolve. Both traverse <code>descendants().ofType(Extension)</code>, which reaches the root's own extensions, so an extraction at the form root -- the ordinary case -- is examined rather than passing vacuously; and both read the prototype from the complex extension's <code>template</code> sub-extension (<code>extension('template').value.ofType(Reference)</code>). SDC prohibits <code>Extension.value[x]</code> on <code>templateExtract</code> itself, so a form carrying <code>valueReference</code> there is not valid SDC and does not pass. Both are declared <code>#error</code> and both sit on the runtime allowlist, as do base R4's <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaire-invariants.html#inv-que-1"><code>que-1</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaire-invariants.html#inv-que-2"><code>que-2</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaire-invariants.html#inv-que-7"><code>que-7</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaire-invariants.html#inv-que-10"><code>que-10</code></a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaire-invariants.html#inv-que-13"><code>que-13</code></a>: the HL7 validator enforces all seven against this IG's examples and <code>validate()</code> enforces none of them. If you author forms programmatically, run the published validator or check containment yourself. The profile ships with a worked example, and the extraction rules were mutation-tested in both directions -- a stored-resource target and a dangling <code>#id</code> each fail the rule that should catch them, and a conformant root-level and item-level extraction each pass.</li><li>Medications now carry drug identity at TWO levels, and all three medication resources carry the same model. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationrequest.html"><code>MedicationRequest</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationstatement.html"><code>MedicationStatement</code></a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationdispense.html"><code>MedicationDispense</code></a> each slice the medication concept's <code>coding</code> into <code>din</code>, <code>ccdd</code>, <code>atc</code> and <code>aign</code>. A DIN identifies one manufacturer's marketed product; CCDD (<a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-all-hc-ccdd.html"><code>http://terminology.hl7.org/CodeSystem/hc-CCDD</code></a>) and ATC (<a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-all-atc.html"><code>http://www.whocc.no/atc</code></a>) identify the ingredient. Every cross-record question is an ingredient-level question -- are these two prescriptions the same drug, is this duplicate therapy, does this medication match a recorded allergy -- and a DIN cannot answer any of them, because the same drug from a second manufacturer carries a different DIN and a change of salt changes it again. Until now the spec offered a DIN slot and nothing else, and only on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationrequest.html"><code>MedicationRequest</code></a>; the other two named code systems in prose that constrained nothing. Nothing here is required and nothing existing is invalidated: every slice is <code>0..</code>, the slicing is <code>open</code>, <code>text</code> remains the only requirement on the concept, and instances carrying no coding, or an unsliced one, stay conformant. Consumer action, if you write these resources: carry the ingredient-level code the source actually has, alongside the DIN rather than instead of it. Do not synthesize one that was not given to you. The <code>aign</code> slice carries Health Canada's DPD active-ingredient group number (<a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-all-hc-aign.html"><code>http://terminology.hl7.org/CodeSystem/v3-hc-aign</code></a>, published through HL7 Terminology and resolvable from the <code>hl7.terminology.r4</code> package this IG already depends on), and it is the one to reach for when there is no CCDD -- in practice most legacy EMR medication lists, where a DIN and a line of free text is all that exists. It gathers products sharing an active-ingredient composition across manufacturer and salt form and covers the whole DIN space, so it is reachable from a DIN when neither CCDD nor ATC is. The number is ten digits and it decomposes, which decides which of two systems a record should carry: <code>[2 digits: how many active ingredients][5 digits: which active-ingredient group][3 digits: which strength group]</code>. The full ten-digit number is therefore strength-specific, which is what a prescription, a dispense and a medication statement mean -- so the medication profiles bind it. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-allergyintolerance.html"><code>AllergyIntolerance</code></a> binds the five-digit middle portion instead (<a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-all-hc-aigc.html"><code>http://terminology.hl7.org/CodeSystem/v3-hc-aigc</code></a>), because an allergy is to an ingredient and not to a strength. To match a medication against an allergen, compare positions 3 through 7 of the medication's number to the allergen's code -- they are different systems and different lengths, and comparing them as equal strings never matches.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-allergyintolerance-elements-details.html#el-AllergyIntolerance.code"><code>AllergyIntolerance.code</code></a> now has a drug-allergen path, via <code>ccdd</code>, <code>atc</code> and <code>aigc</code> slices on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-allergyintolerance-elements-details.html#el-AllergyIntolerance.code.coding"><code>code.coding</code></a> -- the same posture as [<code>Condition.code.coding[icd10ca]</code>](fhir/StructureDefinition-nexus-emr-core-condition-elements-details.md#el-Condition.code.coding-icd10ca) and [<code>Procedure.code.coding[cci]</code>](fhir/StructureDefinition-nexus-emr-core-procedure-elements-details.md#el-Procedure.code.coding-cci), where the IG declares the slot and the system and does not enumerate codes. The element previously required <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-procedure-elements-details.html#el-Procedure.code.text"><code>code.text</code></a> and mandated no system at all, which left no join key between an allergen and a medication: matching meant string comparison over clinician-typed free text. An allergen coded with CCDD, ATC or the DPD active-ingredient group is now matchable against a medication coded the same way -- the three medication profiles slice the same systems, because a join key has to be sliced on both sides or it does nothing. The one exception is the active-ingredient group, where the allergen slice binds the five-digit code (<code>v3-hc-aigc</code>) and the medication slices bind the ten-digit number (<code>v3-hc-aign</code>): an allergy is to an ingredient, not to a strength, and matching the two means comparing positions 3 through 7 of the number to the code rather than comparing the two values directly. There is deliberately no <code>din</code> slice. A patient is not allergic to a marketed product, they are allergic to what is in it; a DIN-to-DIN comparison misses the same drug from another manufacturer and misses a different salt of the same ingredient, so a DIN slot on an allergen would look like a join key while silently failing the cases the join exists for. All three slices are <code>0..</code> and the slicing is <code>open</code>, so existing allergy records are unaffected.</li><li>Every code system this specification binds now has a page that says what it is. The profiles pin thirty-four system URIs. Some were minted in this specification's own namespace and defined nowhere, so following one reached nothing; the rest were third-party systems with no statement of what they are, who publishes them, or where an implementer gets the codes. Both gaps are closed by nineteen new artifacts, and a pinned <code>.system</code> value on a profile page is now a link to the page describing it rather than a bare URI. Five artifacts define URIs this specification mints: a <code>CodeSystem</code> for the OHIP Schedule of Benefits (<code>.../CodeSystem/on-ohip-schedule-of-benefits</code>, <code>content = not-present</code> -- the system is declared, the Ministry of Health's fee codes are not reproduced), and <code>NamingSystem</code> resources for the OHIP billing number, the Ontario RMA / group billing number, the Ontario Service Location Indicator and the patient MRN. Each says what the identifier is, who assigns it, and what it does not mean -- the MRN page in particular, because an EMR-local chart number is unique only within the deployment that issued it and must not be used to match patients across systems. Thirteen third-party systems get a <code>ValueSet</code> in this specification's namespace (<code>.../ValueSet/all-&lt;system&gt;</code>), each a single <code>include</code> of the whole system with no codes enumerated: LOINC, SNOMED CT, UCUM, ICD-10-CA, CCI, DIN, CCDD, ATC, the two Health Canada active-ingredient group systems, the HL7 identifier-type codes, NullFlavor and data-absent-reason. Each page states what the system is, who publishes it, its canonical URI, where to obtain the codes, and where a licence gates use (ICD-10-CA and CCI are CIHI-licensed; SNOMED CT requires an Affiliate licence). No <code>CodeSystem</code> is published at a canonical this specification does not own -- a second definition of a canonical its publisher already serves is how one identifier acquires several spellings, so these claim no foreign canonical and redistribute nothing. The internal EMR user-account system gets a <code>NamingSystem</code> rather than a value set, because it names an identifier AUTHORITY and not a terminology: there is no concept list to point at and the values are opaque account ids, so "every code in the system" would be a category error. Its page says what the profiles already say -- it is private infrastructure and external consumers must not depend on it. Where the publisher's terms allow it, the page also shows a sample of the codes -- up to 500, spread evenly across the system rather than taken off the front, with the size of the population they came from stated above the table and again below it, so a list that stops at 500 cannot be read as a complete one. Nine systems qualify: LOINC, DIN, the two Health Canada active-ingredient group systems, ATC, UCUM, and the HL7 identifier-type, NullFlavor and data-absent-reason codes. Each carries the attribution its licence requires. The LOINC sample excludes every term carrying a third-party copyright notice -- 7,355 of them, mostly scored assessments and survey instruments whose questions belong to someone other than Regenstrief. The LOINC licence would allow reproducing those provided the notice travelled with them; dropping them instead means no third-party instrument text is republished here at all. Where the terms do not allow it, the page says so and says whose terms decide it. No ICD-10-CA, CCI or SNOMED CT code is reproduced anywhere in this specification, and none will be: rendering codes onto a published page is redistribution, and those are licensed by CIHI and SNOMED International respectively. CCDD is withheld as well, because redistributing its content is a permission separate from the free use it grants. The list of systems whose codes may be reproduced is an explicit allow-list, so a system added to this specification in future publishes nothing until its terms have been read and recorded. This applies to <code>CodeSystem</code> artifacts that declare a system without carrying its content, not only to value sets -- from a reader's point of view they are the same page, so they answer the question the same way. OHIP fee codes are among the ten, on the King's Printer's legal-materials permission: the Schedule of Benefits is incorporated by reference into R.R.O. 1990, Reg. 552 under the Health Insurance Act, and the King's Printer permits anyone to reproduce the text contained in Ontario's regulations without permission or charge, provided the reproduction is accurate and is not represented as an official version. Both conditions are met on the page, which states in terms that it is not an official version and that the Ministry's edition in force governs. The sample omits the 406 codes that carry no published description in any schedule, rather than listing them against their own code.</li><li>A value set over one of this specification's OWN code systems now lists its codes in full. Fourteen pages -- appointment modality, clinical roles, province/territory, pay program, task business status and the rest -- said "All codes from this system" and then listed none, which is the least useful thing a page about a five-code vocabulary can do. These are not a licence question at all: the concepts are in this specification's own artifacts, so the page shows every one of them rather than a sample.</li><li>The OHIP Schedule of Benefits page now carries the ICD-9 warning about Ontario's DIAGNOSTIC codes. They are a separate Ontario code set with its own system URI, they are ICD-9-LIKE in shape, and they are not a subset of ICD-9 -- so an OHIP diagnostic code must never be derived by truncating an ICD-9 code. The 895-971 range is a parallel Ontario space laid over ICD-9 numbers that mean something unrelated: <code>970</code> is Prenatal Care in Ontario and poisoning by CNS stimulants in ICD-9. Measured against the Provincial Health Care Vocabulary Standard, a SNOMED CT to ICD-9 to truncate route reaches 69.4% of cases and 124 of them come out valid and wrong -- nothing downstream rejects them, so they reach a claim and the diagnosis on the record is not the one the clinician made. Eighteen codes carry two unrelated meanings within the Ontario set itself. The warning was in the specification's source and on no page a reader would find.</li></ul>]]></description>
      <nexus:version>1.20.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>true</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.19.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1190-2026-08-21</link>
      <guid isPermaLink="false">health.apps.nexus-1.19.0</guid>
      <pubDate>Fri, 21 Aug 2026 00:00:00 +0000</pubDate>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.19.0.tgz" length="1171192" type="application/gzip"/>
      <description><![CDATA[<p><strong>This release contains a breaking change.</strong></p><ul><li>Two published vocabularies were renamed, and both breaks are in stored data. The suggestion code on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.code"><code>Task.code</code></a> is now <code>suggestion</code>, not <code>ai-suggestion</code>: a search for <code>Task?code=...|ai-suggestion</code> returns nothing after this release, and stored tasks carrying the old code fail <code>nexus-sugg-2</code> until migrated. The note-classification value set is now <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-emr-composition-classification.html"><code>nexus-emr-composition-classification</code></a>: the old canonical is no longer bound by any profile, so rebind. Its page is NOT removed -- <code>ValueSet-nexus-emr-note-classification.md</code> is still published, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.status"><code>status: retired</code></a>, so an old bookmark still resolves and says what replaced it. Neither rename is recoverable by tolerating absence -- both need a migration.</li><li>Four elements that were required may now be absent, and readers must tolerate all four. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.for"><code>Task.for</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.identifier"><code>Task.identifier</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.identifier"><code>Composition.identifier</code></a> and <code>NexusEmrCoreCareTeam.subject</code> all relax in this release, each because the profile grew a population the requirement made unrepresentable. A reader that treats absence as malformed will reject valid records; one that lists a patient's care providers without filtering on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.subject"><code>subject</code></a> will now show the nursing pool as a clinician. Going the other way, every <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.note"><code>Task.note</code></a> turn now REQUIRES <code>author</code> and <code>time</code>, so a writer that emitted unattributed or undated turns must populate both.</li><li>A given seed does not reproduce the 1.18.0 dataset. The generator no longer opens a task's thread with a turn restating its <code>description</code>, and a <code>requested</code> follow-up task now emits no turns at all. Regenerate and re-baseline; 1.18.0 stays archived for byte-fidelity.</li><li>BREAKING: the suggestion code is <code>suggestion</code>, renamed from <code>ai-suggestion</code> (<code>CodeSystem/nexus-emr-suggestion</code>, used on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.code"><code>Task.code</code></a>). The old name asserted something the code does not carry. What made a suggestion "AI" was never this code — it is <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.requester"><code>Task.requester</code></a>, a logical Device reference under <code>NamingSystem/nexus-harness-graph</code> naming the graph that produced it. A deterministic CDS rule produces the same <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html">Task</a> shape with a different requester, so the old name made every CDS recommendation read as machine-learning output. Consumer action: a search for <code>Task?code=...|ai-suggestion</code> returns nothing after this release; use <code>...|suggestion</code>. Stored tasks carrying the old code do not match the <code>nexus-sugg-2</code> invariant and must be migrated. Read <code>Task.requester</code> when the producer matters (AI graph vs CDS service) and <code>Task.code</code> when it does not. An earlier revision of the CodeSystem argued against this rename on the grounds that the code is a stored value — that traded a permanently misleading vocabulary for one migration, and while this specification is pre-release the trade was wrong.</li><li>BREAKING: every <code>ClinicalTask.note</code> turn now requires <code>author</code> and <code>time</code>. Each turn is typed to <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-task-note.html"><code>NexusEmrTaskNote</code></a>, which makes required two elements that are optional in base R4. Consumer action: a writer that emitted unattributed or undated turns must populate both on every note, or the resource no longer validates. This entry used to lead with what did NOT change -- "typed to a profile and stays <code>0..</code>; the ask is <code>description</code>" -- and put the breaking half in the middle of the paragraph. That is worth correcting rather than quietly rewriting, because the entry's own shape caused the damage. This file's preamble states the contract: a breaking change is named as breaking, in bold, with the consumer action spelled out. A reader skimming bold headlines for what would break saw a reassurance about cardinality and moved on. The note-model fallout in this release traces back here. The cardinality does not change. An earlier revision of this release made <code>note</code> <code>1..</code> and declared <code>note[0]</code> the opening ask. That is withdrawn before it ships, and the reasoning is worth recording because it was wrong in a specific way: it treated <code>description</code> as a mere label when <code>description</code> is required on this profile and IS the ask — what is wanted and why the task exists, stable for the life of the task. Requiring a turn on top of it bought nothing and cost every writer a duplicated one, storing the same statement twice and opening the thread with something nobody actually said. <code>note</code> is what has been said since the task was created; a task nobody has commented on carries none, which is the ordinary state of new work. Consumer action: read <code>description</code> to answer "what is this task about" and <code>note</code> to answer "what has been said about it". Render an empty thread as new work, not as a malformed record.</li><li>BREAKING (seed data): a given seed no longer reproduces the 1.18.0 dataset. Two generator changes alter what a thread contains, and both follow from the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.note"><code>Task.note</code></a> model above rather than from any new decision: the generator no longer opens a task's thread with a turn that merely restates its <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.description"><code>description</code></a>, and a <code>requested</code> follow-up task now emits no turns at all. A task nobody has commented on carries no notes, which is the ordinary state of new work. Consumer action: regenerate and re-baseline anything pinned to generated output -- fixtures, golden files, benchmark stores, screenshots. The change is in the CONTENT for a given seed, not in the generator's determinism: same seed still means same dataset, and <code>test:seed-stability</code> in the generator suite is what holds that. 1.18.0 stays archived for byte-fidelity if you need to diff against the old shape. This was listed among the three things to read before consuming 1.19.0 but had no entry of its own down here, so the detail a reader needed in order to act on it -- which two behaviours changed, and that determinism itself is intact -- existed only as a one-line summary.</li><li>TypedFhir (Python) gains a FHIR REST client (Jira PSD-1141, "Writeback of compositions" — not to be confused with GitHub PR #1141, which is the 1.18.0 release this branch is stacked on; the numbers collide by coincidence). <code>typed_fhir.sources.fhir_client.FhirClient</code> ports the frontend's <code>fhir-client.ts</code> API to Python — same operations, snake_case names, same error contract (a failed search returns a Bundle wrapping the <code>OperationOutcome</code> per <a href="https://hl7.org/fhir/R4/http.html#search">R4</a>; a failed direct request raises it). This is what makes generated-summary writeback possible: <code>create_resource</code> / <code>update_resource</code> arrive as part of a client rather than as another hand-rolled POST. No third-party FHIR library, deliberately: they all own their own HTTP call, and this package's determinism depends on that not being owned (connectors build requests and parse responses with pure code; only bytes cross the <code>Transport</code> seam, so a run replays against the frozen vectors). Credentials here also resolve per request from context — the harness sets a delegated bearer and tenant per run — which a client that binds authorization at construction cannot express. Both read postures moved onto the client with their measured knowledge intact: the degrading compartment sweep (one broken type must not cost the chart) and the loud single-query load (a truncated inbox is missing work items, not a smaller page), plus <code>next</code>-link rebasing with all three of its hard-won exceptions, the HTTP-200-carrying-a-refusal check, and a page cap that is always reported. Public API unchanged: <code>search_paged</code>, <code>next_link</code> and <code>rebase_next</code> keep their names and import paths. PHI: error messages carry <code>issue.code</code> only — a HAPI <code>OperationOutcome</code> echoes the offending resource into <code>diagnostics</code>, so the text rides on the exception, never in a log-bound message.</li><li>BREAKING (TypedFhir Python): the FHIR client's API is brought in line with <code>fhir-client.ts</code>. Its docstring has always said it mirrors the frontend client; it was about 70% true, and the differences were spelling rather than substance. <code>get_resource_by_link</code> now takes <code>(resource_type, url)</code> like the reference (and like every other method here) rather than the reverse; <code>update_resource</code> takes a <code>FhirUpdateOptions</code> bag instead of <code>if_match: str | bool</code>; <code>search_errors</code> and <code>wrap_operation_outcome_in_bundle</code> are instance methods, not <code>@staticmethod</code>; and every search entry point accepts an ordered sequence of pairs, not only a mapping — a date window (<code>date=ge…&amp;date=lt…</code>) was previously expressible in exactly one of the four. Consumer action: update those three call shapes. There were no consumers outside this package's own tests when the change landed, which is why it was made now rather than deprecated.</li><li>TypedFhir (Python) gains the write and read surfaces the harness needs, all mirroring the frontend: <code>FhirPreconditionFailedError</code> (a 412 is the one write outcome a caller must handle differently — nothing was written and retrying unchanged will be refused again — and it was previously only recoverable by sniffing a status code); <code>save_resource</code>, routing create-vs-update on <code>id</code> presence; <code>bundle_entries</code> / <code>bundle_entries_or_raise</code> / <code>has_error_issues</code>, mirroring <code>BundleUtils</code>, where the <code>_or_raise</code> form puts the HTTP-200 refusal check in the same call as the entry filter so it is no longer one a caller can forget; <code>get_version</code> / <code>get_history_page</code> / <code>get_history</code>; and <code>FhirDocumentDataClient</code> for attachment bytes, which streams and enforces its size cap while downloading rather than after. <code>save_by_business_key</code> is the AgentWriteFhir contract in one call — search by identifier, then update in place or create — so re-running a capability updates the same <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html">Task</a> or <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html">Composition</a> instead of piling up a rival. It writes the key onto the resource (a key you searched by and did not store finds nothing next time), carries the stored <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.meta.versionId"><code>meta.versionId</code></a> forward so the read-then-write stays conditional, and refuses when a key matches more than one resource rather than picking a side. <code>FhirClient(base_url)</code> is now the whole call: the transport defaults, and credentials default to the delegated bearer and tenant in the ambient context.</li><li>TypedFhir (Python): <code>PatientCache</code> can drive a client, not only be handed a list of resources — <code>search</code> / <code>load_all</code> / <code>count</code> / <code>load</code> / <code>get_or_load</code> / <code>load_by_link</code> / <code>load_version</code> / <code>load_history</code> / <code>save</code> / <code>save_as_global</code> / <code>delete_by_id</code> / <code>upsert</code> / <code>evict</code> / <code>clear</code>, plus <code>on_write</code> / <code>on_read</code> / <code>on_delete</code> listeners. This is the frontend's <code>FhirStoreBase</code> half that had no analogue here. Two things the stores need that it does not: a store registry (one cache holds every type, so an <code>_include</code>d resource lands beside the one that included it with no routing) and per-type store classes (the type is an argument and the local query is <code>resources()</code>). A search the server REFUSED raises rather than merging nothing — a tenant refusal arrives as HTTP 200 with an empty searchset, and merging that silently leaves a cache reporting an empty chart.</li><li>TypedFhir: starting a resource is a constructor call. <code>Observation.new(status="final", …)</code> and <code>new_resource("Task", …)</code> replace hand-writing <code>{"resourceType": "Observation"}</code> as the entry point to a typed API. Fields pass through the setters, so a code outside its required binding is refused at construction. What comes back is deliberately incomplete — you are still building it — and <code>missing_required()</code> answers "what does this still need", returning the IG path plus the accessor to set it with, read off the profile validator rather than the curated field table so it cannot report "nothing missing" about an element the facade does not happen to type.</li><li>TypedFhir: <code>subject</code> and <code>patient</code> are curated. No profile in the IG had a <code>subject</code> accessor — they sat on the generator's global skip list, a rule that only ever held for READING (inside a patient cache the subject is a given). It stopped holding when the facade gained a construction path: a new <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-observation.html">Observation</a> must carry a subject, and with no accessor the only way to set one was raw JSON. 24 profiles gain a typed <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-observation-elements-details.html#el-Observation.subject"><code>subject</code></a> and 6 a typed <code>patient</code>, in all three ports. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-observation-elements-details.html#el-Observation.identifier"><code>identifier</code></a> stays uncurated — it is reached through <code>save_by_business_key</code>.</li></ul>]]></description>
      <nexus:version>1.19.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>true</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.18.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1180-2026-08-19</link>
      <guid isPermaLink="false">health.apps.nexus-1.18.0</guid>
      <pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.18.0.tgz" length="1151285" type="application/gzip"/>
      <description><![CDATA[<ul><li>Effective dates CHANGE for Compositions that carry an <code>event</code>. The walker fix below means <code>event.period.start</code> finally wins over <code>date</code>, as 1.17.0 declared it should -- so windowing, recency sorts and anything cached off an effective date will move for exactly the notes where the two dates differ. That is the fix landing, not a regression; recompute rather than reconcile.</li><li>A given seed does not reproduce the 1.17.0 dataset. The generator emits the letter template and the clinic-site <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-location.html">Location</a>, and profile identities moved. Regenerate and re-baseline; counts and shapes are stable, individual values and ids are not. 1.17.0 remains published and archived if byte-fidelity is needed.</li><li>The <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-template-list.html">Template</a> profile's canonical is <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-template-list.html"><code>nexus-template-list</code></a>, renamed before first publication</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-template-list.html">Templates</a> are served, validated, and discoverable: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-template-list.html"><code>List</code></a> joins the declared surface (FHIR-53, FHIR-52). Three things move together, because the profile's own gate said they must:</li><li><code>typed_fhir.subscriptions</code>: change notifications join the library (PSD-1039). A <code>SubscriptionClient</code> over a transport seam -- the Redis change stream (at-least-once, consumer groups, dead-letter stream) or a real FHIR <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-subscription.html"><code>Subscription</code></a> rest-hook (<code>FhirSubscriptionTransport</code> + <code>NotificationSink</code>) -- with criteria parsed and validated against the subscriptions CapabilityStatement at construction, so an unsupported criteria raises before the loop starts and never registers as a subscription that quietly matches nothing. Hardened by four review rounds before this entry was written, and the last one matters to consumers: notification Bundles batching several events now deliver EVERY event (not just the first); a bare status ping is never delivered as a clinical event; on the rest-hook transport a failed handler dead-letters immediately (rest-hook cannot redeliver, so "retry by not acking" was a silent drop); criteria follow R4 escaping in full, <code>+</code> is a literal, and identifier matching requires the <code>:identifier</code> modifier (<code>owner:identifier=system|value</code>; keyword form <code>owner__identifier=</code>) -- the plain form is refused at construction because it matched over Redis and matched nothing on a conformant server. Date <code>eq</code> is containment (<code>date=2026-08-14</code> does not match a resource dated <code>2026</code>) and string search is case-insensitive-prefix, both per R4, so client-side and server-side evaluation of the same criteria string cannot diverge.</li><li>The reference loaders verify instead of trusting, measured against a live store (FHIR-52). The cross-patient searches refuse to present a security refusal as an empty result (the gateway answers a cross-tenant read with a 200 carrying an error OperationOutcome -- that raises now), refuse truncation at the page cap, and gate the inbox loader's client-side fallback on the exact status: 400 falls back, 404 raises, and a 403 -- both NativeFHIR's answer to the unsupported <code>:identifier</code> modifier AND the gateway's insufficient-scope answer</li><li>The effective-date walker descends arrays, in all three ports (FHIR-52). The declared precedence <code>event.period.start | date</code> (1.17.0) named the one ARRAY-VALUED path in the table, and no port's path walker could traverse an array -- so the declaration was inert at runtime and every consumer silently windowed on the authoring date, the exact wrong answer it was written to prevent. Found live: a note carrying both dates returned the wrong one. Fixed with an identical first-present-wins array-descent rule in TypeScript, Python and C#, pinned by tests in each.</li><li><code>load_harness_inboxes</code> on the Python source connectors: every AI-harness actor's inbox in one call (FHIR-52). All <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html">Task</a> resources owned by a harness graph -- an identifier under the <code>nexus-harness-graph</code> NamingSystem -- plus each Task's <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.basedOn"><code>basedOn</code></a> clinical targets and its <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.for"><code>for</code></a> <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient.html">Patient</a>, as one flat list of raw FHIR. Because harness actors are LOGICAL Device references (identifier-only, no Device resource on the server), the query is an <code>owner:identifier</code> search, and the connector VERIFIES the modifier was honoured rather than trusting it: a backend that ignored it would answer with every Task in the store, and presenting those as inboxes would be silently wrong, so an all-stray result refuses loudly instead. Only the WellServices FhirGateway connector implements it. The query is cross-patient, so it is not a compartment fetch; every other source raises <code>NotImplementedError</code> naming the connector that can. The returned resources can be wrapped with TypedFhir facades (<code>typed_fhir.facade.generated.wrap</code>) for typed access -- but note that nothing yet takes this FHIR and sorts it into per-actor inboxes for the AI harness; that consumer has not been written.</li><li><code>load_daysheet</code> on the Python source connectors: one practitioner's day, appointment cut only (FHIR-52, SD-201). Appointments for the day, the practitioner's Schedules, and those Schedules' Slots inside the day — three standard R4 searches, paged, results VERIFIED against the practitioner and the day window rather than trusted (a backend that ignores a search parameter answers with everyone's appointments; an all-stray result refuses rather than presenting someone else's day). WellServices FhirGateway only, like the inbox load — the query is cross-patient. This supersedes the TS day-sheet read that 1.17.0 said had "moved to 1.18.0." That prototype tried to make one loader answer both "who is coming" and "what is their story", and hunted an <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-appointment.html">Appointment</a>→<a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html">Task</a> edge this IG forbids; it will not ship. The corrected model splits the two questions: <code>load_daysheet</code> answers WHO is coming, and opening a patient is a separate <code>fetch_resources(..., since=...)</code> anchored by <code>last_encounter_date</code> (below), per visit, when the chart is opened. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient.html">Patient</a> depth is deliberately absent from the day sheet.</li><li><code>since</code> on Python patient loading: a history window over date-oriented elements (FHIR-52). <code>fetch_resources</code> / <code>fetch_resources_lenient</code> accept <code>since=</code>; a resource whose IG-declared effective date falls before it is dropped, and a resource whose profile declares NO effective date (<a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient.html">Patient</a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-coverage.html">Coverage</a>, Device, ...) is always kept -- undated context is not history. The filter reads <code>effective_date_of</code>, the same <code>event.period.start | date</code> precedence every facade reads, so the window and the facade cannot disagree about when something happened. Precision is handled inclusively: a year-only date the anchor cannot place is kept, because a summary that silently dropped it would misinform where including it merely over-shares. Server-side date windowing was removed from this connector in an earlier release because no caller could supply the anchor. The anchor now exists (below); the filter stays CLIENT-SIDE, where one implementation serves every connector. Bandwidth is not saved; correctness is.</li><li><code>last_encounter_date</code>: the anchor the "since you last saw" window opens from (FHIR-52, SD-189/SD-190). The clinical date of the patient's last SIGNED encounter note -- a <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html">Composition</a> whose <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.category"><code>category</code></a> carries LOINC 34109-9, dated by <code>event.period.start | date</code> -- strictly before a REQUIRED <code>before</code> anchor. <code>before</code> has no default, deliberately: the window's upper bound is the CURRENT visit (the appointment start at 36h pre-generation, the encounter start on chart load), and "now" is the one anchor that is always wrong during a visit -- the moment this visit's note is signed it would become "the last encounter" and the window would collapse to zero, precisely in the walk-in and chart-load cases the requirements call out (SD-189 03.05/03.06). Ties are excluded: a note dated exactly at the anchor is this visit's note. Returns <code>None</code> on a first visit -- a real answer, not a failure. Feed the result to <code>since=</code>. No TS or C# twins are owed for any of the three, and that is a statement, not an omission: both ports refused a sources layer by design (a host there already has a FHIR client and comes in through the in-memory ingest edge), so the fetch contract lives in Python, whose consumer -- the AI harness -- is the consumer of all three features. The primitive they lean on, <code>effectiveDateOf</code>, already exists in all three ports.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-template-list.html">Templates</a> are a first-class shape in the IG: the Template profile on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-template-list.html"><code>List</code></a>. A template is a <code>List</code> whose CONTAINED resources are prototypes of what it produces, cloned into ordinary resources when someone uses it. The first consumer is the clinical letter, which produces one <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html">Composition</a>, so a one-entry template is the ordinary shape rather than a degenerate one; a template that later produces a letter and a follow-up task gains a prototype and an entry, and needs no new definitions. (FHIR-53)</li></ul>]]></description>
      <nexus:version>1.18.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>false</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.17.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1170-2026-08-16</link>
      <guid isPermaLink="false">health.apps.nexus-1.17.0</guid>
      <pubDate>Sun, 16 Aug 2026 00:00:00 +0000</pubDate>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.17.0.tgz" length="1136654" type="application/gzip"/>
      <description><![CDATA[<p><strong>This release contains a breaking change.</strong></p><ul><li>BREAKING -- <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.focus"><code>Task.focus</code></a> is typed, and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.focus"><code>focus</code></a> vs <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.input"><code>input</code></a> now mean different things (FHIR-31). <code>focus</code> was <code>Reference(Resource)</code>, which documents nothing: a conformant writer could point it at an <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-organization.html">Organization</a> and still pass. It is now <code>Reference(QuestionnaireResponse | DocumentReference | Composition | Condition | DiagnosticReport | ServiceRequest | MedicationRequest | Observation)</code>, each constrained to this IG's profile of that type. Consumer action. If you write Tasks, <code>focus</code> must now name one of those eight and must satisfy the corresponding Nexus profile; anything else fails validation where it previously passed. If you read Tasks, you gain the thing that was missing: "which chart element is this task on" is answerable from the type alone, so a reader can switch on it rather than resolve the reference to find out what it is. The two elements were competing. <code>input</code> was ALSO an open reference to the chart, so the same fact had two homes and neither was wrong. That is why FHIR-31's question -- where do forms and inbox documents live -- had no answer. The split is now stated on the elements themselves: <code>focus</code> is what the task is about, <code>input</code> is what the task needs (chiefly the contained AI-suggested resource). Where a workflow genuinely spans several elements, <code>focus</code> names the one the task is filed against and the rest ride in <code>input</code>. Why forms are not stored inside the task. It reads as a storage question and is really a boundary question. A task carries the WORK -- who asked (<code>requester</code>), who owns it now (<code>owner</code>), what has been said (<a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-observation-elements-details.html#el-Observation.note"><code>note</code></a>), what happened to it (<code>relevantHistory</code>) -- and not the clinical content. If the form lived inside the task, every consumer that wanted the form would have to understand task workflow to reach it, the form would disappear when the task completed, and a document filed against two tasks would exist twice. So the form is a chart resource in its own right and the task points at it. <code>note</code> is documented as what it actually is: the conversation, oldest first. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-task-note.html"><code>Annotation</code></a> carries author and time as well as text, so the repeats ARE the thread that makes a forwarded task intelligible to whoever receives it. It stays deliberately distinct from <code>relevantHistory</code>, which is <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-provenance.html">Provenance</a> and records what HAPPENED rather than what was SAID -- an audit trail must not depend on someone having chosen to comment.</li><li>BREAKING for anyone pinning seed data: a given seed no longer produces the 1.16.0 dataset (PSD-417/PSD-412). The synthetic-patient generator was reconciled after PSD-417 was implemented twice, independently, against two different bases. Every change below reshuffles the random stream, so this is stated once, loudly, rather than discovered: regenerate any pinned fixtures. It is deliberately taken as one break in one release rather than three. Lab flags are now derived from the value, against clinical panic thresholds. Previously the flag was rolled and a value synthesized to fit, with "critical" derived from the reference SPAN</li><li>The generator is additive again: per-domain random streams (PSD-412). Every emitter used to draw from one shared stream, and <code>uid()</code> consumed 30 values from it per resource, so ANY change moved every value downstream of it -- different medications, different appointment times, different ids on resources nobody touched. A one-line change produced a corpus-wide diff, which is why PSD-412's "same seed, same dataset, reviewable diff" kept failing on the third clause, and how PSD-417 came to be implemented twice without either author seeing the other's effect. Each domain now draws from its own sub-stream, addressed by NAME rather than by position, with the "does this patient get one at all" gate on a separate stream again. So adding a domain perturbs nothing, retuning a prevalence changes which patients have the thing without rewriting what it looks like for the ones that still do, and two people can add generators in separate commits without colliding. Resource ids are hashed from (chart, domain, counter) rather than drawn, which makes them unique by construction rather than by luck. What is NOT promised: isolation is per domain, not per resource. Adding a lab still moves later labs. <code>test/seed-stability.test.ts</code> pins all of this, and prints a per-resource-type fingerprint table so a reviewer can check that an imaging change moved only imaging.</li><li><code>ofType()</code> joins the emittable FHIRPath subset, and two IG rules start being enforced on real data (FHIR-33). <code>value.ofType(CodeableConcept)</code> IS <code>valueCodeableConcept</code> in FHIR JSON, so the type filter is a statically-known key rather than a runtime type test, and it compiles by collapsing two navigation steps into one -- exact, not an approximation. It was the only operator standing between the sociodemographic <code>-absence-exclusive</code> invariants and being checked; everything else in them was already supported. Those two rules -- "if a patient answered Asked-But-Declined, that must be their only answer" -- are now verified by TypedFhir at runtime in all three ports, rather than only by the HL7 validator against this IG's own examples. They are what stops a decline being counted as a demographic on a field whose stated purpose is reporting. The sibling <code>-instances-clean</code> rules (duplicate detection) remain unverifiable: they need <code>select()</code>, <code>&amp;</code> and <code>isDistinct()</code>, which do not reduce to anything the compiler already has. No consumer action -- nothing about the published contract changes; two rules the IG already stated are now actually checked.</li><li>The IG now publishes CapabilityStatements (FHIR-35). <code>nexus-emr-server</code> declares the 29 resource types a conformant endpoint exposes and the interactions each honours, derived from the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-smart-exposed.html"><code>smart-exposed</code></a> extension the profiles already carry — so "which types can an app reach, and to do what" is answerable from the artifacts instead of by reading 45 profiles. The 14 types this IG models but does not expose are deliberately absent from it: modelling a resource says the estate contains it, exposing it says an application may reach it. General search parameters are not declared yet — that surface varies by backing store, and this IG will not publish a list it has not measured against each one. <code>nexus-emr-subscriptions</code> declares the closed set of types that may appear in a <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-subscription-elements-details.html#el-Subscription.criteria"><code>Subscription.criteria</code></a> and the exact search parameters each permits, so an unsupported criteria can be rejected when the subscription is created rather than matching nothing forever. It also states what the change feed cannot express — transition criteria ("changed into cancelled"), deletes, and unbounded replay — each of which an implementer would otherwise discover by not receiving a notification. Every parameter names a base R4 <code>SearchParameter</code> through <code>definition</code>; none is invented here, and the element each one reads comes from that SearchParameter's own <code>expression</code> rather than from anything this IG restates. That matters because a parameter name does not tell you which element it reads — <code>patient</code> on a <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference.html">DocumentReference</a> reads <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference-elements-details.html#el-DocumentReference.subject"><code>subject</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference-elements-details.html#el-DocumentReference.date"><code>date</code></a> on an <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-appointment.html">Appointment</a> reads <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-appointment-elements-details.html#el-Appointment.start"><code>start</code></a>, and <code>date</code> on an <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-observation.html">Observation</a> reads <code>effective[x]</code> in every type the profile permits. The client libraries' criteria vocabulary is generated by resolving those definitions, so a criteria cannot read a different element here than the same query would read on a conformant FHIR server.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient.html">Patient</a> self-identification fields for sociodemographic capture (PSD-765): the Patient profile slices REUSE CA Core+'s <code>patient-indigenousIdentity</code> / <code>patient-racializedGroup</code> extensions (<code>ca.infoway.io.core</code> 1.2.0-dft-ballot, newly pinned as a dependency) rather than minting Nexus canonicals — repeatable, one answer per instance. Slice bindings tighten CA Core+'s preferred Infoway ValueSets to pinned enumerated mirrors (extensible) of IndigenousIdentityCode/RacializedGroupCode 1.3.0 — absence concepts are first-class members per the source composition — plus warning-severity exclusivity/cleanliness invariants on the Patient profile.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.event"><code>Composition.event</code></a> is modelled: the note's CLINICAL date now has a home (FHIR-35). The profile previously offered only <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.date"><code>date</code></a>, which R4 defines as the composition editing time -- it MOVES when a note is amended. So a timeline sorted by <code>date</code> re-positions an amended note to the date of its amendment, and no element said when the documented care actually happened. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.event.period"><code>event.period</code></a> is that element: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.event.period.start"><code>event.period.start</code></a> is required when the period is present, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.event.code"><code>event.code</code></a> says what kind of care it was, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.event.detail"><code>event.detail</code></a> may reference it. Sort a clinical timeline by <code>event.period.start</code>, not by <code>date</code>. Both elements now carry a timing-relationships block and a worked example, matching the treatment <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference.html">DocumentReference</a> already had. The seed corpus deliberately makes the two DISAGREE -- an amended note carries a <code>date</code> a week after its <code>event.period.start</code> -- because a corpus in which they always agree teaches a consumer the opposite of what the profile says. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html">Composition</a> and DocumentReference disagree about where these facts live. That is inherited from base R4, not introduced here, and it is now written on both profiles rather than left to be discovered: | what | Composition | DocumentReference | |---|---|---| | when the care happened | <code>event.period</code> | <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference-elements-details.html#el-DocumentReference.context.period"><code>context.period</code></a> | | what kind of care | <code>event.code</code> | <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference-elements-details.html#el-DocumentReference.context.event"><code>context.event</code></a> | | the visit | <code>encounter</code> (top level) | <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference-elements-details.html#el-DocumentReference.context.encounter"><code>context.encounter</code></a> (nested) | The same two words nest the opposite way round, and the encounter link sits at a different depth in each. Consumer action: if you learned one of these profiles and assumed the other, check all three rows.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.category"><code>Composition.category</code></a> becomes the preferred classifier, matching <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference.html">DocumentReference</a> (FHIR-35). The two profiles gave OPPOSITE guidance on the same question: DocumentReference said "use category instead" of <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference-elements-details.html#el-DocumentReference.type"><code>type</code></a>, while <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html">Composition</a> said <code>type</code> was the primary classifier and demoted category to optional. Composition now follows DocumentReference. Why category wins, and it is the reasoning DocumentReference already published: category supports multiple classifications per resource, admits clinical and administrative taxonomies side by side, and leaves <code>type</code> free to carry the source EMR's own note type without displacing the field a consumer keys off. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.type"><code>Composition.type</code></a> stays <code>1..1</code> because base R4 requires it, not because it is the right thing to classify on. That distinction is not academic. In converted OSCAR data every <code>casemgmt_note</code> arrives with <code>type</code> fixed to LOINC 11488-4 "Consult note" whatever the note actually is, so a consumer keying off <code>type</code> there learns nothing. The seed corpus previously emitted a <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.category"><code>category</code></a> that CONTRADICTED its own <code>type</code> -- 11488-4 "Consult note" as the category of a note whose type said 11506-3 "Progress note", two document types competing rather than a general and a specific. Both now read LOINC 34109-9 "Note".</li><li>New value set <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-emr-note-classification.html"><code>nexus-emr-note-classification</code></a>, bound <code>preferred</code> on BOTH <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.type"><code>Composition.type</code></a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.category"><code>Composition.category</code></a> (<a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-emr-note-classification.html"><code>https://fhir.apps.health/ValueSet/nexus-emr-note-classification</code></a>) One code: LOINC 34109-9 "Note". That is what the estate stores, and a larger enumeration would be a guess about note taxonomy published as a contract. The same set is on both elements because there is nothing yet to distinguish. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.category"><code>category</code></a> is the preferred classifier (see the entry above); <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.type"><code>type</code></a> is <code>1..1</code> because base R4 requires it, not because it carries a finer second fact. When note subtypes start being stored -- progress vs telephone vs discharge -- <code>type</code> is the element they belong on, and that is the moment to widen this binding back toward LOINC's document-type space. The <code>type</code> element's prose no longer lists four candidate LOINC codes, which a one-code set contradicted. <code>preferred</code>, not <code>extensible</code> or <code>required</code>, and the reasoning changed late in review, so it is worth stating plainly. <code>required</code> would make converted OSCAR data non-conformant on arrival: every <code>casemgmt_note</code> carries LOINC 11488-4 "Consult note" whatever the note is. <code>extensible</code> looked like the safe middle and is not, once the set is small -- an extensible binding over an enumerable set is a SHALL-unless-nothing-fits, and base R4 only avoided firing on that same data because its value set was a LOINC filter wide enough to contain 11488-4 already. <code>preferred</code> says the thing actually meant: this is the code we store, and yours is still conformant. ⚠ A <code>preferred</code> binding is not silent in TypedFhir today. All three ports grade any binding that is not <code>example</code> at WARNING severity, so a note carrying a document-type code outside this set will warn despite being conformant -- which converted OSCAR data does, on every note. The warning is a tooling artefact, not a conformance statement. Aligning the ports with FHIR's severity ladder (<code>preferred</code> as information) is a three-port behaviour change and is tracked separately rather than folded into a spec release. Carry an unmapped local type in <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.type.text"><code>type.text</code></a> rather than mis-coding it. Two notes for implementers coming from elsewhere. First, base R4 binds <code>Composition.type</code> only preferred; this IG has bound it <code>extensible</code> since before this release, so the tightening is not new here, only the value set is. Second, US Core makes the same split -- coarse classifier on <code>category</code> (a value set of exactly one code, <code>clinical-note</code>), fine slot on <code>type</code></li><li>Published page URLs are now locked by a checked-in manifest (FHIR-35). Since the one-page-per-tab split in 1.16.0, a reference page's filename IS its public URL, and it is derived from the tab's DISPLAY LABEL. Editing a label therefore renamed published pages. Measured rather than hypothesised: renaming one tab label ("Salient fields" -&gt; "Salient elements") moves 67 published URLs. Nothing caught this, and the reason is the interesting part. mkdocs <code>strict: true</code> checks that links RESOLVE, and after such a rename they all still do, because every internal link is regenerated against the new name in the same pass. The site stays perfectly self-consistent while every inbound link from outside it dies. Internally coherent, externally wrong, and green. <code>docs/published-urls.txt</code> now records all 901 page URLs and is compared on every pre-PR run. Additions pass silently -- a new profile or tab is ordinary work, and gating it would make the manifest a chore that gets rubber-stamped, which is how a lock stops being one. Only removals and renames fail, and accepting one is a separate named action (<code>npm run urls:accept</code>) so that moving a public URL is something someone can be seen doing in the diff. What this means for you: the canonical-URLs-are-forever promise this IG makes about its published pages now has something enforcing it. Bookmarks and inbound links to a reference page will not be moved by an editorial change to a tab label.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.basedOn"><code>Task.basedOn</code></a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.reasonReference"><code>Task.reasonReference</code></a> are no longer must-support. Both elements remain, both remain typed (base R4 leaves each open to any resource; this profile narrows <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.basedOn"><code>basedOn</code></a> to the four request types and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.reasonReference"><code>reasonReference</code></a> to <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-condition.html">Condition</a> / <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-observation.html">Observation</a> / <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-diagnosticreport.html">DiagnosticReport</a> / <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference.html">DocumentReference</a>). What changes is the CLAIM. Must-support says a consumer of this IG will do something meaningful with a populated element. This IG is not yet in a position to say that for either: nothing populates them, and a surface that displays a task reads <code>focus</code>, <code>owner</code>, <code>requester</code>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference-elements-details.html#el-DocumentReference.status"><code>status</code></a>, <code>priority</code> and the due date. Advertising support that does not exist has a specific cost, and this release is the demonstration of it. Because both were must-support, the seed generator had to populate them, so it reached for the nearest resource in scope: <code>basedOn</code> got the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-encounter.html">Encounter</a> and <code>reasonReference</code> got the Patient. "This task is because of the patient" says nothing -- every task is about the patient. Both are fixed above, but the fix people should take away is the demotion, not the patch: an element nobody reads is one producers fill with whatever is to hand. If you populate either today, nothing breaks -- they are still modelled, and the published StructureDefinition still narrows their targets, so a validator that checks reference target profiles will hold you to them. ⚠ TypedFhir is not such a validator. Its IG generator reads <code>type[].profile</code> and never <code>type[].targetProfile</code>, so what reaches the ports for a narrowed reference is the bare datatype (<code>types: ["Reference"]</code>) and nothing enforces the target list in TypeScript, Python or C#. That is true of <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.focus"><code>Task.focus</code></a> above as well, and it is the reason FHIR-45 exists. Do not read "typed" as "checked by our client libraries" -- today it means "declared in the specification". What would make them must-support again: a consuming surface that reads them. Note the overlap with <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.focus"><code>focus</code></a>, which is the element to reach for first. <code>focus</code> is the chart element the task is filed AGAINST; <code>reasonReference</code> is why it exists. A task to review an abnormal potassium has that DiagnosticReport as its <code>focus</code>, and the Condition it relates to (if any) as its <code>reasonReference</code>. Must-support coverage in the seed corpus moves 575 -&gt; 573 accordingly. The seed corpus no longer emits either element. Populating them with the nearest resource to hand is what produced the wrong types in the first place, and synthesizing a plausible order or a plausible clinical justification for a task that has neither would put the same fiction back, one type-check better dressed. If you were reading <code>Task.basedOn</code> or <code>Task.reasonReference</code> out of the seed data, they are gone -- they were never carrying real information. Wider question logged as FHIR-47: 20 of this profile's must-support elements are justified in published prose by the same source, and only these two have been examined.</li><li>Nearly half of all "normal" lab results sat exactly ON a reference-range boundary. The N tier drew from the wide near-normal sampler and CLAMPED into the reference interval. Because the sampler's <code>spread</code> is deliberately greater than 1 (the general lab path needs out-of-range values), clamping deposited every out-of-range draw exactly on a bound. Measured over 200,000 normal results: 22.4% landed on exactly 3.9 and 22.4% on exactly 5.5 for Glucose. Creatinine put ~17% on each of 60 and 110, about 9x what a flat distribution would give. The distribution was bimodal at the edges, which is the opposite of the mid-clustering the code claimed, and it is visible to anyone who looks at the seed data: a demo chart full of glucoses reading exactly 5.5 does not look like lab data. The N tier now draws a triangular in-band value (mass concentrated mid-range, tapering toward the bounds, no spike on them); the abnormal tiers stay uniform, since there is no clinical reason to prefer the middle of "high" to its edges. Guarded in <code>interpretation-tiers.test.ts</code> by two assertions -- no bound spike, and a modal value in the middle third -- both mutation-tested against the old clamping. This moves lab values for a given seed. It is part of the seed break already declared above.</li></ul>]]></description>
      <nexus:version>1.17.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>true</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.16.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1160-2026-08-14</link>
      <guid isPermaLink="false">health.apps.nexus-1.16.0</guid>
      <pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.16.0.tgz" length="1099809" type="application/gzip"/>
      <description><![CDATA[<p><strong>This release contains a breaking change.</strong></p><ul><li>The reasoning behind a constraint is now published (FHIR-32). <code>definition</code>, <code>comment</code> and <code>requirements</code> are where the WHY of a constraint lives, most of it hand-written in FSH carets, and none of it reached this site: it compiled into <code>package.tgz</code> and rendered only on IG Publisher pages. Elements now have a Details view, every element name in the Differential / Key / Snapshot tables links into it, and an element carrying a <code>comment</code> gets a marker in the description column, because <code>comment</code> is often the most useful prose on an element and it renders in no table. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient.html">Patient</a> alone gains 169 prose blocks and 199 markers across 102 elements. Salient fields carry <code>short</code>, <code>definition</code> and <code>comment</code> separately rather than one lumped description, so each consumer takes the text written for its audience: the table cell, the generated docstring, and the pydantic schema an LLM reads. 94 of 95 salient fields inherit <code>short</code> and <code>definition</code> with nobody writing a word.</li><li>One page per tab in the generated reference (FHIR-32). The tabs were one page carrying every view; each leaf view is now its own page and the tab bar is a strip of links. 273 generated pages become 890. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient.html">Patient</a> goes from a single 521 KB page to 14 pages, largest 184 KB, median 11 KB. Existing URLs are preserved -- the first leaf keeps <code>StructureDefinition-&lt;id&gt;.md</code>, so every link and bookmark to a profile page still resolves. The reason for the split is that hidden tabs were still in the DOM: a search hit or an inbound anchor could land on content the reader could not see. Every view is now separately addressable, and search results land visible.</li><li>The vendored IG snapshot can no longer go stale unnoticed (PSD-848). The chain is <code>doc/fhir</code> -&gt; SUSHI -&gt; vendored snapshot -&gt; the generated tables, facades and patient-compartment map, and every guard sat at or below the snapshot: they regenerate from it, or compare against it. None could see the FIRST link break. Editing the FSH without re-running <code>refresh:ig</code> left the snapshot unmoved, so every guard agreed with every other guard about an IG that no longer matched its own source, and CI stayed green. <code>refresh:ig</code> now stamps an <code>igSourceHash</code> into the manifest -- a content hash of <code>src/fsh</code>, <code>src/examples</code> and <code>sushi-config.yaml</code>, the inputs that determine the vendored artifacts -- and a new test recomputes it. A mismatch means the source has moved since the snapshot was taken, and says so with the command that fixes it. It runs in the <code>npm test</code> chain, so the required CI check enforces it rather than only the owner-track gate. No consumer action. A build-integrity check; nothing about the published contract changes.</li><li>Invariants declared on EXTENSIONS are now compiled and enforced (PSD-848). They previously were not, by any mechanism: extension StructureDefinitions never entered TypedFhir's IG model (only <code>kind: "resource"</code> was kept), so their constraints reached no table, no compiler and no gate. Such a rule rendered on its published profile page, read as enforced, and checked nothing -- and the gate that exists to flag an unverifiable invariant could not see it either, because it iterates the invariants the model collects. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-effective-date-invariants.html#inv-effective-date-declares-exactly-one"><code>effective-date-declares-exactly-one</code></a> was in that state for its whole life; it is now verified against all 45 profiles that carry the extension. Two FHIRPath forms were added to the emittable subset to make it compile as written: <code>xor</code>, and <code>extension('url')</code> as sugar for <code>extension.where(url = '...')</code>. The sugar matters beyond this rule -- it is what an author naturally writes (HL7's own invariants use it), and until now reaching for it silently produced an unverifiable invariant. Extension invariants are now also compiled into the RUNTIME validators. An extension's rules are not in the profile's snapshot -- a sliced extension element carries only <code>ele-1</code>/<code>ext-1</code> -- so TypedFhir checked none of them on real data, even where the HL7 validator was checking them against our examples. <code>gen-facade</code> now resolves them BY URL, matching how an extension is identified in the data, so a rule applies wherever its extension appears rather than only where a profile happens to slice it. All three ports. Mostly no consumer action -- a rule the IG already stated is now actually checked. The one addition is below.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-attributed-fact.html"><code>nexus-attributed-fact</code></a> requires substantive citations (PSD-848): new invariant <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-attributed-fact-invariants.html#inv-attributed-fact-citations-are-substantive"><code>attributed-fact-citations-are-substantive</code></a> -- the statement, and every citation's verbatim quote, must be non-empty. <code>1..1</code> requires those elements to be PRESENT; it does not stop them being <code>""</code>, and an empty quote is worse than a missing one: it is a citation that cites no text, passing every structural check while leaving the fact unauditable, which is the one property the extension exists to provide. Error severity. The extension is <code>experimental</code> and unreleased, so no published contract tightens.</li><li>BREAKING -- <code>ClinicalTask.intent</code> is no longer fixed to <code>order</code> (PSD-848). It now binds <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-emr-task-intent.html"><code>nexus-emr-task-intent</code></a> (required): <code>order</code> for work already authorized and assigned, <code>proposal</code> for a suggestion that takes effect only once a human accepts it. Consumer action: code asserting <code>intent === 'order'</code>, or relying on it being present with that value, must handle <code>proposal</code>. If you were identifying AI suggestions by <code>code</code>, the <code>AIAST</code> security label, or the presence of a contained resource, read <code>intent</code> instead -- those were proxies for it. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html">Task</a> instances already in a store are unaffected: <code>order</code> remains valid and no stored value changes meaning. Why: the fixed value described the population the profile was written for -- inbox items, follow-ups, to-dos, which genuinely are orders -- and prevented a scatter of intents for identical work. Modelling AI suggestions onto the same profile made it wrong: a suggestion awaiting a clinician's approval is exactly what "not proposals or plans" excluded, so <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.intent"><code>intent</code></a> could not distinguish "assigned to you to do" from "awaiting your approval". The binding is narrowed to two codes rather than reopened to R4's nine, because the order-flavour refinements describe a fulfilment chain this model does not have, and a task whose intent is <code>unknown</code> cannot be triaged at all. The FSH records the accept-or-reject for each of the nine.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-provenance.html">Provenance</a> leaves placeholder status (PSD-848): the profile now has a committed job -- attribution for AI-mediated and cross-boundary writes, in two worked shapes (standalone, and contained in an AI-suggestion review <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html">Task</a>) -- and is marked <code>experimental = false</code>. No cardinality, type, binding or slicing changed, so nothing that validated before stops validating. One invariant did get real teeth: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-provenance-invariants.html#inv-provenance-ai-action-names-agent"><code>provenance-ai-action-names-agent</code></a> was effectively vacuous (<code>agent.exists()</code>) and is now a genuine conditional check. Its severity is still <code>warning</code>, so it fails nothing -- but a producer relying on it never firing will start seeing it fire. Model/token accounting, the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.meta"><code>meta</code></a> <code>UpdatedBy</code> relationship, and whether Provenance is written for ordinary human edits remain open and are documented as such.</li><li>Attributed facts on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-provenance.html">Provenance</a> (PSD-848): new <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-attributed-fact.html"><code>nexus-attributed-fact</code></a> extension carrying, for AI-generated text, each factual statement with its backing verbatim quote(s) and the generating run's chunk label -- a lossless mapping of the harness's fact/citation wire schema, with an optional <code>source</code> reference tying a citation to the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-provenance-elements-details.html#el-Provenance.entity"><code>Provenance.entity</code></a> it was drawn from. Sliced into the Provenance profile as <code>attributedFact 0..</code>, with a worked pre-visit-summary example. The AI-suggestion <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html">Task</a> example now also carries a CONTAINED Provenance (linked from <code>relevantHistory</code>) citing the passage its contained suggestion was extracted from -- the suggestion and its citation trail travel and are approved or rejected as one unit.</li><li>A suggestion's review state belongs on the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html">Task</a> (PSD-848): the ClinicalTask handbook page now states the rule and the contained-suggestion example follows it. A contained suggested resource is written as the clinical fact its citations support, so the example's <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-condition.html"><code>Condition</code></a> moves from <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-condition-elements-details.html#el-Condition.verificationStatus"><code>verificationStatus = unconfirmed</code></a> to <code>confirmed</code> and gains the required <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-condition-elements-details.html#el-Condition.category"><code>category</code></a>. Using <code>unconfirmed</code> to mean "not yet approved" reads as clinical doubt to every consumer -- <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-condition-elements-details.html#el-Condition.verificationStatus"><code>verificationStatus</code></a> is a modifier element -- and the wrong value survives into the chart on approval, because approving moves <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.status"><code>Task.status</code></a> and changes nothing inside the contained resource. The same rule keeps a suggestion promotable: it should already satisfy its profile.</li></ul>]]></description>
      <nexus:version>1.16.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>true</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.15.1</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1151-2026-08-12</link>
      <guid isPermaLink="false">health.apps.nexus-1.15.1</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 +0000</pubDate>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.15.1.tgz" length="1080878" type="application/gzip"/>
      <description><![CDATA[<ul><li>The tenant stamp is declared: the <code>tenant-id</code> extension (FHIR-29). Every resource stored through the FHIR Gateway carries <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-tenant-id.html"><code>http://services.well.com/fhir/auth/tenant-id</code></a> on <code>DomainResource</code>, and the IG did not declare it -- so it appeared on every payload with nothing to resolve and no explanation. It is now a published extension, documented as what it is: the gateway stamps the caller's tenant on every create and update and strips any client-supplied value first, so tenancy follows the token and a client cannot choose it. Both this and the <code>userId</code> identifier are private infrastructure and must not be depended on -- unresolvable URLs, opaque values, no breaking-change guarantee, and deliberately kept off the governed <code>fhir.apps.health</code> host to say so. If you need to know which clinic a resource belongs to, use the modelled <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-organization.html"><code>Organization</code></a> / <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-location.html"><code>Location</code></a> references instead. See the Identifiers page in the handbook.</li><li>Seven new first-pass profiles close the parallel-efforts modelling gaps (FHIR-29, from the 2026-08-10 gap triage; every one has a named consumer): ImagingStudy (the imaging half of results viewing, PSD-417; DiagnosticReport.imagingStudy now targets it), <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-coverage.html">Coverage</a> (payor context for billing/demo -- the Ontario shape, payor as a logical <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-organization.html">Organization</a> reference), <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-familymemberhistory.html">FamilyMemberHistory</a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationstatement.html">MedicationStatement</a> (the harness's Patient Summary Domains read list), <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-goal.html">Goal</a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-careplan.html">CarePlan</a> (CDM flowsheets and care gaps; CarePlan also resolves the corpus's no-model-but-generated inverse gap by profiling rather than un-emitting), and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-riskassessment.html">RiskAssessment</a> (computed risk scores; replaces the chart-module registry's profileAbsentReason placeholder). ALL seven are CLOSED to SMART apps pending an exposure decision (the FHIR-28 policy for newly profiled types).</li><li>Result review state: the <code>nexus-reviewed</code> extension (FHIR-29) on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-diagnosticreport.html">DiagnosticReport</a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-observation.html">Observation</a> -- who acknowledged a result and when; ABSENT means unreviewed. The <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html">Task</a> inbox is the review workflow; this is the queryable state it stamps, so a results viewer needs no Task join. The seed corpus emits a realistic reviewed mix with unreviewed volume on recent results.</li><li>ICD-10-CA and CCI get named slots, not content (FHIR-29): system-sliced secondary codings on Condition.code (icd10ca) and Procedure.code (cci). Codes are deliberately NOT enumerated -- both classifications are CIHI-licensed and the licence paperwork is in flight (the prevention-catalog pattern: the IG declares the slot and the system; content governance lives outside).</li><li>The seed corpus covers the grown surface: emitters for all seven new types (payor context incl. a cancelled prior plan, family history incl. a health-unknown relative, patient-reported OTC meds incl. a discontinued one, the CDM bundle tying <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-goal.html">Goal</a> + <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-careplan.html">CarePlan</a> + <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-riskassessment.html">RiskAssessment</a> to a live chronic <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-condition.html">Condition</a>, imaging studies with their reports) plus the review-state stamp. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-coverage.html">Coverage</a> guarantee after the growth: 43/43 profiles, 577/577 must-support, both directions clean with the CarePlan allowlist entry REMOVED.</li><li>The seed corpus got the content the parallel demo efforts were missing (FHIR-29). Abnormal/critical lab flags (H/L/HH/LL interpretations on a realistic minority of results, deterministic on the anchors -- PSD-417's ask), ranked encounter diagnoses spread across the record instead of one flat rank-1 (PSD-606), authored <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html">Composition</a> notes on ~85% of encounters INCLUDING the GMF follow-up majority, amended-note snapshots (the version CHAIN stays a load-path concern -- a flat corpus cannot carry _history), a <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.meta.tag"><code>meta.tag</code></a> synthetic marker on every resource (corpus-local URN system; one <code>_tag</code> query finds or purges fixture data), per-patient collection-Bundle output behind <code>--bundles</code>, and OHIP fee-code variety (six schedule entries, occasional add-on line item) instead of a single hardcoded A007.</li><li>The coverage guarantee now fails in BOTH directions (FHIR-29). A new inverse check: any resource type the generator EMITS that the IG does not profile fails the guarantee unless it has a documented ALLOWED_UNMODELED entry (same visible-reasoned style as the existing exclusions). The motivating example -- 293 un-modelled CarePlans quietly shipping into benchmark stores -- is now the one allowlisted entry, explicitly flagged as pending the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-careplan.html">CarePlan</a> modelling ruling rather than resolved.</li><li><code>bin/pre-pr.sh</code>: the mandatory owner-track pre-PR gate (FHIR-29). One entry point chaining SUSHI build -&gt; example conformance -&gt; version-drift check (sushi-config vs ig-specs.ts, automating the hand-bump that trailed a release) -&gt; IG vendoring + code generation for every generated consumer (TS, Python, C#, and the docs tree) -&gt; <code>npm run verify</code> (the WHOLE TS suite, i.e. what CI runs, not a slice of it) -&gt; the data-generator typecheck -&gt; the bidirectional data-generator coverage guarantee -&gt; a git-clean lockstep check on every generated tree. Documented as mandatory in the IG owner release process: regenerating code from the IG and proving data-generation coverage are now ONE event, so the corpus can never again trail the spec the way the note model did. The gate now covers EVERY generated consumer of this IG -- the TypeScript, Python and C# libraries and this documentation site -- and refuses to pass unless all of them regenerate clean from the same FSH. What that buys a consumer: the artifacts published under one version cannot silently be a release apart.</li><li>The seed-data generator covers the whole 1.15.0 IG surface again (FHIR-29). The coverage guarantee is green across every dimension (profiles, must-support, bindings, invariants, extensions): the anchors gained the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html">Composition</a> encounter note (the 1.14.0 note switch), both consent shapes (app-consent grant + deny, item-consent provided + declined-with-evidence), the AI-suggestion <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html">Task</a> (contained payload, thread-id, logical Device requester), the prevention-status <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-observation.html">Observation</a>, the boolean app-state, and the heritage-inactive <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient.html">Patient</a> (record-inactive-reason) -- plus a latent app-state extension URL bug fixed. TypedFhir's generated validators are now SIBLING-PROFILE AWARE: a resource declaring a sibling profile of its type via meta.profile (Consent app/item, Device app/emr) is validated against that profile's own rules instead of whichever profile sorted first -- previously every item-consent instance failed app-consent's pinned category, in every port that validates. The dispatch is emitted by all three facade generators, so TypeScript, Python and C# behave identically; a conformant item-consent and a conformant emrdevice are pinned in the cross-language parity corpus (vectors/facade-adversarial.json), so a port that loses the dispatch fails the parity gate rather than silently rejecting valid resources. nexus-sugg-1 was reformulated inside the compilable FHIRPath subset (plain choice access instead of ofType; same semantics), so it is machine-enforced rather than prose. The vendored IG, generated tables, facades (TS + Python + C#) and registries now stand at 1.15.1.</li><li>AI suggestions are modelled as resources CONTAINED in their review <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html">Task</a> (FHIR-29). A suggested chart entry is never a first-class chart resource pre-approval: it rides <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.contained"><code>Task.contained</code></a>, referenced from the new pattern-sliced <code>suggestion</code> input (<code>input.type = nexus-suggestion#suggested-resource</code>), with <code>Task.code = ai-suggestion</code> (enforced by the new nexus-sugg-1/2 invariants: the suggestion reference SHALL be local, and a suggestion Task SHALL declare itself). Type-level queries cannot see suggestions by construction -- confirmed empirically on both the WellServices store (MS FHIR Server for Azure) and Medplum. Lifecycle rides Task.status natively (requested -&gt; accepted/completed, or rejected -- rejected Tasks and their payloads are RETAINED as the record of what was declined). New: the <code>nexus-thread-id</code> extension (harness thread traceback), the <code>nexus-suggestion</code> CodeSystem, and a full contained-suggestion example (AIAST-labelled Task carrying a suggested <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-condition.html">Condition</a>).</li><li>AI agent identity: logical Device references, no registration (FHIR-29). An AI graph acting in the EMR is a Device referenced BY IDENTIFIER (the new <code>nexus-harness-graph</code> NamingSystem -- the tree's first declared identifier-kind NamingSystem; <code>Reference.type = "Device"</code>); the identifier points into the harness's graph registry and need not resolve to a Device resource on the server. Granularity is deliberately graph/feature level. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.requester"><code>Task.requester</code></a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.owner"><code>Task.owner</code></a> now admit Device: an AI-created <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html">Task</a> names its graph as requester, and REASSIGNING a Task to an agent Device is the approve/resume contract (the harness watches task-assignment changes and resumes the thread named by the thread-id extension).</li><li>TypedFhir (Python): since-checkpoint delta fetch + <code>PatientCache.refresh</code> (PSD-731). <code>fetch_resources_delta</code> answers "what changed since this opaque checkpoint" (<code>_lastUpdated</code>-windowed on the WellServices gateway, with an overlap so out-of-order commits are never lost; full-fetch fallback on every other source), and <code>PatientCache.refresh</code> merges the delta in place by <code>(resourceType, id)</code>. Checkpoints never advance past a window a covered type failed to sweep; a query built before a refresh raises rather than answering from stale bits. Hard deletes are invisible to FHIR search, so a refresh converges between full loads rather than replacing them. A cross-patient resource inside a delta is treated as an ERROR (backend corruption, dropped + error issue + held checkpoint, so it re-reports every refresh until fixed) -- never as a quiet removal.</li></ul>]]></description>
      <nexus:version>1.15.1</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>false</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.15.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1150-2026-08-11-withdrawn</link>
      <guid isPermaLink="false">health.apps.nexus-1.15.0</guid>
      <enclosure url="https://well-polaris.github.io/nexus-ig/packages/nexus-1.15.0.tgz" length="1080343" type="application/gzip"/>
      <description><![CDATA[<p>Release 1.15.0 of the Nexus IG.</p>]]></description>
      <nexus:version>1.15.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>false</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.14.1</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1141-2026-08-09</link>
      <guid isPermaLink="false">health.apps.nexus-1.14.1</guid>
      <pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate>
      <description><![CDATA[<ul><li>SMART on FHIR exposure is now declared per profile (the new <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-smart-exposed.html"><code>smart-exposed</code></a> extension). Whether a resource type can be reached by a SMART app is an authorization decision, and it is now recorded in the IG rather than inferred from whether the resource happens to be profiled. A profile carrying the extension is reachable, and names the platform permission each operation costs (<code>observation:read</code>, <code>observation:write</code>, <code>observation:delete</code>). A profile without it is not reachable at all, so a newly profiled resource stays closed until someone decides otherwise. 29 resource types are exposed, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html"><code>Composition</code></a> among them, since an encounter note is core clinical content for an app. The seven experimental profiles (<a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-communication.html">Communication</a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-detectedissue.html">DetectedIssue</a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-messageheader.html">MessageHeader</a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-provenance.html">Provenance</a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaireresponse.html">QuestionnaireResponse</a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-specimen.html">Specimen</a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-subscription.html">Subscription</a>) are deliberately left closed. Six of the 29 are exposed read-only — <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-practitioner.html"><code>Practitioner</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-practitionerrole.html"><code>PractitionerRole</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-organization.html"><code>Organization</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-location.html"><code>Location</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-schedule.html"><code>Schedule</code></a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-slot.html"><code>Slot</code></a> — because they are reference and directory data the EMR maintains rather than something a third-party app should rewrite, and a delete there is data loss rather than a workflow step. For app authors this is the answer to "what do I ask for": every resource page now carries a SMART tab listing the scope strings that work against that resource and the permission each one resolves to. The permission tokens are referenced here, not defined: they belong to the EMR's own role model (the same tokens an administrator sees when building a role), and code generation fails if the IG names one that does not exist there. SMART's scope grammar itself (the <code>c</code> <code>r</code> <code>u</code> <code>d</code> <code>s</code> interaction letters, <code>.read</code>/<code>.write</code> folding, wildcard expansion) is deliberately not modelled in the IG: translating it is the gateway's job, and the IG answers only "is this exposed, and what does each operation cost". (FHIR-28)</li><li>TypedFhir 0.8.0 surfaces SMART exposure in all three ports and now publishes as a NuGet package. <code>SmartExposedResources</code>, <code>IsSmartExposed()</code> and <code>GetSmartScope()</code> (snake_case in Python) are generated from the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-smart-exposed.html"><code>smart-exposed</code></a> extension, so a consumer asks the library what an app may reach rather than transcribing the answer. Generation refuses to emit a table naming a permission the platform does not define, and a test asserts the same on every CI build, which is what keeps the IG's published permission tokens and the EMR's role model from drifting apart. The C# port ships as <code>Well.Services.TypedFhir</code> with an optional <code>Well.Services.TypedFhir.Firely</code> adapter for hosts that hold Firely POCOs; the core takes no Firely dependency. (PSD-721)</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-effective-date.html"><code>effective-date</code></a> is now a declared extension. 38 profiles stamped <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-effective-date.html"><code>https://fhir.apps.health/StructureDefinition/effective-date</code></a> via the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-effective-date.html"><code>EffectiveDate</code></a> / <code>NoEffectiveDate</code> RuleSets while nothing defined it, so the canonical resolved to nothing and the IG Publisher objected on every single use. The declaration changes no stamped data; it only makes the URL resolve, and adds the constraint the RuleSets always implied but could not state: a profile declares either which paths carry its date (26 do) or that it deliberately has none (12 do), never both and never neither. Its sibling <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-salient-field.html"><code>salient-field</code></a> was declared all along, which is what made the gap visible. (FHIR-27's open item, closed here alongside the new <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-smart-exposed.html"><code>smart-exposed</code></a>.)</li><li>18 CodeSystem and ValueSet ids no longer contradict their own canonical URLs. Each carried a <code>cs-</code> / <code>vs-</code> prefix its URL did not (<code>cs-nexus-emr-province-state</code> against <code>.../CodeSystem/nexus-emr-province-state</code>), which the IG Publisher rejected three times over per resource — 54 errors. The id was corrected to match the URL, never the reverse: a canonical URL is the published contract and every existing binding and reference points at it, while the id is local and the resource type already disambiguates a CodeSystem from a ValueSet of the same name. No canonical URL changed, so nothing downstream needs updating. (FHIR-28)</li><li>A second, dead copy of four FSH files is gone. <code>doc/fhir/input/fsh/</code> held duplicates of the province-state CodeSystem and the gender-identity, pronouns and province-state ValueSets. The build reads <code>src/fsh/</code> (staged into <code>.build/</code> by <code>bin/build.sh</code>), so the copies shipped nothing and nothing referenced them — but they had already silently rotted: their titles were the pre-rename originals, so anyone reading or editing them was working from a stale file that looked authoritative. (FHIR-28)</li><li>The <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-invoice.html">Invoice</a> example's practitioner reference resolves. It pointed at <code>Practitioner/dr-navarro</code> where the example's actual id is <code>dr-emil-navarro</code>, so the reference dangled in every validation run. (FHIR-28)</li></ul>]]></description>
      <nexus:version>1.14.1</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>false</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.14.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1140-2026-08-09</link>
      <guid isPermaLink="false">health.apps.nexus-1.14.0</guid>
      <pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate>
      <description><![CDATA[<ul><li>Item consent (<a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-item-consent.html"><code>nexus-emr-core-item-consent</code></a>) — a patient-level <code>Consent</code> profile for the Patient Profile's Consent section: one Consent per (patient, item) for the fixed phase-1 catalogue (email, SMS, AI scribe — the new <a href="https://well-polaris.github.io/nexus-ig/fhir/CodeSystem-nexus-consent-item.html"><code>nexus-consent-item</code></a> CodeSystem/ValueSet), updated in place with the decision read from <code>status</code> alone (<a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient-elements-details.html#el-Patient.active"><code>active</code></a> = provided, <code>rejected</code> = declined, no resource = not recorded) and the full decision history served by FHIR versioning (<code>_history</code>/<code>vread</code>); includes the optional <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-consent-status-reason.html"><code>nexus-consent-status-reason</code></a> extension, evidence via <code>sourceReference</code> to a <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference.html"><code>NexusEmrCoreDocumentReference</code></a> (the <code>Attachment</code> choice is removed from <code>source[x]</code> so evidence stays behind DocumentReference read permission), examples, and the item-consent feature guide. Unlike its siblings the profile carries no raw-identifier invariant — an item consent is born in the EMR, so there is no source system to point back at and the rule could only ever be satisfied by inventing one — and instead warns (<a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-item-consent-invariants.html#inv-item-consent-status-is-defined"><code>item-consent-status-is-defined</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-item-consent-invariants.html#inv-item-consent-performer-is-attributable"><code>item-consent-performer-is-attributable</code></a>) where the prose asks for more than cardinality and bindings can express: a status outside the three codes it defines, or a decision with no attributable <code>performer.display</code>. The guide adds the migration caveats this model creates: version history does not survive a bulk export/import and must be replayed per version, and the deterministic identifier embeds the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient.html">Patient</a>'s logical id, so re-keying patients means recomputing every one. (PSD-501, epic PSD-316)</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html"><code>Composition</code></a> is now the model for authored clinical notes — encounter notes, consult notes, telephone notes: anything an EMR user writes or an AI scribe drafts and a clinician signs. The narrative lives in FHIR as XHTML in <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.section.text"><code>section.text</code></a>, so a note is readable, searchable and diffable without dereferencing a blob, and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.status"><code>Composition.status</code></a> carries the lifecycle (<code>preliminary</code> draft → <code>final</code> signed → <code>amended</code>) instead of an invented extension. Amendments are version history over one resource — edit in place and set <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.status"><code>status</code></a> to <code>amended</code>; the business identifier does not change and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.relatesTo"><code>relatesTo</code></a> is deliberately left unprofiled so it stays available if a true addendum workflow later appears. A signed note must name its signer (<a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-invariants.html#inv-composition-signed-has-attester"><code>composition-signed-has-attester</code></a>). <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.author"><code>author</code></a> admits a <code>Device</code>, so an AI-drafted note can say so on the resource, while attestation remains the clinician's alone. Two examples ship: a signed progress note, and a scribed telephone note that was signed and then corrected. Decided on the August 2026 SMART-launch review. (FHIR-27) &gt; This re-introduces a profile removed four days earlier, deliberately. <code>bde96cee4</code> (1.11.0) &gt; deleted an experimental <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html"><code>NexusEmrCoreComposition</code></a> on the grounds that the surface was &gt; "experimental and unused, and publishing it invited implementers to build against a shape the &gt; IG was not committing to." That reasoning was sound and is now spent: there is a committed &gt; consumer. What returns is only the encounter-note subset — not the four-section-type &gt; (text/form/canvas/file) surface with recursive containment and coordinate annotations, whose &gt; removal also cleared two unevaluable-slicing defects. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.section.code"><code>section.code</code></a> is left unbound for the &gt; same reason: no producer populates it yet. &gt; Known dependency, stated plainly. The amendment model rests on version history, and version &gt; history is server-local — <code>_history</code> does not travel in bundles, <code>$everything</code>, or sync &gt; pipelines. This IG also publishes no CapabilityStatement, so no versioning policy is declared &gt; anywhere, and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.meta.versionId"><code>meta.versionId</code></a> is server-opaque in R4 and unconstrained here: consumers must &gt; not sort or parse it to determine which version was signed. Reconstructing the as-signed note &gt; is reliable only on the authoring server today. Declaring the version-history contract is &gt; outstanding work and a prerequisite for relying on this across boundaries.</li><li>IG HTML publishing is scripted — <code>bin/publish.sh</code> renders the IG to browsable HTML and optionally zips it for sharing (<code>-full</code> / <code>-slim</code>, both labelled so neither can be mistaken for the other or overwrite it). This is release step 6 of the <a href="https://github.com/AwareMD/WellServices/blob/main/doc/fhir/docs/guide/contributing/ig-owner-release-process.md">IG Owner Release Process</a>, which until now said only "note the deferral". Also establishes <code>bin/</code> as the home for IG maintenance scripts, with the conventions written down. (FHIR-27)</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference.html"><code>DocumentReference</code></a> narrows to attached binary documents — scans, faxes, external PDFs, Word files, consent forms: content that arrives as bytes. It is no longer the home for textual encounter notes (see <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html"><code>Composition</code></a> above), and the profile now states the boundary rule explicitly: did we author it, and is the content text we control? A consult letter received as a PDF stays here; a consult note typed in the EMR does not. This is a deliberate divergence from US Core, which models clinical notes as DocumentReference; the rationale is recorded on both profiles. (FHIR-27)</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference.html"><code>DocumentReference</code></a> content documentation now matches what the gateway actually does. The profile described content as inline-base64-first and claimed external URLs were unsupported — both untrue since the gateway grew document storage, so implementers were reading a contract the runtime no longer honoured. Now documented: submit inline base64 with no <code>url</code>; the gateway stores the bytes and rewrites the attachment (sets <code>url</code>, computes <code>size</code> and SHA-1 <code>hash</code>, clears <code>data</code>), so readers get a URL and no inline data. The URL is an absolute File Storage Service address, not a FHIR <code>Binary</code> reference and not a pre-signed/SAS link — fetching it needs the caller's own bearer token and resolves within the caller's tenant. It is stable for the life of the document and survives updates. Sending <code>data</code> and <code>url</code> together bypasses storage and persists the base64 inline permanently; the profile now warns against it. Client-supplied URLs are host-validated and rejected with a 400 when untrusted. (FHIR-27)</li><li>Removed the <code>prose</code> salient accessor from <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference.html"><code>DocumentReference</code></a>. It decoded <code>content.first().attachment.data</code> and offered it to chart and model readers as long-form text. Wrong on two counts once the scope narrowed: the content is now a PDF or TIFF, so decoding it yields binary rather than prose; and the gateway clears <code>data</code> on write, so it resolved to empty for every gateway-ingested document anyway. Replaced with <code>title</code> and <code>url</code>. The narrative reader surface is <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition-elements-details.html#el-Composition.section.text"><code>Composition.section.text</code></a>. (FHIR-27)</li><li>Dropped the boilerplate "Future Considerations" sections from 16 profile intro pages — speculative "potential enhancements being evaluated" lists that read as commitments the IG had not made. 156 lines removed; no profile, element, or binding changed. (FHIR-27)</li><li>The tree is restructured around <code>src/</code> and a contained build. FSH now lives in <code>src/fsh/</code> (was <code>input/fsh/</code>), examples in <code>src/examples/</code>, per-profile narrative in <code>src/pages/</code>, and the IG configuration (<code>sushi-config.yaml</code>, <code>ig.ini</code>, <code>ignoreWarnings.txt</code>) in <code>src/ig/</code>. The FHIR toolchain's hard-coded conventions no longer shape the tree: <code>bin/build.sh</code> stages <code>src/</code> 1:1 into the gitignored <code>.build/</code> and runs SUSHI (and, at publish time, the IG Publisher) in there, so all generated output and tool scratch (<code>fsh-generated/</code>, <code>temp/</code>, <code>template/</code>, <code>input-cache/</code>, the rendered site) is contained in one disposable directory. <code>conformance/run-conformance.sh</code> folded into <code>bin/conformance.sh</code> — <code>bin/</code> is the single home for tooling. No profile, example, or canonical URL changed — this is a layout-and-tooling change only. (FHIR-27)</li><li>The IG is titled "Nexus IG" (was "Nexus EMR FHIR Implementation Guide") — nothing else in the Nexus ecosystem defines an IG, and the spec serves more than the EMR. The formal title, the site name (which now carries the version, e.g. "Nexus IG 1.14.0"), and site prose all use the short form. Identity is untouched: <code>id: nexus-emr</code>, the canonical base, and all profile slugs are unchanged. This CHANGELOG is now published on the site and linked from the front page. (FHIR-27)</li><li>Artifact display titles normalized — three authoring generations of title styles ("X Profile Core", "X Core", "X (Minimal) Core", unprefixed extensions) collapse to one pattern: <code>"&lt;X&gt; Profile"</code> with qualifiers trailing (<code>"Slot Profile (Minimal)"</code>), and no <code>Nexus EMR</code>/<code>Nexus</code> brand prefix (the canonical URL carries the namespace). 53 titles changed. Display-only: no id, URL, <code>name</code>, or element change; <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-slot-elements-details.html#el-Slot.meta.profile"><code>meta.profile</code></a> values and references are unaffected. (FHIR-27)</li><li>The human-readable IG is now one MkDocs site, not the IG Publisher's HTML. <code>bin/site.sh</code> builds (or serves, with live reload) the guide plus a FHIR reference generated from the compiled IG — profile pages with differential tables, bindings, invariants and linked examples — by TypedFhir's new <code>ig-docs</code> renderer (<code>@awaremd/typed-fhir/ig-docs</code>). The IG Publisher survives as the package + QA factory (<code>bin/publish.sh</code>): validators and generators consume its <code>package.tgz</code>, published at the site root next to <code>package-list.json</code>; its Jekyll HTML is not published anywhere. Profile pages present the resource as five tabbed views — Differential, Key elements, Snapshot, FSH source, Examples — and example JSON is hyperlinked (references to other examples and canonical URLs are clickable, with "Referenced by" backlinks), so instances browse as a graph. The site carries the Nexus EMR frontend's WELLSTAR Stardust branding (blue-on-clay light, navy-clay dark, IBM Plex, the Nexus mark). Profile pages also carry a Salient fields view (the synthesized-accessor contract: key, type, FHIRPath expression) and a TypedFhir API view with TypeScript / Python / C# sub-tabs showing the generated facade for the profile's resource type. Extensions used by exactly one profile nest under that profile in the sidebar; only shared/cross-cutting ones remain top-level. Also fixed en route: <code>sushi --snapshot .</code> silently dropped the flag (0/51 snapshots) — the staged build now runs <code>sushi build . --snapshot</code> (51/51), which is what TypedFhir's vendored artifacts are regenerated from. (FHIR-27)</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-organization.html">Organization</a> references in three <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient.html">Patient</a> examples used a NamingSystem the Organization example does not own (<code>.../cedarbrook-clinic-organization-identifier</code> vs the <code>organization-identifier</code> system the Organization profile's invariant names) — the references were unresolvable as data. Normalized to <code>organization-identifier</code>. (FHIR-27)</li></ul>]]></description>
      <nexus:version>1.14.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>false</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.12.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1120-2026-08-05</link>
      <guid isPermaLink="false">health.apps.nexus-1.12.0</guid>
      <pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate>
      <description><![CDATA[<ul><li>Seven new draft profiles, for the resource types this stack demonstrably reads or writes with no profile behind them — <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-detectedissue.html"><code>DetectedIssue</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-communication.html"><code>Communication</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaireresponse.html"><code>QuestionnaireResponse</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-messageheader.html"><code>MessageHeader</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-subscription.html"><code>Subscription</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-specimen.html"><code>Specimen</code></a>, and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-provenance.html"><code>Provenance</code></a>. All are <code>#draft</code> + <code>experimental = true</code> first passes: each declares its identifier contract, its effective date (or <code>NoEffectiveDate</code>), its patient/subject reference, and the constraints load-bearing for the surface already consuming it — and each names inline what it deliberately does not settle, so a reader can tell a decision from a placeholder. Highest-consequence of the set: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-detectedissue.html"><code>DetectedIssue</code></a> (the prescribing override audit trail, previously ungoverned), <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-questionnaireresponse.html"><code>QuestionnaireResponse</code></a> (the chart's journey timeline could not date it), and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-provenance.html"><code>Provenance</code></a> (a deliberate placeholder for AI-Harness action attribution — token/model accounting and the gateway <code>UpdatedBy</code> reconciliation are explicitly left open). Scope note for IG consumers: profiles are added for observed consumption, not for reachability. Types that are merely granted a SMART app scope, or merely traversed as a containment field, do not get a profile on that basis — the app scope is the thing that should narrow. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-specimen.html"><code>Specimen</code></a> qualifies on a narrower basis than the others and says so in its own notes: one real site resolves <code>ServiceRequest.specimen</code> references in eReferral bundles, and nothing reads a Specimen's own fields, so it is governed as a pass-through type. Still deliberately NOT profiled on the same rule: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-careplan.html"><code>CarePlan</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-goal.html"><code>Goal</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-coverage.html"><code>Coverage</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationstatement.html"><code>MedicationStatement</code></a>, <code>ImagingStudy</code>, <code>Media</code>, <code>MedicationAdministration</code>, <code>Medication</code>. (FHIR-25)</li><li>Heritage-EMR situations are now documented on the affected element definitions, and flagged as UNRESOLVED — so the caveat travels into the IG pages and the generated typed API rather than living in a reviewer's head. Covered: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient-elements-details.html#el-Patient.address.state"><code>Patient.address.state</code></a> / <code>.country</code> (heritage EMRs store province as unvalidated free text, so the new <code>required</code> bindings are an open migration risk — the distribution has not been measured); <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-specimen-elements-details.html#el-Specimen.identifier"><code>Specimen.identifier</code></a> / <code>.accessionIdentifier</code> / <code>.subject</code> (heritage lab results carry an accession and little else, with no cross-lab namespacing for it and a patient link that is inferred rather than asserted); and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-communication-elements-details.html#el-Communication.identifier"><code>Communication.identifier</code></a> / <code>.category</code> (heritage message/inbox history is not FHIR <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-communication.html">Communication</a> and whether to migrate it at all is undecided — every Communication in this IG is currently either WELL-native or external eReferral, never heritage-migrated). Each note says what is unknown and what would resolve it. (FHIR-25)</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-provenance-elements-details.html#el-Provenance.agent.type"><code>Provenance.agent.type</code></a> is <code>1..1</code> — tightened from the base <code>0..1</code> to match US Core 9.0.0 <code>us-core-provenance</code>, which also sets it <code>min 1</code>. It is the only element distinguishing a non-human generating agent from the human who accepted its output, which is the whole reason the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-provenance.html">Provenance</a> placeholder exists; two untyped agents are an ambiguous record. Note this IG deliberately does not adopt US Core's must-support on <code>target.reference</code> — that would require literal references, and the Nexus logical-reference model permits identifier-only. (FHIR-25)</li><li>New <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient.html">Patient</a> example for the 1.12.0 identity surface — <code>Patient/rowan-mercier-no-health-card</code> exercises <code>reasonForNoHCN</code> (on the MRN identifier), <code>genderIdentity</code> and <code>pronouns</code> in their correct complex form, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient-elements-details.html#el-Patient.name.prefix"><code>name.prefix</code></a>, and both required <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient-elements-details.html#el-Patient.address"><code>address</code></a> bindings. Added because the new must-support elements previously shipped with no conforming instance, and the complex-extension shape (<code>extension[value].value[x]</code>; the extension root's <code>value[x]</code> is <code>0..0</code>) is the one contributors get wrong. (FHIR-25)</li><li>Reason for no health card number — Ontario's CA-eReC extension, ADOPTED not re-minted — [<code>Patient.identifier.extension[reasonForNoHCN]</code>](fhir/StructureDefinition-nexus-emr-core-patient-elements-details.md#el-Patient.identifier.extension-reasonForNoHCN), using <code>http://fhir.infoway-inforoute.ca/io/CA-eReC/StructureDefinition/CA-eReC-reason-for-no-HCN-EXT</code>. Ontario eReferral requires <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient-elements-details.html#el-Patient.identifier"><code>Patient.identifier</code></a> to carry either the health card number or a documented reason for its absence; this is the "or" half, and it completes the PHN identifier work begun in #768. New IG dependency: <code>ca.on.erec.r4</code> pinned at <code>0.12.6-TU-snapshot1</code> (exact pre-release pin — Ontario's own artifact is <code>draft</code> 0.10.1 and will move). Two things consumers should know. (1) The context is <code>Patient.identifier</code>, not <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient.html"><code>Patient</code></a> — so it rides on an identifier the patient does have, in practice the MRN slice, because in exactly the case it describes there is no jurisdictional identifier to attach it to. SUSHI propagates the element to the base <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient-elements-details.html#el-Patient.identifier"><code>identifier</code></a> and to both the <code>jurisdictional</code> and <code>mrn</code> slices. (2) Ontario's value set holds one clinical code (<code>#no-HC</code>) plus <code>data-absent-reason</code> <code>#not-asked</code> / <code>#asked-declined</code>, so it cannot distinguish newborn-awaiting-registration from refugee-on-IFHP from card-not-presented; carry those specifics in <code>.text</code>, or as an additional coding from a CodeSystem the IG declares. A Nexus-canonical equivalent was drafted and withdrawn in favour of the jurisdictional canonical, so later Ontario/Union-IG conformance is re-badging rather than remodelling. (FHIR-25)</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-encounter-elements-details.html#el-Encounter.appointment"><code>Encounter.appointment</code></a> is now modelled — the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-appointment.html">Appointment</a>↔<a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-encounter.html">Encounter</a> link, with the primary-care 1:1 expressed as a warning invariant plus prose rather than as cardinality. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-encounter-elements-details.html#el-Encounter.appointment"><code>appointment</code></a> stays <code>0..</code>: R4 permits several Encounters to reference one Appointment (a visit that splits into multiple encounters — routine for specialists) and one Encounter to fulfil several Appointments, so tightening the cardinality would foreclose both and have to be unwound. Documents that Encounter is the association anchor for clinical resources, and that R4 has no reverse element on Appointment, so that direction requires a search. (FHIR-25)</li><li><code>Address.state</code> and <code>Address.country</code> are now bound — the only prior statement was non-computable prose ("valid province codes"), and the divergence it permitted is already realized in production: one writer emits ISO alpha-3 while the address UI emits alpha-2, consumers do positional string surgery on the result, and outbound jurisdictional HL7 has been observed carrying <code>"Ca-io"</code> and <code>"CANio"</code>. <code>state</code> binds required to the new <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-emr-province-state.html"><code>NexusEmrProvinceStateVS</code></a> (bare two-letter subdivision codes, 13 CA + 56 US, mirroring the frontend roster); <code>country</code> binds required to <code>iso3166-1-2</code> (alpha-2), with alpha-3 an edge form only. Both are deliberately <code>required</code> against this IG's usually-lenient posture, because a closed roster is the only thing that makes the corruption fail loudly; <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient-invariants.html#inv-patient-address-country-alpha2"><code>patient-address-country-alpha2</code></a> (warning) names the observed bug so the diagnostic survives a lenient validator. ⚠ Producers writing spelled-out province names or alpha-3 country codes become non-conformant. ⚠ Migration caveat, carried in both elements' definitions so it reaches the IG pages and the generated typed API: these bindings were validated against the IG's own examples only — legacy inbound source-EMR data has not been surveyed, and source systems emit uncoded free-text on adjacent address fields, so spelled-out province names are plausible in existing records. Implementers migrating a corpus SHOULD profile their <code>state</code>/<code>country</code> distribution before enforcing, and MAY treat the bindings as <code>extensible</code> during migration (the warning invariant still reports the alpha-3 case). The caveat comes out of the definitions once the survey is done. (FHIR-25)</li><li><code>genderIdentity</code> and <code>pronouns</code> now carry bindings — the IG adopted both HL7 extensions and bound neither, leaving real terminology governance in frontend TypeScript on must-support elements. <code>genderIdentity</code> binds required to <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-emr-gender-identity.html"><code>NexusEmrGenderIdentityVS</code></a>, deliberately broader than the HL7 value set it inherits: 10 of its 13 SNOMED concepts are Canada Health Infoway namespace (pan-Canadian GSSO) and are not members of <code>hl7.org/fhir/ValueSet/gender-identity</code>. <code>pronouns</code> binds extensible to <a href="https://well-polaris.github.io/nexus-ig/fhir/ValueSet-nexus-emr-pronouns.html"><code>NexusEmrPronounsVS</code></a> (LOINC answer list), since pronoun sets are open-ended. Note both are complex extensions: the bindings sit on <code>extension[value].value[x]</code>, not on the extension root, whose <code>value[x]</code> is <code>0..0</code>. Absence reasons remain a <code>data-absent-reason</code> extension on the value and are not value-set members. (FHIR-25)</li><li>No generated directory is version-keyed any more, so a release renames nothing. The generated registry subpackage moves from <code>src/ig/generated/nexus_emr_v&lt;major&gt;_&lt;minor&gt;_&lt;patch&gt;/</code> to <code>src/ig/generated/nexus_emr/</code> (and the Python twin), finishing what 1.11.0 started when it de-versioned the vendored <code>ig/nexus-emr/</code> directory. Exactly one version is generated at a time, so the version in the path carried no information the artifacts did not already hold — and it forced a <code>git mv</code> on every release, which made git record a whole-directory delete-plus-add and drowned the real spec diff in a release PR. The registry selector key is unchanged (<code>nexus-emr-v1.12.0</code>); the version still travels in the generated file headers, in <code>IG_META</code>, and in that key. Consumers importing the generated modules by path must update the path once; consumers resolving through the registry are unaffected. (FHIR-25)</li><li>Three profiles documented a <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-practitionerrole.html">PractitionerRole</a> requirement their own constraints had already dropped — <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference-elements-details.html#el-DocumentReference.authenticator"><code>DocumentReference.authenticator</code></a> read "Reference must be to a NexusEmrCorePractitionerRole" two lines above a constraint permitting both; <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference-elements-details.html#el-DocumentReference.author"><code>DocumentReference.author</code></a> said authors are "represented by NexusEmrCorePractitionerRole"; <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient-elements-details.html#el-Patient.generalPractitioner"><code>Patient.generalPractitioner</code></a> said it "links to PractitionerRole". The same defect class 1.12.0 fixed in <code>resource-relationships.md</code>, and worse in effect, because these strings are baked into TypedFhir's generated <code>FieldDoc</code> and so mis-teach every consumer of the generated facade. Prose only — no constraint changed. (FHIR-25)</li><li>Practitioner is the primary provider identity; the Appointment provider participant is no longer PractitionerRole-shaped — this release relaxed every provider reference element to accept <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-practitioner.html"><code>Practitioner</code></a> alongside <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-practitionerrole.html"><code>PractitionerRole</code></a>, but <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-appointment.html"><code>Appointment</code></a> was missed. The invariant <code>appointment-participant-practitionerrole</code> is renamed to <code>appointment-participant-provider</code> and now counts the provider participant regardless of which resource names them. The old rule was vacuous — a <code>Practitioner/</code>-shaped participant scored zero and passed — while reading as though PractitionerRole were required. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-appointment-elements-details.html#el-Appointment.participant"><code>Appointment.participant</code></a>'s definition and comment, and the <code>createdBy</code> extension's reference-target order and prose, now put Practitioner first. The walk-in example's provider changed from <code>PractitionerRole/dr-navarro-familymed-role</code> to <code>Practitioner/dr-emil-navarro</code>, so a <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-practitioner.html"><code>Practitioner</code></a>-shaped provider finally has a canonical example; the with-slot example deliberately keeps its <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-practitionerrole.html"><code>PractitionerRole</code></a> provider so both permitted spellings are exemplified. Consumers validating against the old invariant key must update it. (FHIR-25)</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-schedule-elements-details.html#el-Schedule.actor"><code>Schedule.actor</code></a> now accepts a raw <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-practitioner.html">Practitioner</a> as the provider — <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-schedule.html">Schedule</a> was the only place a <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-practitionerrole.html">PractitionerRole</a> reference was a hard requirement rather than a target-type constraint: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-schedule-invariants.html#inv-schedule-actor-required"><code>schedule-actor-required</code></a> demanded one of PractitionerRole / <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-location.html">Location</a> / HealthcareService, so a Practitioner-shaped Schedule — the shape a primary-care writer would naturally emit — failed outright. The invariant now accepts a provider under either spelling, and <code>schedule-actor-practitionerrole-max</code> is renamed to <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-schedule-invariants.html#inv-schedule-actor-provider-max"><code>schedule-actor-provider-max</code></a>, capping the provider actor at one whichever resource names them. <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-schedule-elements-details.html#el-Schedule.actor"><code>actor</code></a>'s definition documents both. Consumers validating against the old invariant key must update it. (FHIR-25)</li></ul>]]></description>
      <nexus:version>1.12.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>false</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.11.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1110-2026-08-02</link>
      <guid isPermaLink="false">health.apps.nexus-1.11.0</guid>
      <pubDate>Sun, 02 Aug 2026 00:00:00 +0000</pubDate>
      <description><![CDATA[<ul><li>12 examples were never validated against their profiles — their <code>meta.profile</code> named a canonical that does not exist (<code>nexus-emr-emrdevice</code>, <code>nexus-emr-allergyintolerance</code>, <code>nexus-emr-appdevice</code>, <code>nexus-emr-appstate</code>, <code>nexus-emr-clinicalimpression</code>, <code>nexus-emr-diagnosticreport</code>, <code>nexus-emr-documentreference</code>, <code>nexus-emr-medicationdispense</code>, <code>nexus-emr-servicerequest</code>, <code>nexus-emr-document-bundle-core</code>), all missing the <code>-core</code> infix the profile Ids actually carry. The validator cannot resolve an unknown profile, so it silently falls back to base FHIR: those examples reported "0 errors" while never being checked against the profile they advertise. Corrected to the declared Ids, so every example is now checked against the profile it claims. (FHIR-25)</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-careteam.html">CareTeam</a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-flag.html">Flag</a> and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-relatedperson.html">RelatedPerson</a> now declare an effective date — the <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-effective-date.html"><code>EffectiveDate</code></a>/<code>NoEffectiveDate</code> sweep covered 26 profiles but not the three added alongside it, so consumers fell back to guessing. All three declare <code>NoEffectiveDate</code>: they are parties and administrative assertions, not dated events. Without it, RelatedPerson derived <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-relatedperson-elements-details.html#el-RelatedPerson.birthDate"><code>birthDate</code></a> as its effective date — the exact invented-date failure the ruleset exists to prevent. (FHIR-25)</li><li><code>identifier</code> documentation no longer claims "required" on optional profiles — the FHIR-22 relaxation dropped <code>identifier</code> to <code>0..</code> on 26 profiles, but 21 still carried <code>^short</code>/<code>^definition</code> text saying "at least one business identifier is required" (and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference.html">DocumentReference</a> documented the deleted invariant as normative: "At least one identifier MUST follow the Nexus EMR naming pattern"). Those strings render on the IG profile pages and travel inside the StructureDefinitions, so implementers saw "required" on an optional element. Reworded to "recommended but not required". ClinicalTask (<code>1..</code>) keeps a floor, so its wording is unchanged. (FHIR-25)</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient.html">Patient</a> identifier slicing is now evaluable — the <code>jurisdictional</code> and <code>mrn</code> identifier slices now carry a <code>patternCodeableConcept</code> on <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-patient-elements-details.html#el-Patient.identifier.type"><code>identifier.type</code></a>. The slice used a <code>type</code> pattern-discriminator but fixed only <code>type.coding.</code> (grandchildren the matcher does not traverse), so every Patient instance failed slice evaluation in the HL7 validator. No change to what conforms; the slicing now actually validates. (FHIR-25)</li><li>Example instances corrected to validate cleanly — fixed pre-existing errors across the example corpus: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task.html">Task</a> <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.reasonReference"><code>reasonReference</code></a> cardinality (0..1) + input/output <code>type</code> code systems + a task-code display; <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationrequest.html">MedicationRequest</a> identifier/timing/dose; Consent attachment size/hash; a stray <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-invoice.html">Invoice</a> line-item extension; a double-LOINC BP <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-observation.html">Observation</a>; and the ROUTINE/WALKIN appointment display names. The full example set now passes the new <code>conformance/run-conformance.sh</code> gate: 50/50 instances, 0 errors. (FHIR-25)</li><li>The experimental clinical-document surface is gone — <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-composition.html"><code>NexusEmrCoreComposition</code></a> and <code>NexusEmrCoreDocumentBundle</code> are removed from the IG, along with the extensions and value sets that existed only to serve them: <code>nexus-emr-markdown-content</code>, <code>nexus-emr-embedded-section</code>, <code>nexus-emr-embedded-section-answer</code>, <code>nexus-emr-embedded-section-response</code>, <code>nexus-emr-canvas-annotation</code>, <code>nexus-emr-canvas-metadata</code>, <code>nexus-emr-file-metadata</code>, and the <code>nexus-emr-embedded-section-types</code> / <code>nexus-emr-canvas-annotation-types</code> / <code>nexus-emr-coordinate-systems</code> / <code>nexus-emr-file-categories</code> value sets. The clinical-document guide pages and the document-bundle example go with them. The surface was experimental and unused; keeping it published invited implementers to build against a shape the IG was not committing to. Clinical documents remain representable through <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-documentreference.html"><code>DocumentReference</code></a>. Profiles drop 31 → 29, extensions 22 → 15, value sets 17 → 11. (FHIR-25)</li><li><code>NexusEmrCoreRosterPanel</code> (the FHIR <code>Group</code>-based panel profile) and its CPAR-specific panel/submission extensions (<code>PanelFacilities</code>, <code>PanelConfirmationDate</code>, <code>PrimaryProviders</code>, <code>SubmitDuringNextWindow</code>, <code>AutomatedSubmission</code>) — superseded by the primary-care-attachment model above.</li><li>The deprecated contained-Medication pattern: the <code>NexusEmrContainedMedicationCore</code> profile and the <code>medicationReference</code> / mandatory <code>contained</code> wiring on MedicationRequest.</li><li>The CPAR and CII feature areas (mapping guides + CPAR-specific FSH). These were dependent on the old Polaris estate; they can be reintroduced against the new model if needed.</li><li>ClinicalTask input/output remodelled — <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.output"><code>Task.output</code></a> is removed; <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.input"><code>Task.input</code></a> is now the reference(s) to the chart element(s) the task is about (a report, requisition, prescription, problem, ...), with [<code>input.value[x]</code>](fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.md#el-Task.input.value-x) constrained to <code>Reference</code> (any resource). Non-reference input parameters are no longer carried (use <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.note"><code>note</code></a>/<a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.description"><code>description</code></a> for free text). <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-clinical-task-elements-details.html#el-Task.input.type"><code>input.type</code></a> is left as a free-text label for now (no controlled vocabulary bound). This resolves the undefined task-input/output-type code systems the examples had referenced. (FHIR-25)</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationrequest.html">MedicationRequest</a>: medication is now represented inline via <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationrequest-elements-details.html#el-MedicationRequest.medication-x"><code>medicationCodeableConcept</code></a> (text required, DIN coding slice, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-medicationrequest-elements-details.html#el-MedicationRequest.medication-x"><code>medicationStrength</code></a> extension), replacing the mandated contained-Medication pattern.</li><li><a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-encounter.html">Encounter</a>: <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-encounter-elements-details.html#el-Encounter.class"><code>class</code></a> binding corrected to the canonical ValueSet <code>http://terminology.hl7.org/ValueSet/v3-ActEncounterCode</code> (was a documentation HTML URL).</li></ul>]]></description>
      <nexus:version>1.11.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>false</nexus:breaking>
    </item>
    <item>
      <title>Nexus IG 1.10.0</title>
      <link>https://well-polaris.github.io/nexus-ig/changelog.html#1100-2026-07-23</link>
      <guid isPermaLink="false">health.apps.nexus-1.10.0</guid>
      <pubDate>Thu, 23 Jul 2026 00:00:00 +0000</pubDate>
      <description><![CDATA[<ul><li><code>conventions.md</code> — PR review checklist / Definition-of-Done, seeded from Ryan Watson's Polaris <code>conventions.md</code>.</li><li>Renamed <code>polaris</code> → <code>nexus-emr</code> throughout: profile names (<code>PolarisCore</code> → <code>NexusEmrCore</code>), canonical slugs (<code>polaris-core-</code> → <code>nexus-emr-core-</code>), FSH aliases, invariant ids, file names, and example instances.</li><li>Reworked identifier/code enforcement from unevaluable slices to portable FHIRPath invariants (the "evaluable-slicing" convention, inherited from <code>dev/stardust-integration</code> and never released in Polaris): <code>has-raw-identifier</code> required (<code>#error</code>) on all top-level profiles; <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-appointment.html">Appointment</a> raw-code shape invariants for <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-appointment-elements-details.html#el-Appointment.cancelationReason"><code>cancelationReason</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-appointment-elements-details.html#el-Appointment.reasonCode"><code>reasonCode</code></a>, <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-appointment-elements-details.html#el-Appointment.serviceCategory"><code>serviceCategory</code></a>, and <a href="https://well-polaris.github.io/nexus-ig/fhir/StructureDefinition-nexus-emr-core-appointment-elements-details.html#el-Appointment.serviceType"><code>serviceType</code></a> (provide-what-you-have — codings optional, but <code>code</code> + <code>display</code> required when present).</li><li>app-consent: corrected the <code>Consent.category</code> pin from the invalid <code>consentcategorycodes#infa</code> (a code that does not exist) to the valid <code>v3-ActCode#INFA</code>.</li><li>Inherited Polaris contributing/governance docs and the "Ask Fira" nav entry, in favour of the lighter maintainer-review + file-a-ticket model. &lt;!-- --8&lt;-- [end:entries] --&gt;</li></ul>]]></description>
      <nexus:version>1.10.0</nexus:version>
      <nexus:packageId>health.apps.nexus</nexus:packageId>
      <nexus:fhirVersion>4.0.1</nexus:fhirVersion>
      <nexus:breaking>false</nexus:breaking>
    </item>
</channel></rss>
