@the-cascade-protocol/cli 0.3.3 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,8 +20,8 @@
20
20
  dct:description "Vocabulary for clinical documents, narratives, and structured notes imported from EHR systems via Apple HealthKit"@en ;
21
21
  dct:creator "Cascade Agentic Labs" ;
22
22
  dct:created "2025-12-26"^^xsd:date ;
23
- dct:modified "2026-02-22"^^xsd:date ;
24
- owl:versionInfo "1.6" ;
23
+ dct:modified "2026-03-12"^^xsd:date ;
24
+ owl:versionInfo "1.7" ;
25
25
  rdfs:comment "Domain-specific vocabulary for clinical documentation and structured records imported from patient portals (MyChart, Epic, etc.). Contains EHR-verified clinical data."@en ;
26
26
  rdfs:seeAlso <https://cascadeprotocol.org/docs/clinical/v1.0/> .
27
27
 
@@ -752,7 +752,7 @@ clinical:icd10Code a owl:DatatypeProperty ;
752
752
 
753
753
  clinical:linkedConditionIds a owl:DatatypeProperty ;
754
754
  rdfs:label "Linked Condition IDs"@en ;
755
- rdfs:comment "Space-separated UUIDs of related ConditionSummary records. Enables graph traversal between related diagnoses (e.g., complication to root condition)."@en ;
755
+ rdfs:comment "Space-separated UUIDs of related ConditionSummary records (e.g., linking a complication to its root condition). Enables graph traversal between related diagnoses."@en ;
756
756
  rdfs:domain clinical:Condition ;
757
757
  rdfs:range xsd:string .
758
758
 
@@ -768,7 +768,7 @@ clinical:vaccineName a owl:DatatypeProperty ;
768
768
 
769
769
  clinical:vaccineCode a owl:DatatypeProperty ;
770
770
  rdfs:label "Vaccine Code"@en ;
771
- rdfs:comment "CVX code for the vaccine"@en ;
771
+ rdfs:comment "CVX code for the vaccine (legacy — use clinical:cvxCode for new serialization; v1.6)"@en ;
772
772
  rdfs:domain clinical:Immunization ;
773
773
  rdfs:range xsd:string .
774
774
 
@@ -1298,6 +1298,15 @@ clinical:isActive a owl:DatatypeProperty ;
1298
1298
  # Changelog
1299
1299
  # ============================================================================
1300
1300
  #
1301
+ # Version 1.6 (2026-02-22)
1302
+ # - Added clinical:linkedConditionIds DatatypeProperty on clinical:Condition
1303
+ # for linking related ConditionSummary records via space-separated UUIDs.
1304
+ # Enables graph traversal between related diagnoses (e.g., complication to
1305
+ # root condition). Part of Health Map v3 Pre-Phase Track A (Task A2).
1306
+ # - Annotated clinical:vaccineCode as legacy in favor of clinical:cvxCode
1307
+ # (both defined; cvxCode added v1.1, vaccineCode retained for backward
1308
+ # compatibility).
1309
+ #
1301
1310
  # Version 1.5 (2026-02-10)
1302
1311
  # - Added CoverageRecord class (11 properties) for insurance coverage data
1303
1312
  # Maps to fhir:Coverage. Layer 2 complement to checkup:InsuranceInfo (Layer 3).
@@ -1367,3 +1376,182 @@ clinical:isActive a owl:DatatypeProperty ;
1367
1376
  # All documents imported via clinical: vocabulary use cascade:ClinicalGenerated provenance
1368
1377
  # Source: Apple HealthKit HKClinicalRecord API
1369
1378
  # Privacy: Documents may contain PHI - encrypted storage required
1379
+
1380
+ # ============================================================================
1381
+ # New Class: clinical:Encounter
1382
+ # Added in v1.7 — supports FHIR Encounter conversion
1383
+ # ============================================================================
1384
+
1385
+ clinical:Encounter a owl:Class ;
1386
+ rdfs:label "Clinical Encounter"@en ;
1387
+ rdfs:comment "A clinical encounter — any interaction between a patient and a healthcare provider. Enables grouping of clinical events (procedures, observations, prescriptions) that occurred in the same visit context."@en ;
1388
+ rdfs:subClassOf prov:Entity .
1389
+
1390
+ clinical:encounterClass a owl:DatatypeProperty ;
1391
+ rdfs:domain clinical:Encounter ;
1392
+ rdfs:range xsd:string ;
1393
+ rdfs:label "Encounter Class"@en ;
1394
+ rdfs:comment "Values: ambulatory, emergency, inpatient, home-health"@en .
1395
+
1396
+ clinical:encounterStatus a owl:DatatypeProperty ;
1397
+ rdfs:domain clinical:Encounter ;
1398
+ rdfs:range xsd:string ;
1399
+ rdfs:label "Encounter Status"@en ;
1400
+ rdfs:comment "Values: finished, in-progress, cancelled"@en .
1401
+
1402
+ clinical:encounterType a owl:DatatypeProperty ;
1403
+ rdfs:domain clinical:Encounter ;
1404
+ rdfs:range xsd:string ;
1405
+ rdfs:label "Encounter Type"@en ;
1406
+ rdfs:comment "Display name from SNOMED/FHIR code"@en .
1407
+
1408
+ clinical:encounterStart a owl:DatatypeProperty ;
1409
+ rdfs:domain clinical:Encounter ;
1410
+ rdfs:range xsd:dateTime ;
1411
+ rdfs:label "Encounter Start"@en .
1412
+
1413
+ clinical:encounterEnd a owl:DatatypeProperty ;
1414
+ rdfs:domain clinical:Encounter ;
1415
+ rdfs:range xsd:dateTime ;
1416
+ rdfs:label "Encounter End"@en .
1417
+
1418
+ clinical:facilityName a owl:DatatypeProperty ;
1419
+ rdfs:domain clinical:Encounter ;
1420
+ rdfs:range xsd:string ;
1421
+ rdfs:label "Facility Name"@en .
1422
+
1423
+ # ============================================================================
1424
+ # New Class: clinical:MedicationAdministration
1425
+ # Added in v1.7 — supports FHIR MedicationAdministration conversion
1426
+ # ============================================================================
1427
+
1428
+ clinical:MedicationAdministration a owl:Class ;
1429
+ rdfs:label "Medication Administration"@en ;
1430
+ rdfs:comment "A single administration event of a medication given at a specific time by a provider (e.g., IV antibiotics administered pre-surgery, vaccine injection at visit). Semantically distinct from clinical:Medication (ongoing prescription regimens): represents a one-time event, not an ongoing regimen."@en ;
1431
+ rdfs:subClassOf prov:Entity .
1432
+
1433
+ clinical:administeredDate a owl:DatatypeProperty ;
1434
+ rdfs:domain clinical:MedicationAdministration ;
1435
+ rdfs:range xsd:dateTime ;
1436
+ rdfs:label "Administered Date"@en .
1437
+
1438
+ clinical:administeredDose a owl:DatatypeProperty ;
1439
+ rdfs:domain clinical:MedicationAdministration ;
1440
+ rdfs:range xsd:string ;
1441
+ rdfs:label "Administered Dose"@en ;
1442
+ rdfs:comment "e.g., '1g', '500mg'"@en .
1443
+
1444
+ clinical:administeredRoute a owl:DatatypeProperty ;
1445
+ rdfs:domain clinical:MedicationAdministration ;
1446
+ rdfs:range xsd:string ;
1447
+ rdfs:label "Administered Route"@en ;
1448
+ rdfs:comment "Values: oral, IV, IM, subcutaneous, topical"@en .
1449
+
1450
+ clinical:administrationStatus a owl:DatatypeProperty ;
1451
+ rdfs:domain clinical:MedicationAdministration ;
1452
+ rdfs:range xsd:string ;
1453
+ rdfs:label "Administration Status"@en ;
1454
+ rdfs:comment "Values: completed, not-done, in-progress"@en .
1455
+
1456
+ # ============================================================================
1457
+ # New Class: clinical:ImplantedDevice
1458
+ # Added in v1.7 — supports FHIR Device conversion
1459
+ # ============================================================================
1460
+
1461
+ clinical:ImplantedDevice a owl:Class ;
1462
+ rdfs:label "Implanted Device"@en ;
1463
+ rdfs:comment "A medical device implanted in or attached to the patient as a permanent part of their health profile (e.g., pacemaker, cardiac stent, cochlear implant, insulin pump). Presence affects medication safety, imaging eligibility (MRI contraindications), and surgical risk."@en ;
1464
+ rdfs:subClassOf prov:Entity .
1465
+
1466
+ clinical:deviceType a owl:DatatypeProperty ;
1467
+ rdfs:domain clinical:ImplantedDevice ;
1468
+ rdfs:range xsd:string ;
1469
+ rdfs:label "Device Type"@en ;
1470
+ rdfs:comment "e.g., pacemaker, stent, cochlear-implant"@en .
1471
+
1472
+ clinical:implantDate a owl:DatatypeProperty ;
1473
+ rdfs:domain clinical:ImplantedDevice ;
1474
+ rdfs:range xsd:dateTime ;
1475
+ rdfs:label "Implant Date"@en .
1476
+
1477
+ clinical:deviceManufacturer a owl:DatatypeProperty ;
1478
+ rdfs:domain clinical:ImplantedDevice ;
1479
+ rdfs:range xsd:string ;
1480
+ rdfs:label "Device Manufacturer"@en .
1481
+
1482
+ clinical:udiCarrier a owl:DatatypeProperty ;
1483
+ rdfs:domain clinical:ImplantedDevice ;
1484
+ rdfs:range xsd:string ;
1485
+ rdfs:label "UDI Carrier"@en ;
1486
+ rdfs:comment "Unique Device Identifier"@en .
1487
+
1488
+ clinical:deviceStatus a owl:DatatypeProperty ;
1489
+ rdfs:domain clinical:ImplantedDevice ;
1490
+ rdfs:range xsd:string ;
1491
+ rdfs:label "Device Status"@en ;
1492
+ rdfs:comment "Values: active, inactive, entered-in-error"@en .
1493
+
1494
+ # ============================================================================
1495
+ # New Class: clinical:ImagingStudy
1496
+ # Added in v1.7 — supports FHIR ImagingStudy conversion
1497
+ # ============================================================================
1498
+
1499
+ clinical:ImagingStudy a owl:Class ;
1500
+ rdfs:label "Imaging Study"@en ;
1501
+ rdfs:comment "Metadata record for a diagnostic imaging study (CT, MRI, X-ray, ultrasound). Records that imaging exists and its key characteristics without requiring access to DICOM images. Useful for clinical timeline, pre-procedure review, and agent reasoning about the patient's imaging history."@en ;
1502
+ rdfs:subClassOf prov:Entity .
1503
+
1504
+ clinical:imagingModality a owl:DatatypeProperty ;
1505
+ rdfs:domain clinical:ImagingStudy ;
1506
+ rdfs:range xsd:string ;
1507
+ rdfs:label "Imaging Modality"@en ;
1508
+ rdfs:comment "Values: CT, MR, DX, US, NM"@en .
1509
+
1510
+ clinical:studyDescription a owl:DatatypeProperty ;
1511
+ rdfs:domain clinical:ImagingStudy ;
1512
+ rdfs:range xsd:string ;
1513
+ rdfs:label "Study Description"@en .
1514
+
1515
+ clinical:numberOfSeries a owl:DatatypeProperty ;
1516
+ rdfs:domain clinical:ImagingStudy ;
1517
+ rdfs:range xsd:integer ;
1518
+ rdfs:label "Number of Series"@en .
1519
+
1520
+ clinical:studyDate a owl:DatatypeProperty ;
1521
+ rdfs:domain clinical:ImagingStudy ;
1522
+ rdfs:range xsd:dateTime ;
1523
+ rdfs:label "Study Date"@en .
1524
+
1525
+ clinical:dicomStudyUid a owl:DatatypeProperty ;
1526
+ rdfs:domain clinical:ImagingStudy ;
1527
+ rdfs:range xsd:string ;
1528
+ rdfs:label "DICOM Study UID"@en .
1529
+
1530
+ clinical:retrieveUrl a owl:DatatypeProperty ;
1531
+ rdfs:domain clinical:ImagingStudy ;
1532
+ rdfs:range xsd:anyURI ;
1533
+ rdfs:label "Retrieve URL"@en ;
1534
+ rdfs:comment "URL to DICOM server if available"@en .
1535
+
1536
+ # ============================================================================
1537
+ # New Properties on existing class: clinical:LaboratoryReport
1538
+ # Added in v1.7 — supports DiagnosticReport panel grouping
1539
+ # ============================================================================
1540
+
1541
+ clinical:hasLabResult a owl:ObjectProperty ;
1542
+ rdfs:label "Has Lab Result"@en ;
1543
+ rdfs:comment "Links a LaboratoryReport panel to its constituent clinical:LabResult observations. Enables grouping of lab values (e.g., CBC components) under the ordering panel. FHIR alignment: fhir:DiagnosticReport.result."@en ;
1544
+ rdfs:domain clinical:LaboratoryReport ;
1545
+ rdfs:range clinical:LabResult .
1546
+
1547
+ clinical:panelName a owl:DatatypeProperty ;
1548
+ rdfs:domain clinical:LaboratoryReport ;
1549
+ rdfs:range xsd:string ;
1550
+ rdfs:label "Panel Name"@en ;
1551
+ rdfs:comment "e.g., 'Complete Blood Count'"@en .
1552
+
1553
+ clinical:reportCategory a owl:DatatypeProperty ;
1554
+ rdfs:domain clinical:LaboratoryReport ;
1555
+ rdfs:range xsd:string ;
1556
+ rdfs:label "Report Category"@en ;
1557
+ rdfs:comment "Values: LAB, RAD, PATH"@en .
@@ -17,8 +17,8 @@
17
17
  dct:description "Core vocabulary for schema versioning, data provenance, identity management, and patient demographics across all Cascade Protocol applications"@en ;
18
18
  dct:creator "Cascade Agentic Labs" ;
19
19
  dct:created "2025-10-31"^^xsd:date ;
20
- dct:modified "2026-02-22"^^xsd:date ;
21
- owl:versionInfo "2.3" ;
20
+ dct:modified "2026-03-12"^^xsd:date ;
21
+ owl:versionInfo "2.8" ;
22
22
  rdfs:comment "This vocabulary defines cross-cutting concepts used by all Cascade Protocol health data applications: schema versioning, data provenance, patient demographics (PatientProfile), and supporting identity classes (Address, PharmacyInfo, AdvanceDirectives). Domain-specific vocabularies (e.g., pots:, ecg:, glucose:) import this core vocabulary."@en ;
23
23
  rdfs:seeAlso <https://cascadeprotocol.org/docs/core/v1.0/> .
24
24
 
@@ -153,10 +153,20 @@ cascade:sourceMetricCoverage a owl:ObjectProperty ;
153
153
  rdfs:comment "A wellness metric this source provides. Use multiple triples for multiple metrics (e.g., two triples linking to health:restingHeartRate and health:heartRateVariability). Preferred over comma-separated strings for proper RDF graph traversal."@en ;
154
154
  rdfs:domain cascade:DataSource .
155
155
 
156
- # ============================================================================
157
156
  # ============================================================================
158
157
  # Provenance Detail Properties (v2.3)
159
158
  # ============================================================================
159
+ # Lightweight provenance detail properties for record-level attribution.
160
+ # These properties are placed on record instances directly (not on DataSource
161
+ # objects) for display in Health Map provenance badges without requiring
162
+ # full DataSource graph traversal.
163
+ #
164
+ # cascade:sourceOrganization — populated from FHIR meta.source or contained
165
+ # Organization reference during clinical record import. Examples: "Kaiser
166
+ # Permanente", "Mayo Clinic".
167
+ #
168
+ # cascade:sourceDeviceName — populated from HealthKit HKSource contributing
169
+ # app/device name. Examples: "Apple Watch Series 9", "Omron BP Monitor".
160
170
 
161
171
  cascade:sourceOrganization a owl:DatatypeProperty ;
162
172
  rdfs:label "Source Organization"@en ;
@@ -168,6 +178,7 @@ cascade:sourceDeviceName a owl:DatatypeProperty ;
168
178
  rdfs:comment "Device or app that recorded this measurement (e.g., 'Apple Watch Series 9', 'Omron BP Monitor'). Populated from HealthKit HKSource contributing app/device name."@en ;
169
179
  rdfs:range xsd:string .
170
180
 
181
+ # ============================================================================
171
182
  # Vocabulary Organization (v1.3)
172
183
  # ============================================================================
173
184
 
@@ -531,6 +542,117 @@ cascade:advanceDirectiveNotes a owl:DatatypeProperty ;
531
542
  rdfs:domain cascade:AdvanceDirectives ;
532
543
  rdfs:range xsd:string .
533
544
 
545
+ # ============================================================================
546
+ # Reconciliation Properties (v2.4)
547
+ # ============================================================================
548
+ # Used by the Cascade reconciliation pipeline to annotate merged records with
549
+ # provenance and conflict resolution metadata.
550
+
551
+ cascade:sourceSystem a owl:DatatypeProperty ;
552
+ rdfs:label "Source System"@en ;
553
+ rdfs:comment "The name of the EHR or health system that originally held this record (e.g. 'primary-care', 'hospital'). Added during cross-system conversion to enable reconciliation."@en ;
554
+ rdfs:domain owl:Thing ;
555
+ rdfs:range xsd:string .
556
+
557
+ cascade:reconciliationStatus a owl:ObjectProperty ;
558
+ rdfs:label "Reconciliation Status"@en ;
559
+ rdfs:comment "The outcome of reconciliation for this record. Value is one of the cascade:ReconciliationStatus named individuals: cascade:Canonical, cascade:Merged, cascade:ConflictResolved, cascade:UnresolvedConflict."@en ;
560
+ rdfs:domain owl:Thing ;
561
+ rdfs:range cascade:ReconciliationStatus .
562
+
563
+ cascade:ReconciliationStatus a owl:Class ;
564
+ rdfs:label "Reconciliation Status"@en ;
565
+ rdfs:comment "Closed enumeration of possible reconciliation outcomes."@en .
566
+
567
+ cascade:Canonical a owl:NamedIndividual, cascade:ReconciliationStatus ;
568
+ rdfs:label "Canonical"@en ;
569
+ rdfs:comment "Record is unique — no matching record found across other source systems."@en .
570
+
571
+ cascade:Merged a owl:NamedIndividual, cascade:ReconciliationStatus ;
572
+ rdfs:label "Merged"@en ;
573
+ rdfs:comment "Record was deduplicated from two or more identical or near-identical source records."@en .
574
+
575
+ cascade:ConflictResolved a owl:NamedIndividual, cascade:ReconciliationStatus ;
576
+ rdfs:label "Conflict Resolved"@en ;
577
+ rdfs:comment "Conflicting values across source records were resolved automatically using a trust-priority or merge strategy."@en .
578
+
579
+ cascade:UnresolvedConflict a owl:NamedIndividual, cascade:ReconciliationStatus ;
580
+ rdfs:label "Unresolved Conflict"@en ;
581
+ rdfs:comment "Conflicting values could not be automatically resolved (trust scores too similar). Requires manual clinical review."@en .
582
+
583
+ cascade:WithinSourceDuplicate a owl:NamedIndividual, cascade:ReconciliationStatus ;
584
+ rdfs:label "Within-Source Duplicate"@en ;
585
+ rdfs:comment "Record is a duplicate of another record within the same source system (e.g. same condition recorded across multiple clinical encounters). Suppressed from cross-system reconciliation output during Pass 1 deduplication."@en .
586
+
587
+ cascade:mergedFrom a owl:ObjectProperty ;
588
+ rdfs:label "Merged From"@en ;
589
+ rdfs:comment "Links a reconciled record to the source record URIs that were merged into it. Used together with prov:wasDerivedFrom for semantic interoperability."@en ;
590
+ rdfs:domain owl:Thing ;
591
+ rdfs:range owl:Thing ;
592
+ rdfs:subPropertyOf prov:wasDerivedFrom .
593
+
594
+ cascade:conflictResolution a owl:ObjectProperty ;
595
+ rdfs:label "Conflict Resolution Strategy"@en ;
596
+ rdfs:comment "The strategy used to resolve a conflict. Value is one of the cascade:ConflictResolutionStrategy named individuals: cascade:TrustPriority, cascade:MergeValues, cascade:FlagUnresolved."@en ;
597
+ rdfs:domain owl:Thing ;
598
+ rdfs:range cascade:ConflictResolutionStrategy .
599
+
600
+ cascade:ConflictResolutionStrategy a owl:Class ;
601
+ rdfs:label "Conflict Resolution Strategy"@en ;
602
+ rdfs:comment "Closed enumeration of reconciliation resolution strategies."@en .
603
+
604
+ cascade:TrustPriority a owl:NamedIndividual, cascade:ConflictResolutionStrategy ;
605
+ rdfs:label "Trust Priority"@en ;
606
+ rdfs:comment "The record from the highest-trust source system is selected as canonical."@en .
607
+
608
+ cascade:MergeValues a owl:NamedIndividual, cascade:ConflictResolutionStrategy ;
609
+ rdfs:label "Merge Values"@en ;
610
+ rdfs:comment "The canonical record is built by taking the winner's fields and filling any gaps from lower-trust sources."@en .
611
+
612
+ cascade:FlagUnresolved a owl:NamedIndividual, cascade:ConflictResolutionStrategy ;
613
+ rdfs:label "Flag Unresolved"@en ;
614
+ rdfs:comment "The conflict could not be automatically resolved. Record is tagged cascade:UnresolvedConflict for manual clinical review."@en .
615
+
616
+ cascade:conflictField a owl:ObjectProperty ;
617
+ rdfs:label "Conflict Field"@en ;
618
+ rdfs:comment "The predicate URI on which a conflict was detected during reconciliation (e.g. health:status, health:resultValue). Stored as a URI reference, not a prefixed name string."@en ;
619
+ rdfs:domain owl:Thing ;
620
+ rdfs:range rdfs:Resource .
621
+
622
+ cascade:conflictDescription a owl:DatatypeProperty ;
623
+ rdfs:label "Conflict Description"@en ;
624
+ rdfs:comment "Removed v2.7. Was informational prose describing conflicting values per source system. Replaced by cascade:conflictDetail structured blank node (v2.5), which uses rdfs:comment on the blank node for human readability."@en ;
625
+ owl:deprecated true ;
626
+ rdfs:domain owl:Thing ;
627
+ rdfs:range xsd:string .
628
+
629
+ cascade:conflictDetail a owl:ObjectProperty ;
630
+ rdfs:label "Conflict Detail"@en ;
631
+ rdfs:comment "Links a reconciled record to a structured cascade:ConflictDetail blank node describing the per-system values that conflicted. The blank node carries an rdfs:comment with a human-readable summary."@en ;
632
+ rdfs:domain owl:Thing ;
633
+ rdfs:range cascade:ConflictDetail .
634
+
635
+ cascade:ConflictDetail a owl:Class ;
636
+ rdfs:label "Conflict Detail"@en ;
637
+ rdfs:comment "A structured representation of conflicting values across source systems for a single property. Used as a blank node linked from cascade:conflictDetail."@en .
638
+
639
+ cascade:conflictFor a owl:ObjectProperty ;
640
+ rdfs:label "Conflict For"@en ;
641
+ rdfs:comment "The predicate URI on which the conflict was detected (e.g. <https://ns.cascadeprotocol.org/health/v1#status>). Links a cascade:ConflictDetail to the conflicting property."@en ;
642
+ rdfs:domain cascade:ConflictDetail ;
643
+ rdfs:range rdfs:Resource .
644
+
645
+ cascade:systemValue a owl:ObjectProperty ;
646
+ rdfs:label "System Value"@en ;
647
+ rdfs:comment "Links a cascade:ConflictDetail to a blank node representing one source system's value for the conflicting property. Each participating source system has its own cascade:systemValue blank node."@en ;
648
+ rdfs:domain cascade:ConflictDetail .
649
+
650
+ cascade:forSystem a owl:DatatypeProperty ;
651
+ rdfs:label "For System"@en ;
652
+ rdfs:comment "The name of the source EHR system (e.g. 'primary-care', 'specialist') within a cascade:systemValue blank node."@en ;
653
+ rdfs:domain cascade:ConflictDetail ;
654
+ rdfs:range xsd:string .
655
+
534
656
  # ============================================================================
535
657
  # Alignment with W3C PROV-O
536
658
  # ============================================================================
@@ -554,6 +676,42 @@ cascade:advanceDirectiveNotes a owl:DatatypeProperty ;
554
676
  # ============================================================================
555
677
  # Changelog
556
678
  # ============================================================================
679
+ # v2.7 (2026-03-12): Removed cascade:conflictDescription (deprecated since v2.5).
680
+ # cascade:conflictDetail blank nodes now carry an rdfs:comment with a human-readable
681
+ # summary of the conflicting values, replacing the separate prose property.
682
+ # v2.6 (2026-03-11): Within-source deduplication vocabulary. Added
683
+ # cascade:WithinSourceDuplicate named individual for cascade:ReconciliationStatus.
684
+ # Represents encounter-instance duplicate records suppressed during Pass 1
685
+ # within-source deduplication. Phase 6 of reconciliation pipeline.
686
+ # v2.5 (2026-03-11): Structured conflict representation. Added cascade:ConflictDetail
687
+ # class and 4 supporting properties: cascade:conflictDetail (ObjectProperty,
688
+ # links record to ConflictDetail blank node), cascade:conflictFor (ObjectProperty,
689
+ # the conflicting predicate URI), cascade:systemValue (ObjectProperty, per-system
690
+ # value blank node), cascade:forSystem (DatatypeProperty, system name string).
691
+ # Deprecated cascade:conflictDescription (informational prose, replaced by
692
+ # cascade:conflictDetail structured blank node). Phase 5 of reconciliation pipeline.
693
+ # v2.4 (2026-03-11): Added reconciliation vocabulary for multi-system EHR data
694
+ # merging. Properties: cascade:sourceSystem (EHR origin tag, xsd:string),
695
+ # cascade:reconciliationStatus (ObjectProperty, range cascade:ReconciliationStatus),
696
+ # cascade:mergedFrom (ObjectProperty, subPropertyOf prov:wasDerivedFrom),
697
+ # cascade:conflictResolution (ObjectProperty, range cascade:ConflictResolutionStrategy),
698
+ # cascade:conflictField (ObjectProperty, range rdfs:Resource, stores full predicate URI),
699
+ # cascade:conflictDescription (DatatypeProperty, informational prose).
700
+ # Declared named individuals: cascade:Canonical, cascade:Merged,
701
+ # cascade:ConflictResolved, cascade:UnresolvedConflict (ReconciliationStatus);
702
+ # cascade:TrustPriority, cascade:MergeValues, cascade:FlagUnresolved
703
+ # (ConflictResolutionStrategy). Note: cascade:mergedSources (dropped —
704
+ # redundant with mergedFrom+sourceSystem) and cascade:conflictValues
705
+ # (renamed to cascade:conflictDescription) were in the initial design but
706
+ # corrected before the TTL was finalized. Supports CLI v0.2.5 reconcile command.
707
+ # v2.3 (2026-02-22): Added 2 provenance detail properties for record-level
708
+ # attribution: cascade:sourceOrganization (organization that provided a
709
+ # record, populated from FHIR meta.source or contained Organization
710
+ # reference during clinical import) and cascade:sourceDeviceName (device
711
+ # or app that recorded a measurement, populated from HealthKit HKSource
712
+ # contributing app/device name). Used across all 11 CheckupShared record
713
+ # models for Health Map provenance display. Part of Health Map v3
714
+ # Pre-Phase Track A (Task A4).
557
715
  # v2.2 (2026-02-18): FHIR-aligned Address expansion and PatientProfile
558
716
  # completeness (Phase 3.5 ONT1 + ONT2).
559
717
  # ONT1: Added 9 FHIR Address.* aligned properties (addressUse, addressType,
@@ -601,3 +759,40 @@ cascade:advanceDirectiveNotes a owl:DatatypeProperty ;
601
759
  # AIExtracted (under ClinicalGenerated). Aligns with SDK DataProvenance
602
760
  # enum (6 cases). Backward-compatible: existing data using
603
761
  # cascade:ConsumerGenerated/ClinicalGenerated remains valid.
762
+
763
+ # ============================================================================
764
+ # Layer Promotion Status (FHIR Conversion)
765
+ # Added in v2.8 — supports lossless FHIR ↔ Cascade round-trip conversion
766
+ # ============================================================================
767
+
768
+ cascade:LayerPromotionStatusValue a owl:Class ;
769
+ rdfs:label "Layer Promotion Status Value"@en ;
770
+ rdfs:comment "Closed enumeration of Layer 2 promotion states for converted FHIR records."@en .
771
+
772
+ cascade:layerPromotionStatus a owl:ObjectProperty ;
773
+ rdfs:label "Layer Promotion Status"@en ;
774
+ rdfs:comment "Indicates whether a record has been fully mapped to Cascade Layer 2 vocabulary or is preserved as a Layer 1 FHIR passthrough pending future mapping."@en ;
775
+ rdfs:range cascade:LayerPromotionStatusValue .
776
+
777
+ cascade:FullyMapped a owl:NamedIndividual, cascade:LayerPromotionStatusValue ;
778
+ rdfs:label "Fully Mapped"@en ;
779
+ rdfs:comment "Record has been fully mapped to Cascade Layer 2 vocabulary."@en .
780
+
781
+ cascade:PendingLayerTwoPromotion a owl:NamedIndividual, cascade:LayerPromotionStatusValue ;
782
+ rdfs:label "Pending Layer 2 Promotion"@en ;
783
+ rdfs:comment "Record is preserved as Layer 1 FHIR passthrough. Full Layer 2 vocabulary mapping has not yet been defined. Original FHIR JSON is retained in cascade:fhirJson for round-trip export."@en .
784
+
785
+ cascade:fhirJson a owl:DatatypeProperty ;
786
+ rdfs:label "Original FHIR JSON"@en ;
787
+ rdfs:comment "Preserves the complete original FHIR resource JSON for Layer 1 passthrough records. Always stored as plain xsd:string (FHIR JSON is always valid UTF-8). Used for lossless round-trip export. Self-contained — survives reconciliation without sidecar file dependencies."@en ;
788
+ rdfs:range xsd:string .
789
+
790
+ cascade:fhirResourceType a owl:DatatypeProperty ;
791
+ rdfs:label "FHIR Resource Type"@en ;
792
+ rdfs:comment "FHIR R4 resourceType of the source record. Populated on Layer 1 passthrough records."@en ;
793
+ rdfs:range xsd:string .
794
+
795
+ cascade:sourceRecordDate a owl:DatatypeProperty ;
796
+ rdfs:label "Source Record Date"@en ;
797
+ rdfs:comment "Minimal date projection triple for Layer 1 passthrough records. Copied from effectiveDateTime, date, period.start, or created field if present."@en ;
798
+ rdfs:range xsd:dateTime .