- Treat
:r4and:r4bas distinct harness versions. - Never allow R4B to resolve through implicit R4 fallback.
- Shared R4/R4B behavior is allowed only through explicit compatibility annotations.
- Keep R4 models at the existing top-level
FHIR::*namespace for backward compatibility and expose R4B models through the requiredFHIR::R4B::*namespace. - Require an explicit version at every client, task, structure, fixture, and resource-generator boundary. Omitted and unknown versions must fail fast.
fhir_clientmay use the explicit sentinelfhir_version: :autoonly for CapabilityStatement discovery. Versioned resource operations must remain unavailable until discovery selects a concrete version.- Keep version annotations explicit, even for resources that are normative or unchanged across R4 and R4B.
- Add R4B model support to
fhir_models; do not introduce a separate R4B model gem by default. - Keep the registry of versions understood by the harness separate from the versions supported by each test suite.
git@github.com:incendilabs/fhir_client.git, local path../fhir_clientgit@github.com:incendilabs/fhir_models.git, local path../fhir_modelsgit@github.com:incendilabs/fhir_dstu2_models.git, local path../fhir_dstu2_modelsgit@github.com:incendilabs/fhir_stu3_models.git, local path../fhir_stu3_models
R4B feature work is expected in fhir_models, fhir_client, and this repository. The DSTU2 and STU3 model repositories remain in scope as regression dependencies, but no R4B feature changes are expected in them.
fhir_modelsnow has namespace-aware infrastructure, generatedFHIR::R4Bmodels, checked-in R4B runtime definitions, documented generation, and R4B XML schema validation. These changes are split across commitscf7f5d5a,03059207,90cd55fd,67738dfe, and444f74f7.fhir_clientnow has explicit R4B routing and CapabilityStatement version detection in commit7bde8ed2.- Strict client versioning is a separate breaking change in commit
75d3c33:FHIR::Client.newrequiresfhir_version:, direct R4 remainsfhir_version: :r4, and automatic discovery must be requested withfhir_version: :auto. plan-executornow has a central version registry, version-aware resource routing, a generated R4B structure index, corrected version-specific fixture lookup, and explicit suite compatibility annotations. These changes are split across commits17537c9a,2e7a759,d70c01c,12e10e8, anda2b1482.- Strict harness versioning and namespace-explicit generator helpers are in
commit
16347df. - All 12 executable Ruby suites that already support R4 now explicitly support
R4B in commit
826433b. STU3-only, DSTU2-only, TestScript, and explicitly unsupported suites retain their existing annotations. - The R4B PackagedProductDefinition fixture defect is resolved. Empty generated
CodeableReferencevalues now receive a same-namespace text concept, so recursivecontainedItem.itemelements remain present when serialized. The fix is commit49e713f. - The nondeterministic R4B Questionnaire defect is resolved. Generated codes
are selected from concrete expansion entries while abstract and inactive
entries remain available in the checked-in terminology definitions. The fix
is commit
84fa7c4. plan-executornow resolvesfhir_modelsandfhir_clientfrom their mergedorigin/masterbranches, with the exact resolved revisions retained inGemfile.lock.- Remaining integration work consists of completing the STU3 and DSTU2 cross-version regression matrix.
- Reconcile the local
../fhir_modelscheckout with the version currently resolved by this repository before implementing R4B. The local checkout identifies itself as gem version4.1.0with FHIR4.0.1definitions, while this repository currently locks releasedfhir_modelsversion4.3.0. - Do not confuse the
fhir_modelsgem version with the FHIR specification version. Record both independently. - Pin the official FHIR R4B
4.3.0JSON definitions archive, JSON ValueSet expansion Bundle, and XML schema archive used for generation. Generate models and runtime definitions withbundle exec rake "fhir:generate_r4b[path/to/r4b-definitions.json.zip,path/to/expansions.json]". Generate the XML schema set withbundle exec rake "fhir:generate_r4b_schema[path/to/r4b-fhir-all-xsd.zip]". Download the artifacts from the official HL7definitions.json.zipandexpansions.jsonendpoints, and thefhir-all-xsd.zipendpoint. The pinned SHA-256 values area2793a06853c2d4540db8a72fc1c6d972528b01d113c2bb70ae2d80dc062e963for the definitions archive andfe10ca33f0de85c16b367cb57092076d7e2fbd7aff6479c8862a32bd227e3b07for the expansion Bundle, and3528d4ff44c69f2908d6159367d58b9d12fb41a48d1be3ec897947129696e6b4for the XML schema archive. - Define the local cross-repository development setup, using temporary
path:dependencies or equivalent local wiring so changes in../fhir_modelsand../fhir_clientare exercised by this repository. - Define the release and dependency update order:
fhir_models, thenfhir_client, thenplan-executor. - Complete: resolve
fhir_modelsandfhir_clientfrom their merged master branches and retain their immutable resolved revisions inGemfile.lock.
- R4 runtime definitions remain under
lib/fhir_models/definitions/infhir_models. - R4 stores separate preprocessed files for StructureDefinitions, ValueSets, expansions, XML schemas, and version metadata.
FHIR::Definitionsreads the individual JSON files directly. R4 XML validation reads the XSD files underlib/fhir_models/definitions/schema/.- The generated R4 Ruby models remain separate under
lib/fhir_models/fhir/. - Preserve this layout and the existing top-level
FHIR::DefinitionsAPI for backward compatibility.
- Generated R4B Ruby models and metadata are stored under
lib/fhir_models/r4b/. - R4B runtime definitions follow the established R4 directory pattern under
lib/fhir_models/definitions/r4b/, with separatestructures/,valuesets/, andschema/directories plusversion.info. FHIR::DefinitionsandFHIR::R4B::Definitionsuse the same configurable, directory-backed provider. R4 remains configured againstlib/fhir_models/definitions/, while R4B is configured againstlib/fhir_models/definitions/r4b/and constructs R4B model objects.- Definition bundles are parsed lazily and cached in memory. The R4B provider
verifies
version.infoagainst FHIR version4.3.0before loading them. - StructureDefinition objects returned by the provider must be
FHIR::R4B::StructureDefinitioninstances. Model binding, reference, and StructureDefinition validation must select definitions from the owning model namespace and must never fall back implicitly from R4B to R4. - The checked-in generated files contain datatype and resource StructureDefinitions, profiles, extensions, search parameters, ValueSets, expansions, and version metadata.
- The shared provider preserves the existing R4 Definitions API for both
versions, including raw
valuesets, rawexpansions, terminology lookup, display lookup, and dynamicget_profile_classbehavior.
- Official HL7
definitions.json.zipandexpansions.jsonfiles are generation inputs. Pin their URLs and SHA-256 checksums, but do not check the downloaded source artifacts into the repository. - Generate and check in the R4B Ruby models and the derived, preprocessed
runtime definition files. Normal use of the
fhir_modelsgem must not require a network connection or local copies of the HL7 source downloads. - Generation must be deterministic. Repeated generation from the pinned inputs must produce byte-identical Ruby models and runtime definition output.
- Keep the generated definition files as text. Git already compresses repository objects, while text files retain useful diffs and delta compression that a generated gzip index would prevent.
lib/FHIR_structure_r4b.jsonis generated from the pinned R4Bdefinitions.json.zipinput and checked intoplan-executor.- Regenerate it with
bundle exec rake "crucible:generate_r4b_structure[path/to/r4b-definitions.json.zip]". The task verifies the pinned source checksum before readingprofiles-resources.jsonfrom the archive. - Resource names and categories come from concrete specialization StructureDefinitions. The existing R4 structure index supplies only the non-resource hierarchy and category template; it is not the source of the R4B resource list.
- The official R4B StructureDefinitions omit category extensions for
ResearchDefinitionandResearchElementDefinition. The generator assigns both explicitly toSpecialized.Evidence-Based Medicine. - The downloaded definitions archive remains an untracked generation input. Repeated generation from the pinned input must produce byte-identical output.
- The generated R4B JSON definition bundles do not contain the R4B XML XSD schema set; the schemas come from the separately pinned official archive.
FHIR::R4B::Xml.validateuses the R4B4.3.0schema set and does not reuse the R44.0.1schema directory.- Generated, preprocessed R4B schemas are checked in under
lib/fhir_models/definitions/r4b/schema/, parallel to R4. Use the existingFHIR::Boot::Preprocess.pre_process_schemaimplementation rather than adding a separate schema generator or runtime schema abstraction. - The original downloaded HL7 schema archive remains a checksum-pinned generation input and is not checked into the repository.
- Introduce one authoritative registry of FHIR versions understood by the harness. This registry may include
:r4b, but it must not imply that every suite supports R4B. - Keep
supported_versionsas the explicit suite compatibility annotation. BaseTest#supported_versionsdefaults to an empty list. Do not add:r4bor any other implicit compatibility to that default.- Add
:r4bexplicitly to each compatible suite; do not infer R4B support from R4 support at runtime. - All executable suites now have explicit annotations. Seven suites that previously relied on the base default explicitly preserve their existing compatibility. All 12 suites that support R4 now also declare R4B explicitly. No suite gains R4B support implicitly.
- Update resource-based suite enumeration so it intersects known versions, the suite's declared
supported_versions, and resources available in that version. It must not overwrite a suite's declared compatibility. - Ensure suite listing and suite execution use the same compatibility decision.
- Keep TestScripts STU3-only unless separate R4B TestScripts and an R4B TestScript parser are deliberately added.
- Refactor model generation so the output directory and Ruby namespace are version-aware instead of being hard-coded to the top-level
FHIRnamespace. - Refactor JSON and XML deserialization, resource detection, validation, metadata, definitions, and schema lookup so they resolve classes and resource lists through the selected model namespace.
- Preserve the current top-level R4 public API while adding generated R4B classes, metadata, parsers, validation, definitions, schemas, and resource lists under
FHIR::R4B. - Ensure embedded resources, contained resources, Bundle entries, complex data types, and generated references remain in the R4B namespace.
- Add model-level tests for generation, parsing, serialization, validation, and namespace purity.
- Add
use_r4band route:r4bresource lookup, parsing, request replay, response validation, transactions, operations, and capability statements throughFHIR::R4B. - Require
fhir_version:when constructing a client. Do not retain R4 as a constructor default. - Permit
fhir_version: :autoonly as an explicit discovery mode. Metadata may establish a concrete version, but resource operations must reject:autountil that has happened. - Make JSON and XML reply parsing select R4B explicitly instead of allowing the existing non-DSTU2/STU3 fallback to use R4.
- Map CapabilityStatement
fhirVersionvalues explicitly:4.0.xto:r4and4.3.xto:r4b. - Do not classify every version beginning with
4as R4. Unknown FHIR 4.x releases must be reported as unsupported rather than silently parsed as R4. - Test both explicit
use_r4bselection and automatic version detection.
- Add
r4bparsing to the rake version resolver and test that omitted and unknown versions fail fast. - Replace scattered version conditionals with a central namespace resolver where practical.
- Add explicit R4B namespace and resource resolution in
BaseTest,BaseSuite, OperationOutcome parsing, capability statement handling, fixture validation, resource category lookup, and resource generation helpers. - Initialize R4B base resources with the active client without affecting R4, STU3, or DSTU2 resources.
- Add
lib/FHIR_structure_r4b.json, generated from the same pinned R4B definitions used by the models. - Extend structure tests to compare R4B structure metadata against
FHIR::R4B::RESOURCES, and fix existing structure-root tests so they make assertions. - Fix version-specific fixture override lookup before adding
*.r4b.xmlor*.r4b.jsonfixtures. - Version-specific fixture overrides are stored beside the base fixture as
<base>.r4b.xmlor<base>.r4b.json. Lookup falls back to the base fixture only when no version-specific file exists. Reuse of a base fixture still requires validation before a suite can declare R4B compatibility. - Update README and shell usage documentation to list
r4b.
- Do not let
r4bfall into top-levelFHIR::PatientorFHIR::BundleR4 classes by default. - Do not treat passing R4 smoke tests as proof of R4B support.
- Do not reuse R4 fixtures for R4B unless validation proves they are compatible.
- Do not enable STU3 TestScripts for R4B unless separate R4B TestScripts are added.
- Watch for model/client dependency gaps where R4B model classes exist but parsing, capability statements, or client version activation do not.
- Do not let metadata listing advertise R4B support that execution would reject, or vice versa.
- Do not treat a normative resource as automatically compatible at the suite level; test semantics, search parameters, fixtures, and assertions still require an explicit audit.
- Do not allow generated R4B resources to contain top-level R4 complex types or contained resources.
- Do not publish the harness against a client or model dependency that is only available through an unrecorded local checkout.
- R4B JSON and XML examples parse into
FHIR::R4B::*and round-trip successfully. - Bundle entries and contained resources remain entirely within
FHIR::R4B. - R4B resource generation produces valid resources without top-level R4 model instances.
- At least one R4B-only field or changed structure is accepted by R4B validation and rejected by R4 validation, proving that R4B is not an alias.
- R4 behavior and its existing top-level namespace remain unchanged.
- Explicit
use_r4,use_r4b,use_stu3, anduse_dstu2select the expected model namespace. - CapabilityStatement detection distinguishes FHIR
4.0.xfrom4.3.xand rejects unsupported versions. - Read, search, create/update, Bundle, OperationOutcome, transaction, and format handling parse responses through the selected namespace.
bundle exec rake crucible:list_all[r4b]lists only suites explicitly annotated for R4B.- Resource-based suites instantiate R4B classes, not R4 classes, and only enumerate resources present in
FHIR::R4B::RESOURCES. - Listing and executing suites apply identical version eligibility rules.
- An omitted or unknown CLI version exits with a clear error. R4 must be
selected explicitly with
r4. FHIR_structure_r4b.jsonpasses resource-list consistency and duplicate-name checks.- Version-specific fixture override selection has focused unit coverage.
FormatTestpasses all 22 cases against a Spark endpoint whose CapabilityStatement reports FHIR4.3.0and bothxmlandjson. The audit usedsparkfhir/spark:r4b-latestimagesha256:720309c969f8562f418948197b794cc01cc07e5be2d7a82873562a8714719e82andsparkfhir/mongo:r4b-latestimagesha256:10a44ee9fa2c6a42325656b1758b3fb14be00dfe84a6d999e1b9b3d695fc29d5. This covers Patient read, search Bundle, JSON, XML, and format negotiation.- Existing R4, STU3, and DSTU2 tests remain unchanged in behavior and pass their regression matrix.
-
This was a diagnostic run against the local Spark R4B endpoint at
http://localhost:18080/fhir. It used the same Spark and Mongo image digests recorded for the FormatTest audit above. -
The run used temporary
path:dependencies for the local../fhir_models,../fhir_client,../fhir_stu3_models, and../fhir_dstu2_modelsrepositories so the unpublished R4B model and client changes were loaded. -
Only suites whose existing
supported_versionsdeclaration contained:r4were temporarily given:r4b. STU3-only, DSTU2-only, TestScript, and explicitly unsupported suites were not enabled. These temporary annotations were made in an isolated copy. The later 2026-07-23 verification below records the permanent annotations after strict version routing was added. -
The normal suite registry exposed 12 eligible suites. Eligibility was checked with:
bundle exec rake "crucible:list_suites[r4b]"
-
Each suite was then run separately through the documented Rake entry point:
bundle exec rake "crucible:execute[http://localhost:18080/fhir,r4b,SUITE_NAME,,stdout]"
The empty resource argument caused
ResourceTestandSearchTestto exercise every R4B resource rather than a single named resource. Suites were run sequentially because they create, update, and delete shared endpoint data. -
The test process must be allowed to connect to the local endpoint. A sandboxed attempt produced
Operation not permittedTCP errors and invalid all-skip or all-error results; those results were discarded. The Rake task also expects the locallogs/directory to exist.
| Suite | Pass | Fail | Error | TODO skip | Exit |
|---|---|---|---|---|---|
SprinklerSearchTest |
36 | 0 | 0 | 2 | 0 |
ConsentSearchByPatientReferenceTest |
1 | 0 | 0 | 0 | 0 |
ElementsSearchParameterTest |
1 | 0 | 0 | 1 | 0 |
UnknownSearchParameterTest |
12 | 0 | 0 | 0 | 0 |
ReadTest |
5 | 0 | 0 | 0 | 0 |
ResourceTest |
2075 | 10 | 0 | 417 | 1 |
FhirPathPatchTest |
4 | 0 | 0 | 2 | 0 |
FormatTest |
22 | 0 | 0 | 0 | 0 |
TransactionAndBatchTest |
2 | 6 | 0 | 5 | 1 |
SearchTest |
973 | 0 | 0 | 0 | 0 |
HistoryTest |
10 | 0 | 0 | 0 | 0 |
RobustSearchTest |
0 | 0 | 0 | 1 | 0 |
| Total | 3141 | 16 | 0 | 428 | 2 suites failed |
All 428 skips were existing TODO skips. They do not cause the Rake task to
exit non-zero. The 16 failures are concentrated in the two suites shown above;
they are not 16 independent compatibility defects.
TransactionAndBatchTestfails first inXFER0. The generated transaction serializesCondition.verificationStatusas the primitive string"confirmed", while R4B requires aCodeableConcept.- Spark returns HTTP 400 with an OperationOutcome reporting that it encountered
a JSON primitive where a non-primitive
verificationStatusobject was required. Five later transaction assertions then fail because they depend onXFER0having created the patient record. ResourceGenerator.fix_conditioncurrently converts R4 status strings only whenresource.is_a?(FHIR::Condition). AFHIR::R4B::Conditiondoes not satisfy that check, so the existing R4 compatibility correction is skipped.- The correction must become namespace-aware and cover both
clinicalStatusandverificationStatuswithout making R4B inherit from or fall back to the R4 model class. Add focused serialization coverage before rerunningTransactionAndBatchTest.
-
ResourceTestdeterministically generates invalid deeply nestedPackagedProductDefinitionresources. At the generator recursion boundary,package.package[].package[].containedItem[].itemis omitted even though its minimum cardinality is one. -
Spark rejects these resources with HTTP 400. The initial create failures then cause conditional create, conditional update, and history assertions to fail or operate on incomplete setup state.
-
A targeted documented run reproduces the problem:
bundle exec rake "crucible:execute[http://localhost:18080/fhir,r4b,ResourceTest,PackagedProductDefinition,stdout]"
-
Fixing this requires a finite minimal representation for the recursive package structure. The recursion guard must still prevent infinite trees, but it cannot terminate by omitting a required child. Add a generator test that validates the generated JSON or XML against the R4B model/schema.
-
The generated R4B metadata for
Questionnaire.item.typeincludes the abstract codequestioninvalid_codes.ResourceGeneratorsamples from that list and may emittype: "question"in one or more nested items. -
Spark rejects that value because it is not a selectable
QuestionnaireItemType. The exact number of failed ResourceTest assertions varies with random generation; a targeted rerun reproduced failures in create and update operations. -
Reproduce with:
bundle exec rake "crucible:execute[http://localhost:18080/fhir,r4b,ResourceTest,Questionnaire,stdout]"
-
Preserve the complete terminology definitions needed at runtime, but prevent abstract or non-selectable codes from being chosen for generated resource instances. Add deterministic coverage proving that generated Questionnaire items use only concrete item types.
- Add focused failing tests for R4B Condition status conversion, PackagedProductDefinition recursion, and Questionnaire item-type selection.
- Make the resource generator namespace-aware where it currently dispatches
only on top-level R4 classes. Review the rest of
apply_invariants!for the same pattern. - Fix and rerun the three targeted commands above, including
TransactionAndBatchTestthroughcrucible:execute. - Repeat the complete 12-suite R4B endpoint run and retain per-suite output and shell exit status.
- Run the existing R4 unit and endpoint regression suites to detect shared generator regressions.
The following existing endpoint results were provided on 2026-07-17. They were not rerun as part of the R4B audit, but should be retained as the comparison baseline for later cross-version regression runs.
| Version | Pass | Fail | Error | Skip |
|---|---|---|---|---|
| STU3 | 2876 | 0 | 0 | 413 |
| R4 | 3267 | 0 | 0 | 443 |
Future runs should compare both the totals and the individual skipped tests. The totals alone do not establish whether a changed skip is expected.
- The Docker image was built with the repository
Dockerfileand a disposable build context containing the current localfhir_client,fhir_models,fhir_stu3_models, andfhir_dstu2_modelsworking trees aspath:dependencies. The resulting image wasincendi/plan_executor:strict-r4b, image IDsha256:b5ae435552fd1305d072c021d1b140db1461daa2b23d2cd1183855ec96bfa975. - The plan-executor unit suite passed
1218tests and3680assertions with no failures or errors inside that image. - Focused
fhir_clientcoverage for required versions,:auto, R4B routing, and external references passed79tests and186assertions with no failures or errors. - The complete modified
fhir_clientsuite reported114tests,269assertions, and the same five errors reproduced by the committed baseline in the identical container. Four are caused by invalid JSON escapes in the existingfhir_api_validation.json; one is existing shared model-client state intest_class_partial_update. The strict-versioning change introduced no additional full-suite failures. - The CI-style Compose run used
sparkfhir/spark:r4b-latestimage IDsha256:d5139dcba0a3e17aac71b36d31271326111248ad4af1bc16b095d423f2b7d2d8andsparkfhir/mongo:r4b-latestimage IDsha256:9c8e741da8cbce3b5e10e845717c368f41a2e27311912541ed2192110d4d7741. The initial./execute_all.sh http://spark:8080/fhir r4b html|json|stdoutrun included onlyFormatTestand passed all22cases. The expanded run is recorded below.
-
Every Ruby suite that declares R4 support now also explicitly declares R4B support.
crucible:list_suites[r4b]lists 12 suites:ReadTest,ResourceTest,FhirPathPatchTest,FormatTest,TransactionAndBatchTest,SearchTest,HistoryTest,RobustSearchTest,SprinklerSearchTest,ConsentSearchByPatientReferenceTest,ElementsSearchParameterTest, andUnknownSearchParameterTest. -
FhirPathPatchTestnow obtainsMedicationRequestthrough its selected version namespace instead of using the top-level R4 model class. An audit of the other 11 suites found no unversioned resource-model constants. -
A unit invariant requires the set of R4 suites and the set of R4B suites to remain identical. The Docker unit run passed
1218tests and3680assertions with no failures or errors. -
The CI-style endpoint command was:
docker compose run --rm --no-deps plan_executor \ ./execute_all.sh http://spark:8080/fhir r4b 'html|json|stdout' -
The disposable plan-executor image was
incendi/plan_executor:all-r4b, image IDsha256:7891bc0c6347a99b54d5b5382b9081d7c8b422aee6bd3d85ca93e73c4cdd3221. The Spark and Mongo image IDs weresha256:d5139dcba0a3e17aac71b36d31271326111248ad4af1bc16b095d423f2b7d2d8andsha256:9c8e741da8cbce3b5e10e845717c368f41a2e27311912541ed2192110d4d7741. -
The endpoint run completed 3,585 tests in 234 seconds:
Pass Fail Error TODO skip 3149 8 0 428 -
All eight failures in this run were in
ResourceTest_PackagedProductDefinition. Three create or update requests were rejected because generated nested package entries omitted requiredcontainedItem.item; five conditional and history assertions then failed because those resources were not created. -
All 428 skips remain existing
TODOskips. FHIR TestScript artifacts remain explicitly STU3-only and were not part of this R4B run.
- The root cause was a recursion-boundary
CodeableReferenceobject with neitherconceptnorreference. Although the required object existed in memory, it serialized as an empty object and the effectivecontainedItem.itemelement was omitted. ResourceGeneratornow gives an otherwise empty generatedCodeableReferencea text-onlyCodeableConceptfrom the selected FHIR namespace. Existing concept or reference values are preserved. This is a datatype invariant rather than a PackagedProductDefinition-specific traversal.- Focused unit coverage checks empty and populated R4B CodeableReference
behavior, every recursively generated contained item, and R4B XML schema
validation. The Docker unit suite passed
1221tests and3688assertions with no failures or errors. - A fresh focused endpoint run of
ResourceTest_PackagedProductDefinitioncompleted with15passes, no failures or errors, and the existing3TODO skips. - A subsequent fresh 12-suite run confirmed the same PackagedProductDefinition
result. The aggregate result was
3151passes,6failures, no errors, and428TODO skips. All six failures were the separately documented nondeterministic Questionnairetype: questiondefect; none belonged to PackagedProductDefinition. - Verification used
incendi/plan_executor:packaged-product-fix, image IDsha256:b8a9ee41b11496a99e38a6dc93ba061d720075477c31d9ea5deafcf6f5900c62, with the same R4B Spark and Mongo image IDs recorded above.
- Generated model metadata continues to contain the complete required
QuestionnaireItemTypecode set, including the abstractquestiongrouping code. The terminology artifacts and generated models were not rewritten. ResourceGeneratornow derives a cached selectable-code set from the namespace's original ValueSet expansion. Entries markedabstractorinactiveare excluded from generated instances, while concrete descendants of abstract grouping entries remain selectable.- The same filtering is used for primitive
code,Coding, andCodeableConceptgeneration. If a binding has no matching expansion or filtering would remove every generated code, the existing generated metadata remains the fallback. - Focused tests prove that the complete R4B Questionnaire metadata still
includes
question, the selectable set excludes it, and every recursively generated Questionnaire item uses a selectable type. The Docker unit suite passed1224tests and3694assertions with no failures or errors. - Three initial consecutive
ResourceTest_Questionnaireendpoint runs each completed with15passes and the existing3TODO skips. After correcting the cache scope to cache expansion data rather than field-specific intersections, the final image produced the same focused result and no generated Questionnaire payload containedtype: question. - A final fresh 12-suite R4B run completed in 236 seconds with
3157passes, no failures or errors, and428existing TODO skips. The command exited successfully, and PackagedProductDefinition remained clean in the same run. - Verification used
incendi/plan_executor:questionnaire-fix, image IDsha256:f6dda44f11bcf8eafac55695d4e9f066f377473b3310963e2b3d94fa83ca7680, with the same R4B Spark and Mongo image IDs recorded above.
- The final Questionnaire implementation was run against the fresh
sparkfhir/spark:r4-latestandsparkfhir/mongo:r4-latestimages, with image IDssha256:411d6ea0d92c8001359eec3d749c643a28b207f3ac6f0f3362f1d39081348bf7andsha256:cf64b34e58f6f88f5350cef5066456f69585e4ec4716bcdb56579e3153950e4c. The plan-executor image was the same final image recorded above. - The R4 Spark image contains a local Kestrel HTTPS endpoint configuration but
no server certificate. Its first startup therefore entered a restart loop,
and that infrastructure-only run was discarded. The clean retry used the
disposable environment override
Kestrel__Endpoints__Https__Url=http://+:8080; neither the image nor repository configuration was changed. - The fresh full R4 run completed in 145 seconds with
3267passes, no failures or errors, and443TODO skips. The command exited successfully and exactly matched the recorded R4 aggregate baseline. ResourceTest_Questionnairecompleted with15passes, no failures or errors, and the existing3TODO skips. No generated Questionnaire payload containedtype: question.
fhir_modelsresolves fromhttps://github.com/incendilabs/fhir_models.gitmaster revisiona143d2e21d0253b33fdaeb17e2d152ad656c9a3e.fhir_clientresolves fromhttps://github.com/incendilabs/fhir_client.gitmaster revision79026641f9b2ac7cf30bc27a3528e505d34c67e8.- A repository Docker build using only the merged Git dependencies produced
incendi/plan_executor:master-r4b-deps, image IDsha256:927c11680443ee857d039ec71eea63cfa8b6c28da5a96d494a1c5b9c9f974345. The image loadedfhir_client5.0.0,fhir_models4.1.0, andFHIR::R4B::Patient. - The Docker unit suite passed
1224tests and3694assertions with no failures or errors.
- Run the 71 FHIR TestScript artifacts against a STU3 endpoint as a separate regression exercise. They remain explicitly STU3-only and are not part of either the R4 or R4B suite runs.
- The dedicated
crucible:execute_all_testscriptsandcrucible:testreporttasks now require a FHIR version and construct the client with that version. They still bypass the normal suitesupported_versionsfilter, so the deferred regression must invoke them withstu3explicitly and verify the endpoint version. - The eventual regression command must explicitly select
:stu3, retain per-TestScript output and shell exit status, and use a CapabilityStatement to confirm that the target endpoint reports STU3 before execution.
- Complete: reconcile the
fhir_modelsbaseline and dependency strategy. - Complete: refactor
fhir_modelsgeneration and runtime for explicitFHIR::R4Bsupport. - Complete: generate and validate the R4B model set.
- Complete: add R4B routing, parsing, capability handling, and detection to
fhir_client. - Complete: add the central version registry and fail-fast version resolution to
plan-executor. - Complete: all 12 R4-capable Ruby suites explicitly declare R4B support and have been run against the R4B endpoint.
- In progress: complete the STU3 and DSTU2 endpoint regression matrix. Merged dependency resolution and fresh R4 and R4B endpoint runs are complete.
- Complete: remove implicit R4 defaults from
fhir_clientandplan-executor, make generator namespaces explicit, verify the breaking change in Docker, and commit it atomically.