v0.17.0
This release makes the import step safer and the flattening step quieter. local_import now scans only the top level of a source directory, so you can point it straight at a TORCH output directory without a false duplicate error; set services.local_import.recursive: true to keep the old behavior. A CRTDL with two attributeGroups that write to one CSV file is now rejected before the first write, instead of losing rows and failing late with a confusing rename error. The report about columns with no data is removed, because an empty cell is normal for an optional FHIR element. CI enforces DCO sign-off on every pull request, and the repository has agent instructions in AGENTS.md.
What's Changed
Breaking Changes
fix(services): scan a local import directory non-recursively by default —local_importcopies every file it finds into one flat destination directory keyed by basename, so a recursive scan is safe only if all basenames are unique. A TORCH output directory broke this: the internal working directories (batches/,core_batches/,reports/) hold files with the same basenames as the real result bundles, which caused a false duplicate error. The scan is now non-recursive. To scan subdirectories, setservices.local_import.recursive: true. The message "no FHIR NDJSON files found" names the flag, and the duplicate error lists the full path of every colliding file. (closes #683) #684fix: reject CRTDL attributeGroups that write to one CSV file — two attributeGroups with one name wrote to one CSV file. The second group truncated the file of the first group, rows were lost, and the rename of the.partialfile failed with "no such file or directory".ValidateCRTDLnow stops the run before any CSV write and names the two attributeGroups that collide. A CRTDL with a duplicate attributeGroup name that ran before now fails validation. (closes #701) #702
Bug Fixes
fix(flattening): remove the report about columns with no data — the step wrote a warning for each batch, and one row without the column was sufficient to cause it, so a large job made many false warnings. Pull request #704 first reduced the report to one debug message for each job, behind--verbose. Pull request #706 removes the report: an empty cell is normal, because FHIR elements are optional, and a ViewDefinition that finds no data is a problem of the ViewDefinition, not of the transfer. (closes #703, #705) #704 #706
Internal & CI
ci: enforce DCO sign-off on pull requests with a workflow job. (closes #688) #690docs: add agent instructions inAGENTS.md. (closes #614) #687
Dependency Updates
- Go modules:
aws-sdk-go-v2monorepo #682;aws-sdk-go-v2/service/s3v1.107.0#694;klauspost/compressv1.19.2#691 - Docker images:
fhir-flattenerv0.1.0-alpha.8#685 andv0.1.0-alpha.9#693;miracum/fhir-pseudonymizerv2.32.0#695;chrislusf/seaweedfsv4.41#692;nginx-unprivileged:1.31-alpine#700;postgres:18.4#689 - GitHub Actions:
actions/attest-build-provenance#686;step-security/harden-runnerv2.20.1#681;github/codeql-action#679 - Tools and docs:
fhir-ontology-generatorv4.3.0#696;errata-ai/valev3.17.1#680;vitev8.2.1#698;vuev3.5.41#697; lock file maintenance #699