@the-cascade-protocol/cli 0.3.2 → 0.3.4

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.
@@ -18,8 +18,8 @@
18
18
  dct:description "Domain vocabulary for patient-owned insurance, benefits, and financial health data. Layer 2 vocabulary resolving the overlap between checkup:InsuranceInfo (patient-reported) and clinical:CoverageRecord (EHR-imported) with a unified, standardized representation."@en ;
19
19
  dct:creator "Cascade Agentic Labs" ;
20
20
  dct:created "2026-02-18"^^xsd:date ;
21
- dct:modified "2026-02-18"^^xsd:date ;
22
- owl:versionInfo "1.0" ;
21
+ dct:modified "2026-03-17"^^xsd:date ;
22
+ owl:versionInfo "1.3" ;
23
23
  rdfs:comment "Insurance and benefits data is cross-cutting: not clinical (it's administrative/financial), not app-specific (any health app benefits from knowing coverage), and contributed by both patient self-report and EHR import. This vocabulary provides a single Layer 2 domain model that both checkup: (Layer 3, patient-reported) and clinical: (Layer 2, EHR-imported) can reference via the mixed namespace pattern. Recommended Pod storage path: /coverage/"@en ;
24
24
  rdfs:seeAlso <https://cascadeprotocol.org/docs/coverage/v1/> .
25
25
 
@@ -166,6 +166,13 @@ coverage:rxGroup a owl:DatatypeProperty ;
166
166
  # Changelog
167
167
  # ============================================================================
168
168
  #
169
+ # v1.3 (2026-03-17): Added coverage:deniedClinicalContext (ObjectProperty linking DenialNotice to clinical evidence in the Pod),
170
+ # coverage:outcomeReason (free-text explanation of appeal outcome), coverage:reversalAmount (reimbursement if approved),
171
+ # coverage:DenialReasonCode named individuals (standard-mapped enum values for denialReasonCode),
172
+ # rdfs:seeAlso mappings to HL7 ClaimResponse.adjudication and CARIN IG adjudication codes.
173
+ #
174
+ # v1.2 (2026-03-16): Added coverage:DenialNotice class, coverage:AppealRecord class, and 11 new properties for denial/appeal workflow.
175
+ #
169
176
  # Version 1.0 (2026-02-18)
170
177
  # - Initial release as part of Schema Refactoring Plan Phase 2 (WS4)
171
178
  # - Created to resolve overlap between checkup:InsuranceInfo (L3, patient-reported)
@@ -180,3 +187,319 @@ coverage:rxGroup a owl:DatatypeProperty ;
180
187
  # - Layer 2 domain vocabulary per three-layer architecture
181
188
  # - Recommended Pod storage: /coverage/plans/{plan-id}.ttl
182
189
  #
190
+
191
+ # ============================================================================
192
+ # New Classes: ClaimRecord and BenefitStatement
193
+ # Added in v1.1 — supports FHIR Claim and ExplanationOfBenefit conversion
194
+ # ============================================================================
195
+
196
+ coverage:ClaimRecord a owl:Class ;
197
+ rdfs:label "Claim Record"@en ;
198
+ rdfs:comment "A medical claim submitted to an insurer for reimbursement. FHIR alignment: fhir:Claim"@en .
199
+
200
+ coverage:BenefitStatement a owl:Class ;
201
+ rdfs:label "Benefit Statement (EOB)"@en ;
202
+ rdfs:comment "An Explanation of Benefits document — the insurer's formal response to a claim, including adjudication, denial reasons, and patient cost responsibility. FHIR alignment: fhir:ExplanationOfBenefit. CMS mandates patient access via CARIN Alliance FHIR IG."@en .
203
+
204
+ coverage:DenialNotice a owl:Class ;
205
+ rdfs:label "Denial Notice"@en ;
206
+ rdfs:comment "A formal denial of coverage issued by an insurer. Distinct from BenefitStatement — a DenialNotice initiates an appeal process, not a payment record. Recommended Pod storage: /coverage/denials/{id}.ttl"@en ;
207
+ rdfs:subClassOf prov:Entity ;
208
+ rdfs:seeAlso fhir:ExplanationOfBenefit .
209
+
210
+ coverage:AppealRecord a owl:Class ;
211
+ rdfs:label "Appeal Record"@en ;
212
+ rdfs:comment "A formal appeal filing contesting a denial notice. One record per appeal level. Recommended Pod storage: /coverage/appeals/{id}.ttl"@en ;
213
+ rdfs:subClassOf prov:Activity ;
214
+ rdfs:seeAlso fhir:Task .
215
+
216
+ # ============================================================================
217
+ # New Properties: coverage:Deductible
218
+ # ============================================================================
219
+
220
+ coverage:deductibleAmount a owl:DatatypeProperty ;
221
+ rdfs:domain coverage:Deductible ;
222
+ rdfs:range xsd:decimal ;
223
+ rdfs:label "Deductible Amount"@en .
224
+
225
+ coverage:deductibleCurrency a owl:DatatypeProperty ;
226
+ rdfs:domain coverage:Deductible ;
227
+ rdfs:range xsd:string ;
228
+ rdfs:label "Deductible Currency"@en .
229
+
230
+ coverage:deductibleMetAmount a owl:DatatypeProperty ;
231
+ rdfs:domain coverage:Deductible ;
232
+ rdfs:range xsd:decimal ;
233
+ rdfs:label "Deductible Met Amount"@en .
234
+
235
+ coverage:deductiblePeriod a owl:DatatypeProperty ;
236
+ rdfs:domain coverage:Deductible ;
237
+ rdfs:range xsd:string ;
238
+ rdfs:label "Deductible Period"@en .
239
+
240
+ coverage:deductibleType a owl:DatatypeProperty ;
241
+ rdfs:domain coverage:Deductible ;
242
+ rdfs:range xsd:string ;
243
+ rdfs:label "Deductible Type"@en ;
244
+ rdfs:comment "Values: individual, family, in-network, out-of-network"@en .
245
+
246
+ # ============================================================================
247
+ # New Properties: coverage:CopaySchedule
248
+ # ============================================================================
249
+
250
+ coverage:copayAmount a owl:DatatypeProperty ;
251
+ rdfs:domain coverage:CopaySchedule ;
252
+ rdfs:range xsd:decimal ;
253
+ rdfs:label "Copay Amount"@en .
254
+
255
+ coverage:copayCurrency a owl:DatatypeProperty ;
256
+ rdfs:domain coverage:CopaySchedule ;
257
+ rdfs:range xsd:string ;
258
+ rdfs:label "Copay Currency"@en .
259
+
260
+ coverage:copayType a owl:DatatypeProperty ;
261
+ rdfs:domain coverage:CopaySchedule ;
262
+ rdfs:range xsd:string ;
263
+ rdfs:label "Copay Type"@en ;
264
+ rdfs:comment "Values: primary-care, specialist, emergency, prescription"@en .
265
+
266
+ # ============================================================================
267
+ # New Properties: coverage:ClaimRecord
268
+ # ============================================================================
269
+
270
+ coverage:claimDate a owl:DatatypeProperty ;
271
+ rdfs:domain coverage:ClaimRecord ;
272
+ rdfs:range xsd:dateTime ;
273
+ rdfs:label "Claim Date"@en .
274
+
275
+ coverage:claimTotal a owl:DatatypeProperty ;
276
+ rdfs:domain coverage:ClaimRecord ;
277
+ rdfs:range xsd:decimal ;
278
+ rdfs:label "Claim Total"@en .
279
+
280
+ coverage:claimStatus a owl:DatatypeProperty ;
281
+ rdfs:domain coverage:ClaimRecord ;
282
+ rdfs:range xsd:string ;
283
+ rdfs:label "Claim Status"@en ;
284
+ rdfs:comment "Values: active, cancelled, draft, entered-in-error"@en .
285
+
286
+ coverage:claimType a owl:DatatypeProperty ;
287
+ rdfs:domain coverage:ClaimRecord ;
288
+ rdfs:range xsd:string ;
289
+ rdfs:label "Claim Type"@en ;
290
+ rdfs:comment "Values: professional, institutional, oral, pharmacy, vision"@en .
291
+
292
+ coverage:billingProvider a owl:DatatypeProperty ;
293
+ rdfs:domain coverage:ClaimRecord ;
294
+ rdfs:range xsd:string ;
295
+ rdfs:label "Billing Provider"@en .
296
+
297
+ coverage:hasDiagnosis a owl:DatatypeProperty ;
298
+ rdfs:domain coverage:ClaimRecord ;
299
+ rdfs:range xsd:string ;
300
+ rdfs:label "Has Diagnosis"@en ;
301
+ rdfs:comment "ICD-10 code URI"@en .
302
+
303
+ coverage:hasProcedure a owl:DatatypeProperty ;
304
+ rdfs:domain coverage:ClaimRecord ;
305
+ rdfs:range xsd:string ;
306
+ rdfs:label "Has Procedure"@en ;
307
+ rdfs:comment "CPT/SNOMED code URI"@en .
308
+
309
+ coverage:sourceRecordId a owl:DatatypeProperty ;
310
+ rdfs:range xsd:string ;
311
+ rdfs:label "Source Record ID"@en ;
312
+ rdfs:comment "Original source system record identifier. No domain restriction — shared by ClaimRecord and BenefitStatement."@en .
313
+
314
+ # ============================================================================
315
+ # New Properties: coverage:BenefitStatement
316
+ # ============================================================================
317
+
318
+ coverage:adjudicationDate a owl:DatatypeProperty ;
319
+ rdfs:domain coverage:BenefitStatement ;
320
+ rdfs:range xsd:dateTime ;
321
+ rdfs:label "Adjudication Date"@en .
322
+
323
+ coverage:adjudicationStatus a owl:DatatypeProperty ;
324
+ rdfs:domain coverage:BenefitStatement ;
325
+ rdfs:range xsd:string ;
326
+ rdfs:label "Adjudication Status"@en ;
327
+ rdfs:comment "Values: completed, cancelled, entered-in-error"@en .
328
+
329
+ coverage:outcomeCode a owl:DatatypeProperty ;
330
+ rdfs:domain coverage:BenefitStatement ;
331
+ rdfs:range xsd:string ;
332
+ rdfs:label "Outcome Code"@en ;
333
+ rdfs:comment "Values: queued, complete, error, partial"@en .
334
+
335
+ coverage:denialReason a owl:DatatypeProperty ;
336
+ rdfs:domain coverage:BenefitStatement ;
337
+ rdfs:range xsd:string ;
338
+ rdfs:label "Denial Reason"@en .
339
+
340
+ coverage:totalBilled a owl:DatatypeProperty ;
341
+ rdfs:domain coverage:BenefitStatement ;
342
+ rdfs:range xsd:decimal ;
343
+ rdfs:label "Total Billed"@en .
344
+
345
+ coverage:totalAllowed a owl:DatatypeProperty ;
346
+ rdfs:domain coverage:BenefitStatement ;
347
+ rdfs:range xsd:decimal ;
348
+ rdfs:label "Total Allowed"@en .
349
+
350
+ coverage:totalPaid a owl:DatatypeProperty ;
351
+ rdfs:domain coverage:BenefitStatement ;
352
+ rdfs:range xsd:decimal ;
353
+ rdfs:label "Total Paid"@en .
354
+
355
+ coverage:patientResponsibility a owl:DatatypeProperty ;
356
+ rdfs:domain coverage:BenefitStatement ;
357
+ rdfs:range xsd:decimal ;
358
+ rdfs:label "Patient Responsibility"@en .
359
+
360
+ coverage:relatedClaim a owl:ObjectProperty ;
361
+ rdfs:domain coverage:BenefitStatement ;
362
+ rdfs:range coverage:ClaimRecord ;
363
+ rdfs:label "Related Claim"@en ;
364
+ rdfs:comment "Links an ExplanationOfBenefit to its corresponding Claim."@en .
365
+
366
+ # ============================================================================
367
+ # v1.2 DenialNotice Properties
368
+ # ============================================================================
369
+
370
+ coverage:deniedProcedureCode a owl:DatatypeProperty ;
371
+ rdfs:label "Denied Procedure Code"@en ;
372
+ rdfs:comment "CPT or HCPCS code of the denied service (e.g., E0787 for CGM)."@en ;
373
+ rdfs:domain coverage:DenialNotice ;
374
+ rdfs:range xsd:string .
375
+
376
+ coverage:denialReasonCode a owl:DatatypeProperty ;
377
+ rdfs:label "Denial Reason Code"@en ;
378
+ rdfs:comment "Structured coded denial reason. Recommended values are coverage:DenialReasonCode named individuals (coverage:NotMedicallyNecessary, coverage:LCDCriteriaNotMet, coverage:NCDCriteriaNotMet, coverage:ServiceNotCovered, coverage:PriorAuthorizationRequired, coverage:DuplicateClaim, coverage:InformationRequested). Distinct from the free-text coverage:denialReason. Aligns with HL7 ClaimResponse adjudication and CARIN IG Blue Button STU2."@en ;
379
+ rdfs:domain coverage:DenialNotice ;
380
+ rdfs:range xsd:string ;
381
+ rdfs:seeAlso <http://terminology.hl7.org/CodeSystem/adjudication> ,
382
+ <http://hl7.org/fhir/us/carin-bb/STU2/> .
383
+
384
+ coverage:denialLetterDate a owl:DatatypeProperty ;
385
+ rdfs:label "Denial Letter Date"@en ;
386
+ rdfs:comment "Date the denial notice was issued. The appeal deadline clock starts from this date."@en ;
387
+ rdfs:domain coverage:DenialNotice ;
388
+ rdfs:range xsd:date .
389
+
390
+ coverage:appealDeadline a owl:DatatypeProperty ;
391
+ rdfs:label "Appeal Deadline"@en ;
392
+ rdfs:comment "Computed deadline for filing an appeal, based on the denial date, plan type, and applicable jurisdiction rules."@en ;
393
+ rdfs:domain coverage:DenialNotice ;
394
+ rdfs:range xsd:date .
395
+
396
+ coverage:coveragePolicyReference a owl:DatatypeProperty ;
397
+ rdfs:label "Coverage Policy Reference"@en ;
398
+ rdfs:comment "The LCD, NCD, or coverage policy cited as the basis for denial (e.g., LCD L33822)."@en ;
399
+ rdfs:domain coverage:DenialNotice ;
400
+ rdfs:range xsd:string .
401
+
402
+ # ============================================================================
403
+ # v1.2 AppealRecord Properties
404
+ # ============================================================================
405
+
406
+ coverage:appealLevel a owl:DatatypeProperty ;
407
+ rdfs:label "Appeal Level"@en ;
408
+ rdfs:comment "The administrative level of this appeal. Values: redetermination, qio_reconsideration, alj_hearing, mac_review, federal_court, internal_level1, internal_level2, external_review, state_insurance_dept, litigation."@en ;
409
+ rdfs:domain coverage:AppealRecord ;
410
+ rdfs:range xsd:string .
411
+
412
+ coverage:appealFiledDate a owl:DatatypeProperty ;
413
+ rdfs:label "Appeal Filed Date"@en ;
414
+ rdfs:comment "Date the appeal was formally filed."@en ;
415
+ rdfs:domain coverage:AppealRecord ;
416
+ rdfs:range xsd:date .
417
+
418
+ coverage:appealOutcome a owl:DatatypeProperty ;
419
+ rdfs:label "Appeal Outcome"@en ;
420
+ rdfs:comment "Outcome of the appeal. Values: approved, denied, partial, withdrawn, pending."@en ;
421
+ rdfs:domain coverage:AppealRecord ;
422
+ rdfs:range xsd:string .
423
+
424
+ coverage:appealOutcomeDate a owl:DatatypeProperty ;
425
+ rdfs:label "Appeal Outcome Date"@en ;
426
+ rdfs:comment "Date the appeal outcome was received."@en ;
427
+ rdfs:domain coverage:AppealRecord ;
428
+ rdfs:range xsd:date .
429
+
430
+ coverage:relatedDenialNotice a owl:ObjectProperty ;
431
+ rdfs:label "Related Denial Notice"@en ;
432
+ rdfs:comment "Links an AppealRecord to the DenialNotice it contests."@en ;
433
+ rdfs:domain coverage:AppealRecord ;
434
+ rdfs:range coverage:DenialNotice .
435
+
436
+ # ============================================================================
437
+ # v1.3 Properties
438
+ # ============================================================================
439
+
440
+ coverage:deniedClinicalContext a owl:ObjectProperty ;
441
+ rdfs:label "Denied Clinical Context"@en ;
442
+ rdfs:comment "References clinical or health records in the Pod that are relevant to this denial — procedures, lab results, diagnoses, device readings. Enables appeals to cite specific clinical evidence against policy criteria. Range is intentionally open (rdfs:Resource) to allow linking across clinical:, health:, and pots: namespaces."@en ;
443
+ rdfs:domain coverage:DenialNotice ;
444
+ rdfs:range rdfs:Resource .
445
+
446
+ coverage:outcomeReason a owl:DatatypeProperty ;
447
+ rdfs:label "Outcome Reason"@en ;
448
+ rdfs:comment "Free-text explanation of why the appeal was approved, denied, or partially approved. Captures the insurer's stated rationale for the outcome."@en ;
449
+ rdfs:domain coverage:AppealRecord ;
450
+ rdfs:range xsd:string .
451
+
452
+ coverage:reversalAmount a owl:DatatypeProperty ;
453
+ rdfs:label "Reversal Amount"@en ;
454
+ rdfs:comment "Reimbursement amount granted if the appeal was approved or partially approved. Expressed as a decimal in the currency of the related InsurancePlan."@en ;
455
+ rdfs:domain coverage:AppealRecord ;
456
+ rdfs:range xsd:decimal .
457
+
458
+ # ============================================================================
459
+ # v1.3 Named Individuals: DenialReasonCode
460
+ # Standard-mapped enumeration values for coverage:denialReasonCode
461
+ # Source mappings:
462
+ # HL7 ClaimResponse.adjudication: http://terminology.hl7.org/CodeSystem/adjudication
463
+ # CARIN IG for Blue Button: http://hl7.org/fhir/us/carin-bb/STU2/
464
+ # CMS Medicare denial codes: https://www.cms.gov/medicare/coding-billing/place-of-service-codes
465
+ # ============================================================================
466
+
467
+ coverage:NotMedicallyNecessary a coverage:DenialReasonCode ;
468
+ rdfs:label "Not Medically Necessary"@en ;
469
+ rdfs:comment "Service denied as not meeting medical necessity criteria for the diagnosis. HL7 alignment: adjudication code 'noauth'. CMS reason: 50 (not medically necessary)."@en ;
470
+ rdfs:seeAlso <http://terminology.hl7.org/CodeSystem/adjudication> .
471
+
472
+ coverage:LCDCriteriaNotMet a coverage:DenialReasonCode ;
473
+ rdfs:label "LCD Criteria Not Met"@en ;
474
+ rdfs:comment "Service denied because the patient does not meet the criteria in the applicable Local Coverage Determination (LCD). CMS LCD search: https://www.cms.gov/medicare-coverage-database/"@en ;
475
+ rdfs:seeAlso <https://www.cms.gov/medicare-coverage-database/> .
476
+
477
+ coverage:NCDCriteriaNotMet a coverage:DenialReasonCode ;
478
+ rdfs:label "NCD Criteria Not Met"@en ;
479
+ rdfs:comment "Service denied because the patient does not meet the criteria in the applicable National Coverage Determination (NCD)."@en ;
480
+ rdfs:seeAlso <https://www.cms.gov/medicare-coverage-database/> .
481
+
482
+ coverage:ServiceNotCovered a coverage:DenialReasonCode ;
483
+ rdfs:label "Service Not Covered"@en ;
484
+ rdfs:comment "The requested service is explicitly excluded from the patient's plan benefits. HL7 alignment: adjudication code 'benefit'."@en ;
485
+ rdfs:seeAlso <http://terminology.hl7.org/CodeSystem/adjudication> .
486
+
487
+ coverage:PriorAuthorizationRequired a coverage:DenialReasonCode ;
488
+ rdfs:label "Prior Authorization Required"@en ;
489
+ rdfs:comment "The service requires prior authorization which was not obtained before service delivery. HL7 alignment: adjudication code 'noauth'. CARIN IG: X12 835 reason code 4."@en ;
490
+ rdfs:seeAlso <http://hl7.org/fhir/us/carin-bb/STU2/> .
491
+
492
+ coverage:DuplicateClaim a coverage:DenialReasonCode ;
493
+ rdfs:label "Duplicate Claim"@en ;
494
+ rdfs:comment "Claim denied as a duplicate of a previously processed claim. X12 835 reason code 18."@en .
495
+
496
+ coverage:InformationRequested a coverage:DenialReasonCode ;
497
+ rdfs:label "Additional Information Requested"@en ;
498
+ rdfs:comment "Claim suspended or denied pending submission of additional clinical documentation. X12 835 reason code 16."@en .
499
+
500
+ # DenialReasonCode type declaration (supports named individuals above)
501
+ coverage:DenialReasonCode a owl:Class ;
502
+ rdfs:label "Denial Reason Code"@en ;
503
+ rdfs:comment "Enumeration class for structured denial reason codes. Use named individuals (coverage:NotMedicallyNecessary, etc.) as values for coverage:denialReasonCode. Aligns with HL7 ClaimResponse adjudication codes and CARIN IG for Blue Button (STU2)."@en ;
504
+ rdfs:seeAlso <http://terminology.hl7.org/CodeSystem/adjudication> ,
505
+ <http://hl7.org/fhir/us/carin-bb/STU2/> .
@@ -21,8 +21,8 @@
21
21
  dct:description "Vocabulary for consumer-generated wellness observations from wearable devices and HealthKit. Maps Cascade wellness properties to established SNOMED CT and LOINC codes following the three-layer ontology architecture."@en ;
22
22
  dct:creator "Cascade Agentic Labs" ;
23
23
  dct:created "2026-01-29"^^xsd:date ;
24
- dct:modified "2026-02-17"^^xsd:date ;
25
- owl:versionInfo "2.2" ;
24
+ dct:modified "2026-02-28"^^xsd:date ;
25
+ owl:versionInfo "2.3" ;
26
26
  rdfs:comment """Three-layer ontology for wellness data:
27
27
  Layer 1 (Established standards): SNOMED CT concept IDs + LOINC observation codes
28
28
  Layer 2 (Cascade health vocabulary): health: namespace properties linking to Layer 1
@@ -30,6 +30,14 @@
30
30
  rdfs:seeAlso <https://cascadeprotocol.org/docs/health/v1/> .
31
31
 
32
32
  # Changelog:
33
+ # v2.3 (2026-02-28): BUG-006 — Added 6 Pattern A flat-property vocabulary terms
34
+ # for VitalSignReading blank nodes: health:value (generic numeric value),
35
+ # health:date (observation timestamp), health:sdnn (HRV SDNN measurement),
36
+ # health:systolic and health:diastolic (blood pressure components),
37
+ # health:walkingSteadinessLevel (enum ObjectProperty). Also added
38
+ # health:WalkingSteadinessUnknown individual. These replace the Pattern B
39
+ # fhir:Observation nesting in HealthProfileSerializer.
40
+ #
33
41
  # v2.2 (2026-02-17): Added 2 container linking ObjectProperties:
34
42
  # health:hasHRVStatistics, health:hasBPStatistics. These link a wellness
35
43
  # profile or intake form to its statistical summary nodes. Previously dark
@@ -201,7 +209,8 @@ health:walkingSteadiness a owl:DatatypeProperty ;
201
209
  health:snomedCode sct:364832000 ; # Balance finding
202
210
  rdfs:comment "SNOMED mapping note: 364832000 (Balance finding) is the closest available concept. Alternatives considered: 250043000 (Gait finding), 282097004 (Ability to walk). Apple's OK/Low/Very Low classification is proprietary."@en .
203
211
 
204
- # Valid values for walkingSteadiness
212
+ # Valid values for walkingSteadiness (legacy named individuals)
213
+ # health:WalkingSteadinessUnknown also defined in Pattern A section (v2.3)
205
214
  health:WalkingSteadinessOK a health:WalkingSteadinessLevel ;
206
215
  rdfs:label "OK" .
207
216
  health:WalkingSteadinessLow a health:WalkingSteadinessLevel ;
@@ -543,6 +552,56 @@ health:trendPolarity a owl:AnnotationProperty ;
543
552
  rdfs:label "Trend Polarity"@en ;
544
553
  rdfs:comment "Whether an increase in this metric is generally favorable ('higher_is_better'), unfavorable ('lower_is_better'), or context-dependent ('neutral'). Used by presentation layers to determine trend arrow color semantics. This is a general heuristic — individual clinical context may differ."@en .
545
554
 
555
+ # ============================================================================
556
+ # Pattern A Flat Observation Properties (v2.3 — BUG-006)
557
+ # ============================================================================
558
+ # These properties are used in Pattern A flat blank nodes emitted by
559
+ # HealthProfileSerializer. They replace the fhir:Observation nesting
560
+ # (Pattern B) for all wellness vital sign readings.
561
+
562
+ health:value a owl:DatatypeProperty ;
563
+ rdfs:label "Observation Value"@en ;
564
+ rdfs:comment "Generic numeric value for a wellness observation blank node. Used in Pattern A flat serialization where the observation type is identified by the enclosing property (e.g., health:restingHeartRate). The unit is carried by health:unit on the same blank node."@en ;
565
+ rdfs:range xsd:double .
566
+
567
+ health:date a owl:DatatypeProperty ;
568
+ rdfs:label "Observation Date"@en ;
569
+ rdfs:comment "Timestamp of a wellness observation in Pattern A flat serialization. Equivalent in role to fhir:effectiveDateTime but scoped to health: namespace blank nodes."@en ;
570
+ rdfs:range xsd:dateTime .
571
+
572
+ health:sdnn a owl:DatatypeProperty ;
573
+ rdfs:label "SDNN (HRV)"@en ;
574
+ rdfs:comment "Standard deviation of normal-to-normal R-R intervals. The primary HRV scalar emitted in Pattern A HRVReading blank nodes."@en ;
575
+ rdfs:range xsd:double ;
576
+ health:snomedCode sct:80404004 ;
577
+ health:loincCode loinc:80404-7 ;
578
+ health:unit "ms" .
579
+
580
+ health:systolic a owl:DatatypeProperty ;
581
+ rdfs:label "Systolic Blood Pressure (reading)"@en ;
582
+ rdfs:comment "Systolic component value in a Pattern A BloodPressureReading blank node. Distinct from health:systolicBP which is a domain-level property on fhir:Observation."@en ;
583
+ rdfs:range xsd:double ;
584
+ health:snomedCode sct:271649006 ;
585
+ health:loincCode loinc:8480-6 ;
586
+ health:unit "mmHg" .
587
+
588
+ health:diastolic a owl:DatatypeProperty ;
589
+ rdfs:label "Diastolic Blood Pressure (reading)"@en ;
590
+ rdfs:comment "Diastolic component value in a Pattern A BloodPressureReading blank node. Distinct from health:diastolicBP which is a domain-level property on fhir:Observation."@en ;
591
+ rdfs:range xsd:double ;
592
+ health:snomedCode sct:271650006 ;
593
+ health:loincCode loinc:8462-4 ;
594
+ health:unit "mmHg" .
595
+
596
+ health:walkingSteadinessLevel a owl:ObjectProperty ;
597
+ rdfs:label "Walking Steadiness Level"@en ;
598
+ rdfs:comment "Links a Pattern A WalkingSteadiness blank node to its level individual (health:WalkingSteadinessOK, health:WalkingSteadinessLow, health:WalkingSteadinessVeryLow, health:WalkingSteadinessUnknown)."@en ;
599
+ rdfs:range health:WalkingSteadinessLevel .
600
+
601
+ # health:WalkingSteadinessUnknown added v2.3 (previously only OK/Low/VeryLow defined)
602
+ health:WalkingSteadinessUnknown a health:WalkingSteadinessLevel ;
603
+ rdfs:label "Unknown" .
604
+
546
605
  # ============================================================================
547
606
  # VO2 Max Statistics Properties (v1.7)
548
607
  # ============================================================================
@@ -837,6 +896,16 @@ health:hasBPStatistics a owl:ObjectProperty ;
837
896
  rdfs:comment "Links a wellness profile to its blood pressure statistical summary."@en ;
838
897
  rdfs:range health:BPStatistics .
839
898
 
899
+ # Named individuals for walkingSteadinessLevel (Pattern A short-form, v2.3)
900
+ health:OK a health:WalkingSteadinessLevel ;
901
+ rdfs:label "OK" .
902
+ health:Low a health:WalkingSteadinessLevel ;
903
+ rdfs:label "Low" .
904
+ health:VeryLow a health:WalkingSteadinessLevel ;
905
+ rdfs:label "Very Low" .
906
+ health:Unknown a health:WalkingSteadinessLevel ;
907
+ rdfs:label "Unknown" .
908
+
840
909
  # ============================================================================
841
910
  # Standard Code Reference Table (for documentation)
842
911
  # ============================================================================
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@the-cascade-protocol/cli",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "Cascade Protocol CLI - Validate, convert, and manage health data",
5
5
  "bin": {
6
6
  "cascade": "dist/index.js"