Triage Report

Healthcare Sentinel

55,500 patient records across 5 datasets (222,000 rows scanned).
Here's what I found.

August 11, 2026 at 03:40 AM • gemini-2.5-pro
Healthcare Sentinel1
6

issues found.

4
Critical
2
High
0
Medium
0
Low
Healthcare Sentinel2
CRITICAL

Missing patient names

Inability to identify patients can lead to wrong medication, procedures, or billing.

raw_patients.name 555 rows
raw_patientsstaging_patients
Healthcare Sentinel3
CRITICAL

Invalid patient ages

Incorrect age can lead to misdiagnosis, incorrect treatment, or wrong medication dosage.

raw_patients.age 832 rows
raw_patientsstaging_patientsmart_demographics
Healthcare Sentinel4
CRITICAL

Discharge date before admission date

Chronological errors invalidate clinical pathways and corrupt length-of-stay calculations.

raw_patients.discharge_date 277 rows
raw_patientsstaging_patients
Healthcare Sentinel5
CRITICAL

The `date_of_admission` and `discharge_date` columns in `ra…

Storing dates as TEXT can lead to incorrect chronological sorting and calculation errors, especially for length-of-stay.

raw_patients.date_of_admission, discharge_date 55,500 rows
Healthcare Sentinel6
HIGH

Negative billing amounts

Incorrect billing can cause financial distress for patients and legal issues for the hospital.

raw_patients.billing_amount 1,215 rows
raw_patientsstaging_patientsmart_billing
Healthcare Sentinel7
HIGH

Negative length of stay

Corrupts length-of-stay calculations used for resource planning and billing.

mart_billing.length_of_stay_days 277 rows
Healthcare Sentinel8
Write-Back

I tagged these in DataHub.

The next person sees my warnings.

Traw_patients,PROD) → ['urn:li:tag:data-quality-issues', 'urn:li:tag:clinical-severity-CRITICAL']
Tstaging_patients,PROD) → ['urn:li:tag:data-quality-issues', 'urn:li:tag:clinical-severity-HIGH', 'urn:li:tag:upstream-contamination']
D<!-- sentinel:start --> ## 🚨 CRITICAL DATA QUALITY ISSUES DETECTED This dataset
D<!-- sentinel:start --> ## ⚠️ HIGH SEVERITY: UPSTREAM DATA CONTAMINATION This da
D<!-- sentinel:start --> ## ⚠️ HIGH SEVERITY: UPSTREAM DATA CONTAMINATION This da
D<!-- sentinel:start --> ## ⚠️ HIGH SEVERITY: UPSTREAM DATA CONTAMINATION This da
Healthcare Sentinel
How I Worked

119 tool calls. Autonomous.

search_documentsRecall: Sentinel Learnings
searchSearch DataHub catalog
run_sqlSELECT name FROM sqlite_master WHERE type='table'
searchSearch DataHub catalog
searchSearch DataHub catalog
searchSearch DataHub catalog
searchSearch DataHub catalog
list_schema_fieldsRead schema: raw_patients
list_schema_fieldsRead schema: staging_patients
list_schema_fieldsRead schema: mart_demographics
list_schema_fieldsRead schema: mart_billing
run_sqlSELECT COUNT(*) FROM raw_patients WHERE name IS NULL OR name = ''
run_sqlSELECT COUNT(*) FROM raw_patients WHERE CAST(age AS INTEGER) < 0 OR CAST(age AS INTEGER) > 120
run_sqlSELECT age, typeof(age) FROM raw_patients LIMIT 3
run_sqlSELECT COUNT(*) FROM raw_patients WHERE CAST(billing_amount AS REAL) < 0
run_sqlSELECT billing_amount, typeof(billing_amount) FROM raw_patients LIMIT 3
run_sqlSELECT COUNT(*) FROM raw_patients WHERE julianday(discharge_date) < julianday(date_of_admission)
run_sqlSELECT date_of_admission, discharge_date FROM raw_patients WHERE julianday(discharge_date) < julianday(date_of_admission) LIMIT 3
run_sqlSELECT COUNT(*) FROM staging_patients WHERE name IS NULL OR name = ''
run_sqlSELECT COUNT(*) FROM staging_patients WHERE CAST(age AS INTEGER) < 0 OR CAST(age AS INTEGER) > 120
run_sqlSELECT COUNT(*) FROM staging_patients WHERE CAST(billing_amount AS REAL) < 0
run_sqlSELECT COUNT(*) FROM staging_patients WHERE julianday(discharge_date) < julianday(date_of_admission)
run_sqlSELECT COUNT(*) FROM mart_demographics WHERE age < 0 OR age > 120
run_sqlSELECT age FROM mart_demographics WHERE age < 0 OR age > 120 LIMIT 3
run_sqlSELECT COUNT(*) FROM mart_billing WHERE billing_amount < 0
run_sqlSELECT billing_amount FROM mart_billing WHERE billing_amount < 0 LIMIT 3
run_sqlSELECT COUNT(*) FROM mart_billing WHERE length_of_stay_days < 0
run_sqlSELECT length_of_stay_days FROM mart_billing WHERE length_of_stay_days < 0 LIMIT 3
get_lineageTrace lineage: raw_patients
report_finding{&quot;check_name&quot;: &quot;missing_patient_name&quot;, &quot;recommendation&quot;: &quot;Qu
get_lineageTrace lineage: staging_patients
run_sqlSELECT name FROM raw_patients WHERE name IS NULL OR name = '' LIMIT 3
report_finding{&quot;table&quot;: &quot;staging_patients&quot;, &quot;affected_rows&quot;: 555, &quot;descrip
run_sqlSELECT name FROM staging_patients WHERE name IS NULL OR name = '' LIMIT 3
report_finding{&quot;recommendation&quot;: &quot;Correct invalid age values to NULL for r
run_sqlSELECT age, medical_condition FROM raw_patients WHERE CAST(age AS INTEGER) < 0 OR CAST(age AS INTEGER) > 120 LIMIT 3
report_finding{&quot;recommendation&quot;: &quot;Rebuild from corrected source table.&quot;, &quot;
report_finding{&quot;description&quot;: &quot;Invalid patient ages in downstream table&quot;,
run_sqlSELECT age, medical_condition FROM staging_patients WHERE CAST(age AS INTEGER) < 0 OR CAST(age AS INTEGER) > 120 LIMIT 3
run_sqlSELECT age, medical_condition FROM mart_demographics WHERE age < 0 OR age > 120 LIMIT 3
report_finding{&quot;check_name&quot;: &quot;negative_billing_amount&quot;, &quot;table&quot;: &quot;raw_pati
run_sqlSELECT billing_amount, insurance_provider FROM raw_patients WHERE CAST(billing_amount AS REAL) < 0 LIMIT 3
report_finding{&quot;severity&quot;: &quot;HIGH&quot;, &quot;table&quot;: &quot;staging_patients&quot;, &quot;recommend
report_finding{&quot;column&quot;: &quot;billing_amount&quot;, &quot;table&quot;: &quot;mart_billing&quot;, &quot;check
run_sqlSELECT billing_amount, insurance_provider FROM staging_patients WHERE CAST(billing_amount AS REAL) < 0 LIMIT 3
run_sqlSELECT billing_amount, insurance_provider FROM mart_billing WHERE billing_amount < 0 LIMIT 3
report_finding{&quot;affected_rows&quot;: 277, &quot;table&quot;: &quot;raw_patients&quot;, &quot;severity&quot;:
run_sqlSELECT date_of_admission, discharge_date FROM raw_patients WHERE julianday(discharge_date) < julianday(date_of_admission) LIMIT 3
report_finding{&quot;affected_rows&quot;: 277, &quot;recommendation&quot;: &quot;Rebuild from corre
report_finding{&quot;clinical_impact&quot;: &quot;Corrupts length-of-stay calculations us
run_sqlSELECT date_of_admission, discharge_date FROM staging_patients WHERE julianday(discharge_date) < julianday(date_of_admission) LIMIT 3
run_sqlSELECT length_of_stay_days FROM mart_billing WHERE length_of_stay_days < 0 LIMIT 3
add_tagsTag 1 datasets
add_tagsTag 3 datasets
update_descriptionUpdate description: raw_patients
update_descriptionUpdate description: staging_patients
update_descriptionUpdate description: mart_demographics
update_descriptionUpdate description: mart_billing
apply_fixquarantine on raw_patients
apply_fixcorrect on raw_patients
apply_fixcorrect on raw_patients
apply_fixcorrect on raw_patients
HUMAN_APPROVALapply_fix β€” approved
HUMAN_APPROVALapply_fix β€” approved
HUMAN_APPROVALapply_fix β€” approved
HUMAN_APPROVALapply_fix β€” approved
apply_fixquarantine on raw_patients
apply_fixcorrect on raw_patients
apply_fixcorrect on raw_patients
apply_fixcorrect on raw_patients
HUMAN_APPROVALapply_fix β€” approved
HUMAN_APPROVALapply_fix β€” approved
HUMAN_APPROVALapply_fix β€” approved
HUMAN_APPROVALapply_fix β€” approved
save_documentSave: Sentinel Learnings
save_documentSave: Sentinel Triage Report
run_sqlSELECT name FROM raw_patients WHERE name IS NULL OR name = '' LIMIT 3
run_sqlSELECT age, medical_condition FROM raw_patients WHERE CAST(age AS INTEGER) < 0 OR CAST(age AS INTEGER) > 120 LIMIT 3
run_sqlSELECT billing_amount, insurance_provider FROM raw_patients WHERE CAST(billing_amount AS REAL) < 0 LIMIT 3
run_sqlSELECT date_of_admission, discharge_date FROM raw_patients WHERE julianday(discharge_date) < julianday(date_of_admission) LIMIT 3
run_sqlSELECT name FROM staging_patients WHERE name IS NULL OR name = '' LIMIT 3
run_sqlSELECT age, medical_condition FROM staging_patients WHERE CAST(age AS INTEGER) < 0 OR CAST(age AS INTEGER) > 120 LIMIT 3
run_sqlSELECT billing_amount, insurance_provider FROM staging_patients WHERE CAST(billing_amount AS REAL) < 0 LIMIT 3
run_sqlSELECT date_of_admission, discharge_date FROM staging_patients WHERE julianday(discharge_date) < julianday(date_of_admission) LIMIT 3
run_sqlSELECT age, medical_condition FROM mart_demographics WHERE age < 0 OR age > 120 LIMIT 3
run_sqlSELECT billing_amount, insurance_provider FROM mart_billing WHERE billing_amount < 0 LIMIT 3
run_sqlSELECT length_of_stay_days FROM mart_billing WHERE length_of_stay_days < 0 LIMIT 3
run_sqlSELECT COUNT(*) FROM raw_patients WHERE name IS NULL OR name = ''
run_sqlSELECT COUNT(*) FROM raw_patients WHERE age < 0
run_sqlSELECT COUNT(*) FROM raw_patients WHERE billing_amount < 0
run_sqlSELECT COUNT(*) FROM raw_patients WHERE discharge_date < admission_date
run_sqlSELECT COUNT(*) FROM mart_billing WHERE length_of_stay_days < 0
searchSearch DataHub catalog
list_schema_fieldsRead schema: raw_patients
run_sqlSELECT COUNT(*) FROM staging_patients WHERE name IS NULL OR name = ''
run_sqlSELECT COUNT(*) FROM staging_patients WHERE billing_amount < 0
run_sqlSELECT COUNT(*) FROM mart_billing WHERE billing_amount < 0
run_sqlSELECT COUNT(*) FROM raw_patients WHERE discharge_date < date_of_admission
run_sqlSELECT COUNT(*) FROM raw_patients WHERE age > 150
run_sqlSELECT typeof(age) FROM staging_patients LIMIT 1
run_sqlSELECT typeof(age) FROM mart_demographics LIMIT 1
run_sqlSELECT COUNT(*) FROM raw_patients WHERE CAST(age AS INTEGER) > 120
run_sqlSELECT COUNT(*) FROM staging_patients WHERE discharge_date < date_of_admission
report_finding{&quot;description&quot;: &quot;555 records in raw_patients have a null or
report_finding{&quot;clinical_impact&quot;: &quot;Incorrect billing can cause financial d
report_finding{&quot;affected_rows&quot;: 832, &quot;recommendation&quot;: &quot;Correct invalid ag
report_finding{&quot;clinical_impact&quot;: &quot;Chronological errors invalidate clinica
report_finding{&quot;clinical_impact&quot;: &quot;Corrupts key metrics for resource plann
run_sqlSELECT COUNT(*) FROM staging_patients WHERE CAST(age AS INTEGER) < 0 OR CAST(age AS INTEGER) > 120
run_sqlSELECT COUNT(*) FROM mart_demographics WHERE age < 0 OR age > 120
report_finding{&quot;recommendation&quot;: &quot;Change the column type of `age` in `raw_
run_sqlSELECT typeof(billing_amount), typeof(date_of_admission), typeof(discharge_date) FROM raw_patients LIMIT 1
run_sqlSELECT typeof(billing_amount), typeof(age) FROM mart_billing LIMIT 1
run_sqlSELECT typeof(length_of_stay_days) FROM mart_billing LIMIT 1
run_sqlSELECT DISTINCT gender FROM raw_patients
report_finding{&quot;description&quot;: &quot;The `billing_amount` column in `raw_patient
report_finding{&quot;column&quot;: &quot;date_of_admission, discharge_date&quot;, &quot;check_name&quot;
run_sqlSELECT typeof(billing_amount) FROM mart_billing LIMIT 1
run_sqlSELECT date_of_admission, discharge_date FROM raw_patients LIMIT 5
Healthcare Sentinel
Audit Trail

7 operations. 7 approved.

Every remediation logged with reviewer identity, device, and full SQL. Denied proposals tracked too.

APPROVED#7correctraw_patients0 rowsreviewer2026-08-11T03:37
APPROVED#6quarantineraw_patients1,110 rowsreviewer2026-08-11T03:37
APPROVED#5correctraw_patients0 rowsreviewer2026-08-11T03:37
APPROVED#4correctraw_patients0 rowsreviewer2026-08-11T03:37
APPROVED#3correctraw_patients1,215 rowsreviewer2026-08-11T03:37
APPROVED#2correctraw_patients277 rowsreviewer2026-08-11T03:37
APPROVED#1correctraw_patients832 rowsreviewer2026-08-11T03:37
python sentinel.py --history  •  --show N  •  --undo N

Healthcare Sentinel

Triage complete.

Healthcare Sentinel