Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
221 commits
Select commit Hold shift + click to select a range
9b086e6
Validate Exchange Graphs From One Parsed Document
lukaskollmer Oct 3, 2026
4620a5b
Pin the HealthKit Exchange Graphs as Golden Fixtures
lukaskollmer Oct 3, 2026
e9dc69b
Add the Exchange Producer, Event Sequencer and Public Graph Bytes
lukaskollmer Oct 3, 2026
a5e85cb
Add the HealthKit FHIR Exporter
lukaskollmer Oct 3, 2026
12b0345
Keep Refusals Typed and Retractions Keyed Like Additions
lukaskollmer Oct 3, 2026
00c8624
Assemble Every HealthKit Graph Through One Shared Assembler
lukaskollmer Oct 3, 2026
2569b5c
Apply the Guide's Envelope Rules and Export Workouts
lukaskollmer Oct 3, 2026
ffec7fb
Key the Exchange Ledger and Freeze What Each Event States
lukaskollmer Oct 3, 2026
081ea4e
Build Every Envelope From Frozen Facts and Prepare Facts Once
lukaskollmer Oct 3, 2026
4638c35
Remove Dead Ledger State and Duplicated Checks
lukaskollmer Oct 3, 2026
8bda407
Validate Stored Instants and Refuse Instants FHIR Cannot State
lukaskollmer Oct 3, 2026
b53930c
Keep a Reservation That a Concurrent Reserve Is About to Reuse
lukaskollmer Oct 3, 2026
c8431f9
Correct the Ledger, Receipt and Recipe Docs
lukaskollmer Oct 3, 2026
b17f10d
Close the Ledger Review's Surviving Mutations With Discriminating Tests
lukaskollmer Oct 3, 2026
a694062
Test the Identity Scope's Ledger Fingerprint in the Contract Suite
lukaskollmer Oct 4, 2026
48d356c
Test the Producer's Refusal of Facts the Ledger Cannot Read Back
lukaskollmer Oct 4, 2026
dfb4dac
Note the Reservations a Reserve Will Hold Inside Its Transaction
lukaskollmer Oct 4, 2026
35f6894
State the One-at-a-Time Premise in the Ledger's Storage Contract
lukaskollmer Oct 4, 2026
77e8b20
Pin the Per-Call Note Dedup and Clarify the Storage Retry Wording
lukaskollmer Oct 4, 2026
55b9fc5
State a Sample's Writer Only When the Caller Classifies Its Source
lukaskollmer Oct 4, 2026
7af0c59
Tell Same-Size Application Sets Apart and Pin the Context Fingerprint
lukaskollmer Oct 4, 2026
8e348a7
Pin the Writer Record Under Every Writer Policy and State the Writer'…
lukaskollmer Oct 4, 2026
28f9311
Name the Provenance Author From the Writer Snapshot Directly
lukaskollmer Oct 4, 2026
e2e5397
Compare Graph Tokens Scalar by Scalar and Keep Every U+FEFF
lukaskollmer Oct 4, 2026
e870374
Fail Golden Regeneration Runs and Pin Every Case's Companions and Ide…
lukaskollmer Oct 4, 2026
9b2e2d5
Pin the Exporter's Own Graphs in Goldens Under Default and Deployment…
lukaskollmer Oct 4, 2026
1c2f2a7
Close the Audit's Surviving Content Mutations and Read Entry Method Once
lukaskollmer Oct 4, 2026
3511df7
Add the Envelope Fixes' Spec Tests and Validate Their Shapes in the H…
lukaskollmer Oct 4, 2026
727f062
Report the Kit's Diagnostics for Data Origins and Doubly Claimed Prov…
lukaskollmer Oct 4, 2026
3ca2a3d
Refuse Graph Bytes Carrying Members the FHIR Model Does Not Keep
lukaskollmer Oct 4, 2026
bc3e159
Pin the Refusal Order and Sync-Pair Refusals Through the Converter It…
lukaskollmer Oct 4, 2026
514b625
Remove Dead Assembly Code and Refuse an Empty Output List Before Inde…
lukaskollmer Oct 4, 2026
d310a32
Carry a Gateway Application Only Beside an Observation in the Sensor …
lukaskollmer Oct 4, 2026
2a9f5ef
Correct the Docs the Rework Left Stale and Pin the ECG Retraction Gap
lukaskollmer Oct 4, 2026
fa894bb
Check Every Golden's Reported Source and Source Artifact Against Its …
lukaskollmer Oct 4, 2026
f047233
Pin the Retraction Instants No FHIR DateTime Can State
lukaskollmer Oct 4, 2026
57c4f53
Pin the Exporter's UDI Option, Sub-Second Periods and Each Offset Omi…
lukaskollmer Oct 4, 2026
c00b3fe
Pin the Kit's Diagnostics for a Doubly Typed Data Origin and a Leadin…
lukaskollmer Oct 4, 2026
9f77982
Pin an Apple Per-Device Source Without a Unit Token in Bytes
lukaskollmer Oct 4, 2026
726a2b7
Discard the Receipt Stream in the Bulk Export Example
lukaskollmer Oct 4, 2026
99be924
Hand a Release Racing a Reuse Over to the Call That Still Holds It
lukaskollmer Oct 4, 2026
9ec5852
Forget Only What a Retraction Receipt's Own Ledger Generation Reserved
lukaskollmer Oct 4, 2026
d3d6a1b
Keep One Fingerprint per Event Key and Call So Exact Retries Stay Exact
lukaskollmer Oct 4, 2026
76e4f37
Replace the One-Case Writer Draft Enum With a Struct
lukaskollmer Oct 4, 2026
9f5e122
Key ECG Symptom Requests by UUID Throughout the Assembly
lukaskollmer Oct 4, 2026
c16211e
Fingerprint Companion Data and the Policies' Answers per Record
lukaskollmer Oct 4, 2026
bf11c55
Refuse Graph Bytes Stating Values the FHIR Model Rewrites
lukaskollmer Oct 4, 2026
22dafd5
State That a Policy Closure Is Consulted per Input and Pin Its Refusals
lukaskollmer Oct 4, 2026
48911aa
Pin a Release Handed Over to a Reserve the Storage Discards
lukaskollmer Oct 4, 2026
0b662b4
Add the Effective-Time and Quantity Kernels for the HealthKit Content…
lukaskollmer Oct 3, 2026
993efcc
State HealthKit Effective Times in the Proleptic Gregorian Calendar
lukaskollmer Oct 3, 2026
ddee04a
Freeze the HealthKit Content Oracle Before the Rewrite
lukaskollmer Oct 3, 2026
c177ac0
Keep HealthKit's Private Storage in the Fixtures and Guard the Conten…
lukaskollmer Oct 3, 2026
7e164bb
Widen the HealthKit Content Corpus to What the M0 Checks Found
lukaskollmer Oct 3, 2026
8241cc2
Generate the Measurement Category, ECG Claim and BMI Contract From th…
lukaskollmer Oct 3, 2026
f2ba73c
Type the Generated ECG Claim Against the HealthKit SDK
lukaskollmer Oct 3, 2026
d4bffec
Refuse Adapter Claims the Contract Generator Does Not Read
lukaskollmer Oct 3, 2026
f4501b8
Drop the Body-Mass-Index Guard the Generator Made Unreachable
lukaskollmer Oct 3, 2026
9f4b257
Compile the HealthKit Content Rules Into Plans Once Per Process
lukaskollmer Oct 4, 2026
7251234
Prove the Compiled Content Plans Equal Today's Tables and Builders
lukaskollmer Oct 4, 2026
9b7f837
Generate the Guide's Code Displays and the ECG Waveform Code
lukaskollmer Oct 4, 2026
78da02f
Make the Compiled Workout and Blood-Pressure Content State What They …
lukaskollmer Oct 4, 2026
3397daf
Derive Quantity Rules From Their Rows and Box Each Plan's Route
lukaskollmer Oct 4, 2026
53db682
Check Every Hand-Written Code Against Its Contract and Pin the Defect…
lukaskollmer Oct 4, 2026
4c1afce
Build Observations, Workouts and States of Mind From Their Compiled P…
lukaskollmer Oct 4, 2026
31f16a9
Build the ECG Waveform and Average Heart Rate From the Generated Claim
lukaskollmer Oct 4, 2026
3398f4a
Carry Recording and Clinical Documents Through Their Plans
lukaskollmer Oct 4, 2026
c686357
Project Observations Back Through the Content Plans
lukaskollmer Oct 4, 2026
c838549
Prove the Plans' Builders Build Exactly What Today's Builders Build
lukaskollmer Oct 4, 2026
9eec1cf
Keep Real Compile Defects Out of the Compiler Tests
lukaskollmer Oct 4, 2026
fb35c65
Look Up Each Workout Statistic Source Once and Drop the Segment Promise
lukaskollmer Oct 4, 2026
16f93bf
Read ECG Voltages in the Claim's Compiled Unit and State the Real Che…
lukaskollmer Oct 4, 2026
19c91e8
Keep a Quantity Plan's Unit Binding in Its Value Rule Alone
lukaskollmer Oct 4, 2026
161f171
Compare the Shipped Reverse Quantity-Type Map With Today's
lukaskollmer Oct 4, 2026
94806fe
Pin Fractional Readings, Zero Route Readings and Check Orders in the …
lukaskollmer Oct 4, 2026
4cde515
Draw Every Value Rule Alike, Count Only Real Faults and Require Each …
lukaskollmer Oct 4, 2026
f9fffa3
Count O4 Comparisons Over the Records Each Platform Rebuilds
lukaskollmer Oct 4, 2026
134eb99
Convert Each ECG Symptom Before the ECG's Outputs in O4
lukaskollmer Oct 4, 2026
efc4923
Check Whole Effective-Time Lexemes and Exact ECG Seconds in the Sweeps
lukaskollmer Oct 4, 2026
3e134a5
Validate the Sensor Catalog's Version With Every Other Catalog
lukaskollmer Oct 4, 2026
6309218
Simplify State of Mind Components, Measurement Lookup and Corpus Order
lukaskollmer Oct 4, 2026
0ba128d
Restate the Content Corpus's Foreign-Writer Vectors Under the Omit De…
lukaskollmer Oct 4, 2026
cbed531
Build the ECG Goldens From a Stored Reading Through the Record Entry …
lukaskollmer Oct 4, 2026
cc89aba
Convert Every HealthKit Record Through Its Content Plan
lukaskollmer Oct 4, 2026
0de6f8d
Measure the Plans' Content in the Throughput Benchmark
lukaskollmer Oct 4, 2026
8f38a6f
Publish the HealthKit Catalog, Unit Bindings and Reverse Projection F…
lukaskollmer Oct 4, 2026
6fcb347
Compare the Plans' Reverse Projection With Today's Composition in O4
lukaskollmer Oct 4, 2026
bb41299
Pin Content Before Source Facts and the Reverse Projection's Order in…
lukaskollmer Oct 4, 2026
25df432
Pin Event Key Parts, Unregistered Samples and Duplicate ECG Events
lukaskollmer Oct 4, 2026
631a3f9
Retire the Old-Versus-New Content Oracles
lukaskollmer Oct 4, 2026
fec730e
Write Recording Payloads Once for Documents and Fingerprints
lukaskollmer Oct 4, 2026
5865a4e
Test the HealthKit Content Through the Plans, Builders and Kernels
lukaskollmer Oct 4, 2026
29d68c0
Delete the Old HealthKit Content Code
lukaskollmer Oct 4, 2026
c1e392d
Pin the ECG Symptom Checks' Order, Invalid Route Accuracy and Fractio…
lukaskollmer Oct 4, 2026
528d16a
Test the Deprecated Entry Points' Context Checks Through the Entry Po…
lukaskollmer Oct 4, 2026
453f444
Pin the Guide's Body-Mass-Index Profiles and an ECG Voltage Count Pas…
lukaskollmer Oct 4, 2026
f1d8356
Write Recording Payloads in the Format Their Plan States
lukaskollmer Oct 4, 2026
ae381a2
Drop the Conversion Context's Unused Accessors
lukaskollmer Oct 4, 2026
086af5d
Move the Exporter Request Context Into the Contract
lukaskollmer Oct 4, 2026
eaa27c9
Fold the Event Sequencer Into the Exchange Producer
lukaskollmer Oct 4, 2026
3d9abde
Build the Study Context From the Envelope and Merge Document Contexts
lukaskollmer Oct 4, 2026
4748b96
Let an Output Draft State Extensions After Its Links
lukaskollmer Oct 4, 2026
a2923ad
Export SensorKit Records Through the Shared Producer and Assembler
lukaskollmer Oct 4, 2026
5b5a7e2
Mark the Caller-Managed Event Context and the Source-Neutral Sensor C…
lukaskollmer Oct 4, 2026
630000b
Share the Assembler's Device and Provenance Builders and State Instan…
lukaskollmer Oct 4, 2026
c0d3517
Export Questionnaire Responses Through the Shared Producer
lukaskollmer Oct 4, 2026
e13bca7
State Questionnaire Provenance.occurred at the Offset the Response St…
lukaskollmer Oct 4, 2026
c184cad
Pin That Producers Over One Storage Share This Process's Holds
lukaskollmer Oct 4, 2026
bf10ef5
Pin SensorKit's Raw-Only Output, Per-Sensor Event Keys and Request Fi…
lukaskollmer Oct 4, 2026
d09b810
Isolate Questionnaire Content Changes and Pin Its Request Fingerprint
lukaskollmer Oct 4, 2026
548b5b9
Delete the Clinical Record Inspection API
lukaskollmer Oct 5, 2026
30ab9ca
Port the HealthKit Tests, Goldens and Content Corpus to the Exporter
lukaskollmer Oct 5, 2026
0e59b70
Delete the Deprecated HealthKit Converter API
lukaskollmer Oct 5, 2026
387d55a
Rewrite the HealthKit Documentation Around the Exporter
lukaskollmer Oct 5, 2026
a810a1d
Report Each Deletion's Retraction Apart From Exports
lukaskollmer Oct 5, 2026
65842fa
Nest GroveHealthKitFHIR's Public Types Under Their Owners
lukaskollmer Oct 5, 2026
2017dab
Delete the HealthKit Catalog's Unread Field Dispositions
lukaskollmer Oct 5, 2026
3130da4
Merge the Identity Errors and Nest the Validation Errors
lukaskollmer Oct 5, 2026
6128dc2
Flatten the Deployment Systems and Keep the Identity Machinery in the…
lukaskollmer Oct 5, 2026
7032c03
Keep the Retraction Builder in the Package and Drop the Graph's Old S…
lukaskollmer Oct 5, 2026
3afb618
Generate the Contract's Machinery as Package and Drop Its Unread Members
lukaskollmer Oct 5, 2026
7d5bdc7
Mark the Source-Neutral Sensor Family as One Removal Candidate and Fi…
lukaskollmer Oct 5, 2026
2f3dd35
Give Displaced Doc Comments Back to Their Types and Fix Two Stale Docs
lukaskollmer Oct 5, 2026
9fe7c1b
Let the Shared Assembler State Only the Legacy Bundle Id
lukaskollmer Oct 5, 2026
3c76982
Delete the ECG Symptom Identity Refusals No Input Can Reach
lukaskollmer Oct 5, 2026
6c3480a
Drop the Reused-System Refusal Only Derived Systems Can Bypass
lukaskollmer Oct 5, 2026
04a4190
Hand the Record Payloads Straight to the Content Builders
lukaskollmer Oct 5, 2026
f1e6f2f
Move the GroveHealthKit Dependency to the HealthKit FHIR Tests
lukaskollmer Oct 5, 2026
2b9a09d
Pin How Each Exporter Narrows a Failure Into Its Refusal
lukaskollmer Oct 5, 2026
cea2190
Pin the Generator's Refusal of a Looser Active Entry Policy
lukaskollmer Oct 5, 2026
68ff1b4
Drop the Unused Output Index and a Stale Doc Phrase
lukaskollmer Oct 5, 2026
c624b37
Count the Days of a Proleptic Gregorian Date
lukaskollmer Oct 4, 2026
e2687d5
Read HealthKit Effective Times Back in the Proleptic Gregorian Calendar
lukaskollmer Oct 4, 2026
23e26e4
Pin the ECG Refusal of Local Years Past 9999
lukaskollmer Oct 4, 2026
274cd3a
Refuse Effective Instants HealthKit Cannot Hold
lukaskollmer Oct 5, 2026
cc00bbb
Pin Sub-Millisecond, Post-Transition and Negative-Era Date Readings
lukaskollmer Oct 5, 2026
d1277ed
Refuse ECG Times Whose Zone Offset No FHIR Date-Time States
lukaskollmer Oct 4, 2026
3df9562
Round the Exact Mobile Instant and State Its Zone's Offset at the Rou…
lukaskollmer Oct 4, 2026
fe2f76a
Pin a Mobile Instant Whose Product Tie Breaks Up, Away From Even
lukaskollmer Oct 5, 2026
f2b5173
State Percent Fractions in Percent by a Decimal Shift
lukaskollmer Oct 4, 2026
03f0300
Refuse Unscalable Percent Fractions Through One Tested Exit
lukaskollmer Oct 5, 2026
45d0d0a
Project Observations Back Through the Effective Each Profile Admits
lukaskollmer Oct 4, 2026
a353b5c
State a Heart Rate Interval as an Effective Period
lukaskollmer Oct 4, 2026
50b8630
Withhold the End Date of Instant-Only Measurements
lukaskollmer Oct 4, 2026
8cfe493
Pin the Reverse Projection's Raw Period Order and Start Zone
lukaskollmer Oct 5, 2026
7732412
Report Numeric and Effective-Time Refusals Under Their Registered Codes
lukaskollmer Oct 4, 2026
3e0268b
Refuse Admitted Rows Grove Does Not Emit as Not Yet Convertible
lukaskollmer Oct 4, 2026
8363018
Pin the Binary64 Domain Check Against the Decimal One
lukaskollmer Oct 5, 2026
057d263
Pin the Blood-Pressure Member Rows Today's Code Converts
lukaskollmer Oct 4, 2026
cdecf56
Read Blood-Pressure Members' Time Zone, Manual Entry and Keys
lukaskollmer Oct 4, 2026
26c14cb
State the Blood-Pressure Member Rule on the Plan's Metadata Field
lukaskollmer Oct 5, 2026
1a053b3
Check That Every HealthKit Golden Pairs Its Writer-Record Identity an…
lukaskollmer Oct 4, 2026
9c7ff3a
Report Every Metadata Key a Graph Does Not Represent
lukaskollmer Oct 4, 2026
8b16371
Pin Each Workout Container's Metadata and Answer Only Content Keys as…
lukaskollmer Oct 5, 2026
d20ecaf
State a Walking-Steadiness Notification's Occurrence as Its Component
lukaskollmer Oct 4, 2026
5f22b9e
Pin the Unresolved Coded-Value Refusal and the Occurrence Component's…
lukaskollmer Oct 5, 2026
fb34ce8
Pin ECG Sampling Frequencies at Reciprocal Periods
lukaskollmer Oct 4, 2026
bb231e0
Check ECG Sampling Frequencies by the Guide's Shortest Round-Trip Com…
lukaskollmer Oct 5, 2026
77f542f
Pin an Infinite ECG Sampling Frequency in the Content Corpus
lukaskollmer Oct 5, 2026
26140a1
Tie the Content Corpus to the HealthKit Output Revision
lukaskollmer Oct 5, 2026
c8fc4b1
Refuse Workout Routes With an Invalid Coordinate
lukaskollmer Oct 4, 2026
7d1cf4e
Report Invalid Route Coordinates Unclassified and Pin the Accuracy Edges
lukaskollmer Oct 5, 2026
2bf4c9a
Bring the Exporter Docs Up to Date and Record the M7 Measurements
lukaskollmer Oct 5, 2026
4098f7a
Require the Recording Device Profile Behind an In-Bundle Observation.…
lukaskollmer Oct 5, 2026
2e19059
State a Gateway Application That Is the Converter as the Gateway
lukaskollmer Oct 5, 2026
a670928
Resolve Every Catalogued SensorKit Sensor to Its Source Token
lukaskollmer Oct 5, 2026
d486935
Drop the Grove-Owned Visit-Location Identifier System
lukaskollmer Oct 5, 2026
59c0bab
Name the Assembly Request, Share the Snapshot Tokens and Document Two…
lukaskollmer Oct 5, 2026
42745d0
Retract Withdrawn Questionnaire Responses Through the Producer
lukaskollmer Oct 5, 2026
3b69b56
Tie SensorKit and Questionnaire Output to Their Output Revisions
lukaskollmer Oct 5, 2026
857f7b1
Document Deletion Bounds, Record Exports and the Writer Snapshot Corr…
lukaskollmer Oct 5, 2026
a71cb1e
Lead the Contract Docs With the Producer and Mark the Caller-Managed …
lukaskollmer Oct 5, 2026
d4b6e7f
State What a Questionnaire Response Needs to Export
lukaskollmer Oct 5, 2026
af3b4db
Walk Through a Real SensorKit Batch in the Docs
lukaskollmer Oct 5, 2026
0615b60
Import Crypto Off Apple in the Questionnaire Graph Comparison
lukaskollmer Oct 5, 2026
b411b04
Pin the Questionnaire Retraction Graph Bytes
lukaskollmer Oct 5, 2026
ca98a5a
Name the Right Batch Recovery and State What Each Exporter Takes Back
lukaskollmer Oct 5, 2026
0b58c41
Delete the Caller-Managed Event Context and the Source-Neutral Sensor…
lukaskollmer Oct 5, 2026
682c2d9
Summarize Export Warnings by Kind in a Warning Report
lukaskollmer Oct 6, 2026
f563fcf
Measure the HealthKit Exporter's Throughput on Request
lukaskollmer Oct 7, 2026
b982f91
Export HealthKit Graphs Several Times Faster
lukaskollmer Oct 8, 2026
dba06bc
Export and Retract Asynchronously on a Task Group
lukaskollmer Oct 8, 2026
a1db436
Check the Test App's Read Authorization in a Loop
lukaskollmer Oct 8, 2026
dc8ba8a
Validate and Assemble HealthKit Graphs a Fifth Faster
lukaskollmer Oct 8, 2026
3e99817
Walk Each Graph's JSON Once While Validating
lukaskollmer Oct 9, 2026
57bef1f
Read and Write SensorKit Recordings Several Times Faster
lukaskollmer Oct 9, 2026
fcc3af2
Read My Heart Counts' Legacy PPG Files and Drop the Computed File Ext…
lukaskollmer Oct 9, 2026
7a18d5b
Inline isBlank Instead of Prespecializing It
lukaskollmer Oct 9, 2026
15f2f6a
Pin grove-fhir to Its Latest Main Commit
lukaskollmer Oct 9, 2026
2d6ed91
Keep Concurrent Exports From Waiting on Each Other
lukaskollmer Oct 9, 2026
16a3169
Read an Accelerometer Recording's Summary in the Parse That Checks It
lukaskollmer Oct 9, 2026
6731656
Trim Four Small Per-Record Costs From HealthKit Graphs
lukaskollmer Oct 9, 2026
dcbe4a7
Reserve Nothing for an Omitted Route and Serialize Recordings Once
lukaskollmer Oct 9, 2026
26dd3f6
Keep Per-Thread Caches With @ThreadLocal Instead of PerThread
lukaskollmer Oct 9, 2026
559ab45
Support Optional Thread-Locals and Check Every pthread Call
lukaskollmer Oct 10, 2026
71626f5
Read PDF Text Without Resolving Fonts
lukaskollmer Oct 10, 2026
281f809
Pin Legacy PPG Decoding to Bytes My Heart Counts' Own Encoder Wrote
lukaskollmer Oct 10, 2026
3475d46
Start a PPG Recording With a Version Byte
lukaskollmer Oct 10, 2026
8e357f7
Pin grove-fhir's IG Branch and Report an Omitted Recording Method
lukaskollmer Oct 10, 2026
e59466e
ThreadLocal visibility
lukaskollmer Oct 10, 2026
49bdff7
Pin grove-fhir's Topic Stack
lukaskollmer Oct 10, 2026
44164ca
Pin grove-fhir's Reordered and Fixed Topic Stack
lukaskollmer Oct 10, 2026
422ab5c
Report a Workout Activity Only as a Shared Activity It Is a Kind Of
lukaskollmer Oct 10, 2026
dae10bf
Pin grove-fhir's Example and Semantic-Vector Fixes
lukaskollmer Oct 11, 2026
1995d03
Check That a Guide Example Is Contained in Its Golden
lukaskollmer Oct 11, 2026
45f644b
Pin grove-fhir's Offline-Lane Time-Zone Fix
lukaskollmer Oct 11, 2026
749e8e2
Accept a Retraction That Addresses the Whole Source Record
lukaskollmer Oct 11, 2026
e149543
Project a Stated Value as the Binary64 Nearest Its Decimal
lukaskollmer Oct 11, 2026
3bfb2aa
Check Grove's Output Against the HealthKit Guide's Generated Examples
lukaskollmer Oct 11, 2026
b8cafa8
Project Category, Percent and Rate Observations Back to HealthKit
lukaskollmer Oct 13, 2026
1a01e0c
Fail the Containment Check on an Uncovered Guide Example
lukaskollmer Oct 13, 2026
2194128
Classify the Guide-Example Scripts for the Test Matrix
lukaskollmer Oct 13, 2026
552dd39
Put nonisolated Before public on the Async Exporter Entry Points
lukaskollmer Oct 13, 2026
b406e2f
Compile the FHIR Tests for iOS Releases Before 26
lukaskollmer Oct 13, 2026
6cba72c
Await the Exporter in the HealthKit FHIR UI Test App
lukaskollmer Oct 13, 2026
b31d094
Retain Equatable Properties in the Dead-Code Scan and Drop Two Unused…
lukaskollmer Oct 13, 2026
c666f9b
Make the Reverse Projection Public Again
lukaskollmer Oct 13, 2026
9fa9d4e
Merge lukas/fhir-review-fixes into lukas/grove-fhir-api-changes
lukaskollmer Oct 16, 2026
4485e1f
Hash Every Attachment Through One Shared SHA-1
lukaskollmer Oct 16, 2026
463402b
Drain Each Built Record's Temporaries Inside ConcurrentBuild
lukaskollmer Oct 16, 2026
6e40cfb
Stop a Cancelled Build Whose Tools Already Exited
lukaskollmer Oct 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 11 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#
# This source file is part of the Grove open-source project
#
# SPDX-FileCopyrightText: 2026 Stanford University and the project authors (see CONTRIBUTORS.md)
#
# SPDX-License-Identifier: MIT
#

# The HealthKit content corpus is recorded by its tests (see ContentCorpusStore): review a regeneration through the
# content-corpus.changes.txt it writes beside the corpus, not through this file's one-line-per-vector diff.
Tests/GroveHealthKitFHIRTests/Resources/ContentCorpus/content-corpus.jsonl linguist-generated=true
10 changes: 5 additions & 5 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
grove_fhir_ref:
description: grove-fhir commit carrying the Grove FHIR Implementation Guides contract.
type: string
default: eff5af8f58cdd99bb8988c237f2996e9e1de75ff
default: c078136f12b4713ceee19619b1bcd2ff96186ecc
fhir_only:
description: Run only producer conformance against the selected grove-fhir contract.
type: boolean
Expand All @@ -32,7 +32,7 @@
grove_fhir_ref:
description: grove-fhir commit carrying the Grove FHIR Implementation Guides contract.
type: string
default: eff5af8f58cdd99bb8988c237f2996e9e1de75ff
default: c078136f12b4713ceee19619b1bcd2ff96186ecc

concurrency:
group: tests-${{ github.ref }}
Expand Down Expand Up @@ -124,7 +124,7 @@
# Every source change is resolved through the graph, so the head revision is always dumped.
run: swift package --manifest-cache none dump-package > "$RUNNER_TEMP/head-package.json"
- name: Evaluate the base package graph and configuration
if: steps.changes.outputs.manifest_changed == 'true' || steps.changes.outputs.packages_changed == 'true' || steps.changes.outputs.ui_test_projects_changed == 'true'

Check warning on line 127 in .github/workflows/tests.yml

View workflow job for this annotation

GitHub Actions / Standards / Surface

127:151 [line-length] line too long (172 > 150 characters)
env:
BASE_SHA: ${{ steps.changes.outputs.base_sha }}
run: |
Expand Down Expand Up @@ -203,7 +203,7 @@
# self-hosted label set (matrix.selfHostedLabels) is ["self-hosted","macOS"] plus any
# per-package `extra_runner_labels` from packages.toml, computed by
# Scripts/affected-test-matrix.py.
runs-on: ${{ matrix.platform == 'Linux' && 'ubuntu-latest' || (matrix.selfHosted && fromJson(matrix.selfHostedLabels) || fromJson('["macos-latest"]')) }}

Check warning on line 206 in .github/workflows/tests.yml

View workflow job for this annotation

GitHub Actions / Standards / Surface

206:151 [line-length] line too long (157 > 150 characters)
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.detect.outputs.matrix) }}
Expand Down Expand Up @@ -280,17 +280,17 @@
with:
repository: SchmiedmayerLab/grove-fhir
path: .fhir/grove-fhir
ref: ${{ inputs.grove_fhir_ref || 'eff5af8f58cdd99bb8988c237f2996e9e1de75ff' }}
ref: ${{ inputs.grove_fhir_ref || 'c078136f12b4713ceee19619b1bcd2ff96186ecc' }}
persist-credentials: false
- name: Record grove-fhir contract revision
working-directory: .fhir/grove-fhir
run: |
echo "grove-fhir ref: ${{ inputs.grove_fhir_ref || 'eff5af8f58cdd99bb8988c237f2996e9e1de75ff' }}"
echo "grove-fhir ref: ${{ inputs.grove_fhir_ref || 'c078136f12b4713ceee19619b1bcd2ff96186ecc' }}"
echo "grove-fhir SHA: $(git rev-parse HEAD)"
- name: Pin the implementation-guide cache key
run: |
RESOLVED_GROVE_FHIR_SHA="$(git -C .fhir/grove-fhir rev-parse HEAD)"
echo "GROVE_FHIR_GUIDE_CACHE_KEY=grove-fhir-validation-${{ runner.os }}-$RESOLVED_GROVE_FHIR_SHA-${{ hashFiles('.fhir/grove-fhir/Gemfile.lock', '.fhir/grove-fhir/package-lock.json', '.fhir/grove-fhir/Scripts/**', '.fhir/grove-fhir/catalog/**', '.fhir/grove-fhir/mobile/**', '.fhir/grove-fhir/sensor/**', '.fhir/grove-fhir/sensorkit/**', '.fhir/grove-fhir/healthkit/**', '.fhir/grove-fhir/questionnaire/**') }}" >> "$GITHUB_ENV"

Check warning on line 293 in .github/workflows/tests.yml

View workflow job for this annotation

GitHub Actions / Standards / Surface

293:151 [line-length] line too long (437 > 150 characters)
- name: Restore built implementation guides
id: guide-cache
uses: actions/cache@v6
Expand Down Expand Up @@ -346,7 +346,7 @@
- name: Validate resources emitted by Grove
env:
FHIR_COMPONENTS: ${{ needs.detect.outputs.fhir_components }}
GROVE_FHIR_REF: ${{ inputs.grove_fhir_ref || 'eff5af8f58cdd99bb8988c237f2996e9e1de75ff' }}
GROVE_FHIR_REF: ${{ inputs.grove_fhir_ref || 'c078136f12b4713ceee19619b1bcd2ff96186ecc' }}
run: |
IFS=',' read -r -a COMPONENTS <<< "$FHIR_COMPONENTS"
for component in "${COMPONENTS[@]}"; do
Expand Down
4 changes: 4 additions & 0 deletions .periphery.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ retain_codable_properties: true
# Protocol requirement parameters belong to the API shape even when an implementation ignores them.
retain_unused_protocol_func_params: true

# A stored property of an Equatable or Hashable type is read by its synthesized == and hash(into:), which the
# index does not record: a batch key, an exact decimal and an identifier set compare by every field.
retain_equatable_properties: true

# RAII tokens: the assignment holds the subscription; deallocation is the deregistration.
retain_assign_only_property_types:
- KVOStateDidChangeObserver
Expand Down
14 changes: 11 additions & 3 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,6 @@ var targets: [Target] = [
name: "GroveHealthKitFHIR",
dependencies: [
.target(name: "GroveFHIRContract"),
.target(name: "GroveHealthKit"),
.product(name: "ModelsR4", package: "FHIRModels", condition: fhirModelsCondition),
.target(name: "FHIRModelsExtensions")
],
Expand All @@ -382,9 +381,13 @@ var targets: [Target] = [
name: "GroveHealthKitFHIRTests",
dependencies: [
.target(name: "GroveFHIRContract"),
.target(name: "GroveHealthKit"),
.target(name: "GroveHealthKitFHIR")
],
exclude: testTargetExcludes("GroveHealthKitFHIRTests", additional: ["UITests"]),
resources: [
.process("Resources")
],
swiftSettings: defaultSwiftSettings,
plugins: [] + defaultPlugins
),
Expand Down Expand Up @@ -803,7 +806,8 @@ var targets: [Target] = [
name: "GroveFHIRContract",
dependencies: [
.product(name: "ModelsR4", package: "FHIRModels", condition: fhirModelsCondition),
.product(name: "Crypto", package: "swift-crypto", condition: .when(platforms: [.linux]))
.product(name: "Crypto", package: "swift-crypto", condition: .when(platforms: [.linux])),
.target(name: "ThreadLocal")
],
exclude: targetExcludes("GroveFHIRContract"),
swiftSettings: defaultSwiftSettings,
Expand Down Expand Up @@ -838,6 +842,7 @@ var targets: [Target] = [
name: "GroveFHIRTests",
dependencies: [
.target(name: "GroveFHIR"),
.target(name: "GroveFHIRContract"),
"GroveHealthKitFHIR"
],
exclude: testTargetExcludes("GroveFHIRTests", additional: ["UITests"]),
Expand Down Expand Up @@ -1433,7 +1438,6 @@ var targets: [Target] = [
.target(name: "GroveQuestionnaireExtraction"),
.target(name: "GroveFHIRContract"),
.target(name: "GroveQuestionnaire"),
.product(name: "Crypto", package: "swift-crypto", condition: .when(platforms: [.linux])),
.product(name: "ModelsR4", package: "FHIRModels", condition: fhirModelsCondition),
.target(name: "FHIRModelsExtensions"),
.target(name: "FHIRPathParser"),
Expand Down Expand Up @@ -1487,6 +1491,7 @@ var targets: [Target] = [
dependencies: [
.target(name: "GroveQuestionnaireExtraction"),
.target(name: "GroveFHIRContract"),
.product(name: "Crypto", package: "swift-crypto", condition: .when(platforms: [.linux])),
.product(name: "ModelsR4", package: "FHIRModels", condition: fhirModelsCondition)
],
resources: [
Expand Down Expand Up @@ -1576,6 +1581,9 @@ var targets: [Target] = [
.product(name: "ModelsR4", package: "FHIRModels", condition: fhirModelsCondition)
],
exclude: testTargetExcludes("GroveSensorKitFHIRTests"),
resources: [
.process("Resources")
],
swiftSettings: defaultSwiftSettings,
plugins: [] + defaultPlugins
),
Expand Down
2 changes: 2 additions & 0 deletions REUSE.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,10 @@ SPDX-License-Identifier = "MIT"
path = [
"Sources/GroveSpeechRecognizer/Resources/**",
"Tests/GroveChatTests/UITests/TestApp/Resources/**",
"Tests/GroveHealthKitFHIRTests/Resources/**",
"Tests/GroveQuestionnaireTests/Resources/**",
"Tests/GroveQuestionnaireExtractionTests/Resources/**",
"Tests/GroveSensorKitFHIRTests/Resources/**",
"Tests/GroveQuestionnaireTests/UITests/TestApp/Resources/**"
]
SPDX-FileCopyrightText = "2026 Stanford University and the project authors (see CONTRIBUTORS.md)"
Expand Down
4 changes: 2 additions & 2 deletions Scripts/Tests/test_affected_test_matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ def test_contract_generator_runs_every_conformance_lane(self):

def test_a_producer_change_selects_only_its_lane(self):
for path, component in (
("Sources/GroveHealthKitFHIR/HealthKitConverter.swift", "healthkit"),
("Sources/GroveHealthKitFHIR/HealthKitFHIRExporter.swift", "healthkit"),
("Sources/GroveQuestionnaire/Model/Questionnaire.swift", "questionnaire"),
("Sources/GroveSensorKitFHIR/SensorKitConverter.swift", "sensor"),
):
Expand All @@ -199,7 +199,7 @@ def test_explicit_all_selects_every_conformance_lane(self):

def test_fhir_only_schedules_every_conformance_lane_and_no_package_jobs(self):
result = run_selector(
"Sources/GroveHealthKitFHIR/HealthKitConverter.swift",
"Sources/GroveHealthKitFHIR/HealthKitFHIRExporter.swift",
extra_arguments=("--fhir-only",),
)

Expand Down
18 changes: 18 additions & 0 deletions Scripts/Tests/test_build_support.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,24 @@ def test_plain_command_keeps_output_streams_separate(self):
self.assertEqual(result.stdout, b"out\n")
self.assertEqual(result.stderr, b"err\n")

def test_stopping_a_group_that_already_exited_succeeds(self):
# Cancellation can arrive after a stage exited but before it was reaped; macOS then refuses
# to signal its group with EPERM, which must not end the script as a failure.
sys.path.insert(0, str(self.root))
self.addCleanup(sys.path.remove, str(self.root))
import build_support
process = subprocess.Popen([sys.executable, "-c", "pass"], start_new_session=True)
deadline = time.monotonic() + 5
while time.monotonic() < deadline:
state = subprocess.run(["ps", "-o", "stat=", "-p", str(process.pid)],
capture_output=True, text=True).stdout.strip()
if state.startswith("Z"):
break
time.sleep(0.01)
self.assertTrue(state.startswith("Z"), f"Stage did not become a zombie: {state!r}")
build_support._stop_processes([process])
self.assertEqual(process.returncode, 0)

def test_cancellation_stops_command_and_its_descendant(self):
# Exercise both the simple command and build pipeline; the child acknowledges SIGTERM
# through a file so this assertion does not confuse a short-lived zombie with a live tool.
Expand Down
Loading
Loading