|
| 1 | +# v1.0.0 — what's stable |
| 2 | + |
| 3 | +This is the hand-curated v1.0.0 summary. The auto-generated commit log |
| 4 | +lives in `CHANGELOG.md`; this file is the narrative version. |
| 5 | + |
| 6 | +## What v1 is |
| 7 | + |
| 8 | +v1.0.0 is a **stability commitment**, not a feature ship. Every public |
| 9 | +export listed in `.surface-snapshot.json` is now governed by semantic |
| 10 | +versioning: minor releases add to this surface, patch releases fix |
| 11 | +bugs in it, major releases (v2+) are the only place breaking changes |
| 12 | +land. The export-surface CI gate makes accidental breakage detectable |
| 13 | +in PRs before they merge. |
| 14 | + |
| 15 | +The 0.x line shipped 56 minors over 8 weeks; the goal of v1 is to draw |
| 16 | +a line under that velocity and trade some of it for predictability. |
| 17 | + |
| 18 | +## Surface highlights at v1.0.0 |
| 19 | + |
| 20 | +``` |
| 21 | +@fhir-dsl/types R4 + R4B + R5 + R6 generated types, search params, |
| 22 | + ConceptMap-aware Reference<T> narrowing |
| 23 | +@fhir-dsl/core query builder, batch/transaction, conditional |
| 24 | + ops, retries, AbortSignal, JSON-Patch + xml-patch |
| 25 | + + fhirpath-patch, capability guard, Bundle |
| 26 | + reference resolution, _include/_revinclude |
| 27 | +@fhir-dsl/fhirpath ~85% of FHIRPath N1 spec (60+ functions), |
| 28 | + compiled invariants → OperationOutcome, |
| 29 | + setValue / createPatch (RFC 6902) |
| 30 | +@fhir-dsl/runtime executor with retries, async-polling, layered |
| 31 | + Foundation/Base/Clinical/Financial/Specialized |
| 32 | + access patterns |
| 33 | +@fhir-dsl/smart SMART on FHIR v2 — PKCE-S256, backend services, |
| 34 | + scope DSL, refresh-token rotation |
| 35 | +@fhir-dsl/terminology $expand, $validate-code, $lookup, $translate |
| 36 | + with caching |
| 37 | +@fhir-dsl/mcp MCP server scaffold with stdio + Streamable HTTP |
| 38 | + transports, batched JSON-RPC, audit sinks, |
| 39 | + write gating, response-byte cap, all four |
| 40 | + SMART auth strategies |
| 41 | +@fhir-dsl/generator StructureDefinition → TS, native + zod |
| 42 | + validators, per-property invariants, |
| 43 | + slicing-aware narrowing |
| 44 | +@fhir-dsl/cli fhir-gen generate / mcp commands |
| 45 | +@fhir-dsl/utils OperationOutcome helpers, retry helpers, |
| 46 | + Standard Schema bridges |
| 47 | +``` |
| 48 | + |
| 49 | +## Highlights by theme since v0.30.0 (the Phase 5 baseline) |
| 50 | + |
| 51 | +### Streamable HTTP MCP transport |
| 52 | +v0.51.0 finished the Streamable HTTP spec end-to-end: POST → JSON, |
| 53 | +POST → SSE, GET → server-initiated SSE stream, batched JSON-RPC arrays. |
| 54 | +The framing is now observable for clients; later releases can rely on |
| 55 | +it. |
| 56 | + |
| 57 | +### Per-property invariants |
| 58 | +v0.52.0 wired `ElementDefinition.constraint[*]` at any nesting level |
| 59 | +into `s.refine()` (native) / `.superRefine()` (zod) wrappers. |
| 60 | +Previously only root + backbone constraints flowed; now deep nested |
| 61 | +constraints do too. Generator filters out the trivial inherited `ele-1` |
| 62 | +to avoid bloat. |
| 63 | + |
| 64 | +### FHIRPath setValue / createPatch (#50) |
| 65 | +v0.53.0 added typed write-back through any FHIRPath builder leaf. |
| 66 | +`setValue` returns a deep-cloned resource with the path updated; |
| 67 | +`createPatch` returns the equivalent RFC 6902 patch document. The |
| 68 | +where()-shaped predicates are inverted into partial templates so the |
| 69 | +setter can create missing intermediate objects (e.g. seeding |
| 70 | +`name[]` with `{ use: "official" }` when the array is missing). |
| 71 | + |
| 72 | +### Coverage gaps documented |
| 73 | +v0.54.0 made the boundaries explicit: UCUM (issue #51) and the |
| 74 | +unimplemented FHIRPath functions (issue #52) are scope-frozen for v1 |
| 75 | +with positive pin tests so they break loudly when implementations land. |
| 76 | + |
| 77 | +### Surface freeze |
| 78 | +v0.55.0 confirmed via export-surface diff against v0.30.0 that no |
| 79 | +public exports were removed or renamed across the entire 0.5x line — |
| 80 | +the surface has been additive-only. No `@deprecated` aliases needed. |
| 81 | + |
| 82 | +### Performance baseline |
| 83 | +v0.56.0 captured `audit/perf-baseline.md`: generator end-to-end at |
| 84 | +221 ms, 1000-resource Bundle validation at 1.7 ms, FHIRPath 10k iters |
| 85 | +at 5.8 ms — all 50× or more under the originally targeted budgets. |
| 86 | + |
| 87 | +## Known limitations carried into v1 |
| 88 | + |
| 89 | +- **UCUM-aware quantity ops are not implemented.** Raw unit-string |
| 90 | + equality only. Normalise units upstream of FHIRPath, or use the |
| 91 | + pin in `packages/fhirpath/test/spec-gaps.test.ts` as a probe. |
| 92 | + Native UCUM is tracked as #51. |
| 93 | +- **A few FHIRPath spec functions throw at evaluate time.** |
| 94 | + `resolve()`, `extension(url)` (full StructureDefinition form), |
| 95 | + `descendants()`, `repeat()`, and the terminology-bound functions |
| 96 | + (`conformsTo`, `memberOf`, `subsumes`, `subsumedBy`). They compile |
| 97 | + to a valid expression string and round-trip through external |
| 98 | + evaluators. Tracked as #52. |
| 99 | + |
| 100 | +## Out for v1, in for v2 |
| 101 | + |
| 102 | +Documented up front so they don't bleed scope: |
| 103 | + |
| 104 | +- React adapter (`@fhir-dsl/react`) — needs the query-builder API to |
| 105 | + be frozen first, which is what v1 is for. |
| 106 | +- Server adapter packages (HAPI / Azure Health Data Services / Google |
| 107 | + Cloud Healthcare) — same reason. |
| 108 | +- Generator watch mode and incremental generation — convenient, not |
| 109 | + a stability blocker. |
| 110 | +- Middleware / interceptor pipeline on the runtime executor — adding |
| 111 | + it to the request flow is a v2 design pass. |
| 112 | +- Native UCUM evaluator (#51). |
| 113 | +- The remaining FHIRPath spec functions (#52). |
0 commit comments