<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Christopher Gainus</title>
    <description>The latest articles on DEV Community by Christopher Gainus (@christopher_gainus_84f002).</description>
    <link>https://dev.to/christopher_gainus_84f002</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4065576%2Fdeee812f-cd31-47e3-b74d-0502cce6093d.png</url>
      <title>DEV Community: Christopher Gainus</title>
      <link>https://dev.to/christopher_gainus_84f002</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/christopher_gainus_84f002"/>
    <language>en</language>
    <item>
      <title>Migrating a Healthcare BI Platform Without Breaking Clinical Reporting</title>
      <dc:creator>Christopher Gainus</dc:creator>
      <pubDate>Sun, 09 Aug 2026 13:29:30 +0000</pubDate>
      <link>https://dev.to/christopher_gainus_84f002/migrating-a-healthcare-bi-platform-without-breaking-clinical-reporting-5co7</link>
      <guid>https://dev.to/christopher_gainus_84f002/migrating-a-healthcare-bi-platform-without-breaking-clinical-reporting-5co7</guid>
      <description>&lt;p&gt;Every morning at a Medicare Advantage primary care organization, clinical leaders open dashboards. They check appointment fill rates, no-show trends, AWV completion progress, care gap closures, and panel coverage metrics. Those numbers drive the daily huddle. They decide which patients get called, which providers need support, and which clinics are behind.&lt;/p&gt;

&lt;p&gt;If those dashboards go down, even for a day, operations feels it immediately. Scheduling decisions get made on gut feel. Care gap outreach loses its targeting. The quality team flies blind.&lt;/p&gt;

&lt;p&gt;So when I decided to replace our legacy BI platform with a custom analytics platform, the constraint was not technical. It was operational. I had to migrate the entire reporting stack across five clinics, roughly 30 providers, and over a hundred daily users without a single day of reporting gaps.&lt;/p&gt;

&lt;p&gt;We completed the sunset with zero reporting gaps. Here is how.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Principle: Dual Run, Not Switch-Over
&lt;/h2&gt;

&lt;p&gt;The biggest mistake in BI migrations is the switch-over approach. You build the new platform, test it, pick a cutover date, and turn off the old one. In healthcare, that approach fails because you always discover something you missed after cutover. A dashboard that nobody mentioned but someone uses every Tuesday. A metric calculation that worked differently in the old platform. A filter that the clinical team depends on but never documented.&lt;/p&gt;

&lt;p&gt;I used dual run instead. Both platforms ran in parallel for the entire migration period. Every report that existed in the legacy platform had to exist in the new platform, produce the same numbers, and pass user validation before the legacy version was even eligible for sunset.&lt;/p&gt;

&lt;p&gt;This costs more in the short term. You are maintaining two platforms, two data pipelines, and answering questions from two sets of dashboards. But it eliminates the risk of discovering a missing report after you have already turned off the old system. In healthcare, that insurance is worth the cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting with the Metric Layer
&lt;/h2&gt;

&lt;p&gt;The reason most BI migrations produce different numbers is that the metric definitions live in the reporting layer. Each dashboard calculates the metric slightly differently. When you rebuild the dashboard in the new platform, you have to reverse-engineer the calculation, and you get it wrong.&lt;/p&gt;

&lt;p&gt;I solved this by moving metric definitions into a governed semantic layer before the migration. Instead of calculating "AWV completion rate" inside a Tableau workbook, the metric is defined once in a dbt semantic layer. The BI platform, whichever one it is, reads from that semantic layer. The calculation lives in one place.&lt;/p&gt;

&lt;p&gt;This means the migration was not about rebuilding calculations. It was about pointing the new platform at the same governed metric definitions. If the old platform and the new platform both read from the same semantic layer, they produce the same numbers. That is the whole game.&lt;/p&gt;

&lt;p&gt;The semantic layer has over 500 models. It includes governed metric registries, automated data contracts, and column-level definitions. When a KPI changes, the contracts, seeds, and metric views all update together. This prevents the silent breakage that happens when someone changes a definition in one place but not in the downstream reports.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration in Priority Order, Not All at Once
&lt;/h2&gt;

&lt;p&gt;I did not try to migrate everything simultaneously. I categorized every report by criticality and migrated in waves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wave 1: Operational spine.&lt;/strong&gt; The reports that clinical operations depends on every morning. Appointment fill rates, no-show rates, cadence metrics, next-visit projections, AWV completion. These went first because they had the highest validation priority and the most users depending on them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wave 2: Quality and care gap reporting.&lt;/strong&gt; HEDIS measures, care gap closures, quality metric performance. These are important but have different cadence. They are reviewed weekly or monthly, not daily. The slightly lower urgency gave more validation time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wave 3: Specialty and program dashboards.&lt;/strong&gt; Heart program monitoring, referral management, transitional care management. These are domain-specific and have smaller user bases, which means fewer validation cycles but also lower risk if timing slips.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wave 4: Ad hoc and legacy reports.&lt;/strong&gt; Reports that one person uses, or that have been superseded by better versions in the new platform. Many of these were retired rather than migrated.&lt;/p&gt;

&lt;p&gt;Each wave followed the same process: build in the new platform, validate against the old platform number-for-number, get user sign-off, then mark the old version for sunset.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embedded AI Dashboards
&lt;/h2&gt;

&lt;p&gt;One of the reasons for the migration was to move beyond static reporting into interactive, AI-assisted analytics. The new platform includes embedded AI/BI dashboards that let users ask questions in natural language and get answers grounded in the same governed metric layer.&lt;/p&gt;

&lt;p&gt;This is where the semantic layer pays off a second time. AI dashboards are only as good as the metric definitions they query. If the AI can ask "what is our AWV completion rate for the south clinic this month?" and get an answer grounded in the governed definition, the result is trustworthy. If it is calculating on the fly from raw tables, it will hallucinate.&lt;/p&gt;

&lt;p&gt;By front-loading the semantic layer migration, I gave the AI dashboards a solid foundation. The AI features were a benefit of the new platform, but they worked because the metric governance was already in place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Sunset: Proving Zero Gap
&lt;/h2&gt;

&lt;p&gt;The sunset itself was the final validation. I did not turn off the legacy platform until every user confirmed they were working exclusively in the new platform and every report had been validated.&lt;/p&gt;

&lt;p&gt;I tracked sunset eligibility per report. Each report had a status: building, validating, validated, sunset-ready, sunset. No report moved to sunset-ready until the user who owned it confirmed the numbers matched and the new version met their needs.&lt;/p&gt;

&lt;p&gt;The legacy platform was turned off only after every report was either sunset-ready, migrated, or intentionally retired. And even then, I kept the legacy data available for read-only historical comparison for a transition period, because someone always asks "what did this number look like last year in the old system?"&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Would Do Differently
&lt;/h2&gt;

&lt;p&gt;The migration worked, but there are things I would adjust:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Document the undocumented reports earlier.&lt;/strong&gt; Every organization has shadow reports that nobody officially owns but somebody uses. I found several of these late in the process. An earlier inventory would have caught them sooner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Involve the clinical users in validation sooner.&lt;/strong&gt; The IT team can validate that the numbers match, but only the clinical users can validate that the report is actually usable in their workflow. Number-matching is necessary but not sufficient.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Budget more time for the semantic layer.&lt;/strong&gt; It was the highest-value work in the migration, but it was also the most time-consuming. If you are planning a BI migration, start the semantic layer work before you think you need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;BI migrations in healthcare fail when they are treated as technology swaps. They succeed when they are treated as metric governance projects with a technology component. The new platform is the visible deliverable, but the semantic layer is what makes it work.&lt;/p&gt;

&lt;p&gt;Build the governed metric layer first. Dual-run both platforms. Migrate in priority waves. Validate with the users who actually depend on the reports. And do not turn off the old system until you can prove there are zero gaps.&lt;/p&gt;

&lt;p&gt;In healthcare, clinical operations does not have time for you to figure out the reporting after cutover. Get it right before you make the switch. The dual-run approach costs more upfront. It saves you from the one thing you cannot afford: a clinical team making decisions on missing or wrong data.&lt;/p&gt;

</description>
      <category>healthcare</category>
      <category>data</category>
      <category>migration</category>
      <category>bi</category>
    </item>
    <item>
      <title>Catching Vendor Access Risk Before It Becomes a HIPAA Finding: SIEM Detection for Healthcare Tenants</title>
      <dc:creator>Christopher Gainus</dc:creator>
      <pubDate>Sun, 09 Aug 2026 13:29:24 +0000</pubDate>
      <link>https://dev.to/christopher_gainus_84f002/catching-vendor-access-risk-before-it-becomes-a-hipaa-finding-siem-detection-for-healthcare-tenants-4fbg</link>
      <guid>https://dev.to/christopher_gainus_84f002/catching-vendor-access-risk-before-it-becomes-a-hipaa-finding-siem-detection-for-healthcare-tenants-4fbg</guid>
      <description>&lt;p&gt;I got an alert on a Saturday. A Cloud Solution Provider technician based in Canada had assigned Owner-level permissions at the subscription scope to a foreign-tenant group in our Azure environment. The activity itself was legitimate break-fix work. The access pattern was not.&lt;/p&gt;

&lt;p&gt;Standing Owner-at-subscription access for a vendor principal violates the HIPAA Security Rule's minimum-necessary standard. It also creates an attribution problem: when a shared foreign-group principal performs an action in your tenant, you cannot tie that action to a specific individual without the vendor's cooperation. If their tenant is compromised, the attacker has the same standing access as their technicians.&lt;/p&gt;

&lt;p&gt;This is not a hypothetical risk. It is the daily reality of running a healthcare cloud environment with vendor partnerships. CSP partners, managed service providers, and SaaS vendors all need some level of access to your tenant. The question is not whether to allow it. The question is how to detect when that access exceeds what is necessary and how to tighten it before an auditor finds it for you.&lt;/p&gt;

&lt;p&gt;I built a detection pattern in Elastic SIEM that does this. Here is what it looks like.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Vendor Access
&lt;/h2&gt;

&lt;p&gt;Most healthcare organizations have at least one CSP partner managing licensing, billing, or infrastructure in their Microsoft tenant. The traditional access model is DAP, Delegated Access Privileges, which grants the partner tenant broad administrative access. The partner's technicians authenticate through their own tenant and operate under a shared group principal in your environment.&lt;/p&gt;

&lt;p&gt;This creates three specific problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Over-privileged access.&lt;/strong&gt; A technician who needs to reset a license does not need Owner-level access to the entire subscription. But DAP gives standing access at whatever scope was initially configured, and that scope tends to be broad because nobody wants to file a ticket every time a vendor needs to do something.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attribution gaps.&lt;/strong&gt; When actions are performed through a foreign-group principal, your audit trail stops at the group level. You can see that "ForeignGroup" assigned a role, but you cannot see which human being in the partner organization performed the action. HIPAA Security Rule 164.312(a)(2)(i) requires unique user identification. A shared group principal does not satisfy that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blast radius.&lt;/strong&gt; If the partner's tenant is compromised, the attacker inherits whatever standing access the partner has in your environment. Broad DAP access means a compromise of a vendor tenant becomes a compromise of your production resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Detection Pattern
&lt;/h2&gt;

&lt;p&gt;The first thing I did was build a detection rule in Elastic SIEM scoped specifically to foreign-group and B2B guest write operations in the production resource group. This is tighter than the generic Azure RBAC rule that Microsoft ships. The generic rule fires on any role assignment change, which creates noise from legitimate administrative activity. My rule fires only when a foreign-tenant principal performs a write operation in the resource group that holds PHI-bearing workloads.&lt;/p&gt;

&lt;p&gt;The rule triggers on three signals:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Role assignment changes by CSP technicians.&lt;/strong&gt; When a partner technician assigns an administrative role, especially at subscription scope, the alert fires. The severity is based on the role assigned. Owner at subscription scope is high. Contributor at resource-group scope is medium. Reader is informational.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service principal creation by partner technicians.&lt;/strong&gt; CSP partners sometimes create service principals to automate their work. A service principal with broad Graph API permissions is a persistent access path that survives outside the partner's interactive session. Every new SP gets flagged for review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-tenant access from new geographies.&lt;/strong&gt; If a partner technician signs in from an IP range that does not match their usual location, the alert fires. This catches both compromised credentials and unauthorized outsourcing of work to contractors the vendor has not disclosed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens When the Alert Fires
&lt;/h2&gt;

&lt;p&gt;When the detection rule triggers, the alert lands in Elastic with the full context: which principal, what action, what scope, what IP, what timestamp. From there, the workflow is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Triage.&lt;/strong&gt; Is this expected partner activity? Most of the time, yes. A technician is doing legitimate work. But the alert documents it, which is the point. In a HIPAA audit, you need to show that you are monitoring vendor access and that you have a process for reviewing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope assessment.&lt;/strong&gt; If the access is broader than necessary, it gets tightened. I migrate the partner from standing DAP access to GDAP, Granular Delegated Admin Privileges, with least-privilege roles scoped to the smallest resource group possible, with a maximum duration and an approval workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Permission audit.&lt;/strong&gt; I enumerate every role assignment and every resource held by the foreign-group principal. Anything that is not justified gets removed. For service principals, I document the Graph API permission set and revoke anything that is not essential.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conditional Access enforcement.&lt;/strong&gt; I require MFA and named-location conditions for all CSP-partner sign-ins. No exceptions. If the vendor cannot meet those requirements, they do not get interactive access.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cross-Tenant Audit Pipeline
&lt;/h2&gt;

&lt;p&gt;Detection is only useful if the logs are flowing. One of the first things I verify after deploying a new detection rule is that the relevant log source is reaching Elastic.&lt;/p&gt;

&lt;p&gt;For vendor access monitoring, that means Entra ID cross-tenant access activity logs. These logs capture when a B2B guest or foreign-group principal performs an action in your tenant. I run a sample query after deployment to confirm that partner events are showing up. If the pipe is broken, the detection rule is useless and I need to fix the ingestion before the rule means anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters Beyond One Alert
&lt;/h2&gt;

&lt;p&gt;That Saturday alert was not a security incident. It was a configuration drift. A partner technician needed to do work, used the access they had, and created a standing permission that exceeded what they needed. That happens constantly in cloud environments. It is not malicious. It is just how people work when the path of least resistance is a broad permission scope.&lt;/p&gt;

&lt;p&gt;The detection pattern catches that drift in real time instead of discovering it during an audit or after a breach. It creates a documented review trail for every vendor action in the production environment. And it gives you the ammunition to push vendors toward least-privilege models because you can show them exactly what access they are using and what they are not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;If you run a healthcare cloud environment with vendor partnerships, you need vendor access detection in your SIEM. The generic rules that cloud providers ship are not specific enough. You need rules scoped to your production resource groups, tuned to the access patterns of your specific partners, and backed by a log pipeline that you have verified is actually working.&lt;/p&gt;

&lt;p&gt;The HIPAA Security Rule does not care whether your vendor is the one who over-privileged themselves. It cares whether you knew about it and what you did to fix it. Build the detection. Verify the pipeline. Document the review. That is how you turn a vendor access risk into a routine operational practice instead of an audit finding.&lt;/p&gt;

</description>
      <category>healthcare</category>
      <category>security</category>
      <category>ai</category>
      <category>compliance</category>
    </item>
    <item>
      <title>AI Voice Agents for Patient Outreach: Closing Care Gaps at Scale Without Burning Out Your Staff</title>
      <dc:creator>Christopher Gainus</dc:creator>
      <pubDate>Sun, 09 Aug 2026 13:28:42 +0000</pubDate>
      <link>https://dev.to/christopher_gainus_84f002/ai-voice-agents-for-patient-outreach-closing-care-gaps-at-scale-without-burning-out-your-staff-4742</link>
      <guid>https://dev.to/christopher_gainus_84f002/ai-voice-agents-for-patient-outreach-closing-care-gaps-at-scale-without-burning-out-your-staff-4742</guid>
      <description>&lt;p&gt;A Medicare Advantage primary care organization with five clinics and roughly 30 providers has a permanent problem. There are always patients who are overdue for their annual wellness visit, patients who have fallen off their expected visit cadence, and patients with no next appointment on the books. At any given time, that list can run into the thousands.&lt;/p&gt;

&lt;p&gt;The traditional approach is to hand a spreadsheet to the patient experience team and say "start calling." That burns people out. It is also impossible to keep up with. You end up prioritizing by gut feel, calling the same patients repeatedly, and missing the ones who actually need outreach most urgently.&lt;/p&gt;

&lt;p&gt;I built a different system. It classifies every patient who needs outreach by urgency, routes them to either an AI voice agent or a human scheduler based on complexity, and tracks outcomes so we can measure what actually works. Here is how the triage layer works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Patient-Level Episode Engine
&lt;/h2&gt;

&lt;p&gt;The first problem is that a patient can appear on multiple lists at the same time. They might be overdue for an AWV, off their visit cadence, and have an open referral. If you treat those as separate outreach tasks, you end up calling the same patient three times in a week about three different things. That is a terrible patient experience and a waste of staff time.&lt;/p&gt;

&lt;p&gt;So I built a scheduling engine that collapses those categories into patient-level episodes. Instead of looking at individual care gaps, it looks at the whole patient. What is their current status? When was their last visit? What is their expected cadence? Do they have a next appointment?&lt;/p&gt;

&lt;p&gt;The engine classifies every patient episode into one of three urgency tiers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STAT.&lt;/strong&gt; The patient needs outreach immediately. This might be a patient with a time-sensitive clinical need, a care gap that is about to close for the measurement period, or someone who has been unreachable for an extended time and is at risk of disengaging entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Urgent.&lt;/strong&gt; The patient needs outreach soon but not today. This is typically a patient who is off their expected cadence and needs to be brought back in within the current cycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Routine.&lt;/strong&gt; The patient needs a standard outreach touch. Annual wellness visit reminders, cadence check-ins, general engagement.&lt;/p&gt;

&lt;p&gt;The classification runs in Salesforce. The data comes from the analytics platform, which computes visit cadence, AWV completion, referral status, and attribution from the data lakehouse. Salesforce is the action layer. The analytics platform is the intelligence layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Routing to AI or Human
&lt;/h2&gt;

&lt;p&gt;Once a patient episode is classified, the system routes it to the right channel. This is where the AI voice agent comes in.&lt;/p&gt;

&lt;p&gt;I use a multi-agent AI voice platform for outbound calling. The voice agent handles the routine and many urgent episodes. It calls the patient, confirms their identity, offers to schedule an appointment, and books it directly into the EHR scheduling system. If the patient has questions that go beyond scheduling, the call can be transferred to a human.&lt;/p&gt;

&lt;p&gt;The human scheduling team handles the STAT episodes and any complex cases. A patient who has been non-engaged for months, someone with a complicated referral situation, a patient who has previously refused scheduling. Those get a human call because they require judgment, empathy, and the ability to adapt the conversation in real time.&lt;/p&gt;

&lt;p&gt;This split is the key. The AI voice agent is not replacing the human team. It is clearing the routine volume so the humans can focus on the cases that actually need human attention. Before this system, the scheduling team was spending most of its day on routine reminder calls. Now those are automated, and the humans handle the work that requires a person.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Communication Rules
&lt;/h2&gt;

&lt;p&gt;Patient outreach in healthcare is not a free-for-all. There are rules, and getting them wrong creates compliance risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One communication per patient per week.&lt;/strong&gt; The outreach engine enforces this. If a patient has been contacted about one initiative this week, they do not get a second contact about a different initiative until next week. This respects the patient's time and keeps us compliant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority framework.&lt;/strong&gt; When multiple initiatives compete for the same patient, the priority framework decides which one goes first. High-acuity clinical needs take top priority. Annual wellness visits with a 60-day warning window come next. Then off-cadence outreach. Then routine engagement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consent and preference.&lt;/strong&gt; Every outreach respects the patient's communication preferences and consent status. The system checks consent before any contact attempt. If a patient has opted out of a channel, the system does not use it. Period.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Channel escalation.&lt;/strong&gt; The system tries the patient's preferred channel first. If that fails, it escalates to the next channel in the hierarchy. Portal message to SMS to email to phone call. The goal is to reach the patient, but to do it on their terms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-Scheduling as a Recovery Path
&lt;/h2&gt;

&lt;p&gt;One of the highest-impact additions was automated self-scheduling recovery. When a patient cancels an appointment and does not reschedule in the same interaction, the system automatically sends a self-scheduling link through their preferred communication channel. The link directs them to a scheduling workflow that limits options based on scheduling rules, shows only eligible providers and appointment types, and respects cadence-based scheduling logic.&lt;/p&gt;

&lt;p&gt;This sounds simple, but it addresses a real operational problem. Before this, a cancellation triggered a manual outreach workflow. A staff member would notice the cancellation, add the patient to a call list, attempt outreach, and hope to reach them. That process took days and lost appointments. The automated recovery path delivers the scheduling opportunity instantly, at the point of cancellation, when the patient is most likely to act on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring What Works
&lt;/h2&gt;

&lt;p&gt;The system tracks every contact attempt and outcome. Communication sent, delivery status, link engagement, appointment scheduled, appointment completed. It breaks outcomes down by channel, by clinic, by appointment type, and by initiative.&lt;/p&gt;

&lt;p&gt;It also tracks the comparison between AI and human scheduling. This is not about proving one is better than the other. It is about understanding which channel works for which type of patient and which type of episode. Some patients respond better to a human voice. Some prefer the efficiency of an AI agent that can book a slot in 90 seconds without putting them on hold. The data tells us where each channel adds the most value, and we adjust routing accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Patient outreach at scale is fundamentally a triage and routing problem. You need to know who needs outreach, how urgently, and through what channel. Then you need to execute consistently and measure the outcomes.&lt;/p&gt;

&lt;p&gt;AI voice agents are not a replacement for your patient experience team. They are a force multiplier. They handle the volume that would otherwise overwhelm your staff, and they do it with a consistency that humans physically cannot maintain over thousands of calls. But the triage layer, the classification, the routing rules, the compliance guardrails, those are where the real engineering work happens. The voice agent is just the last mile.&lt;/p&gt;

&lt;p&gt;If you are thinking about AI patient outreach, start with the triage engine. Get the classification right. Define your communication rules. Build the consent and preference checks. Then plug in the voice agent. The agent is the easy part. The architecture around it is what determines whether it actually works.&lt;/p&gt;

</description>
      <category>healthcare</category>
      <category>ai</category>
      <category>automation</category>
      <category>patients</category>
    </item>
    <item>
      <title>Autonomous Code Review in Healthcare: How AI Agents Ship PRs Without Breaking Production</title>
      <dc:creator>Christopher Gainus</dc:creator>
      <pubDate>Sun, 09 Aug 2026 13:28:39 +0000</pubDate>
      <link>https://dev.to/christopher_gainus_84f002/autonomous-code-review-in-healthcare-how-ai-agents-ship-prs-without-breaking-production-1c39</link>
      <guid>https://dev.to/christopher_gainus_84f002/autonomous-code-review-in-healthcare-how-ai-agents-ship-prs-without-breaking-production-1c39</guid>
      <description>&lt;p&gt;I run AI agents that write code for a healthcare data platform. They pick up tasks from the backlog, write the code, add tests, open a pull request, respond to automated code review findings, and push fixes until the PR is clean. Then they stop and wait for me to merge.&lt;/p&gt;

&lt;p&gt;That last sentence is the important one. The agents never merge their own work. No autonomous merge to the main branch. Ever.&lt;/p&gt;

&lt;p&gt;If you work in healthcare technology, you know why that matters. We operate under HIPAA, our data pipelines feed clinical dashboards, and a bad deploy can break the metrics that providers rely on during morning huddles. So the idea of an AI agent pushing code straight to production sounds insane. But the idea of an AI agent doing the repetitive 80% of development work and then handing off to a human for the final call? That is practical. And it is what I actually do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;I have an autonomous agent running on Hermes Agent. It works off a task queue. When it picks up a task, it follows the same workflow a human developer would:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pull latest from the default branch&lt;/li&gt;
&lt;li&gt;Create an &lt;code&gt;agent/*&lt;/code&gt; branch&lt;/li&gt;
&lt;li&gt;Write the code, keep the diff small and single-purpose&lt;/li&gt;
&lt;li&gt;Add or update tests&lt;/li&gt;
&lt;li&gt;Validate in a non-prod environment only&lt;/li&gt;
&lt;li&gt;Open the PR with a description that links the Jira issue, explains the change, and calls out the risk&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every one of those steps matters. The branch naming convention (&lt;code&gt;agent/*&lt;/code&gt;) is how I filter agent PRs from human PRs in the pipeline. The small-diff rule keeps reviews fast. The non-prod validation rule is non-negotiable because we are in a regulated environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Quality Gate
&lt;/h2&gt;

&lt;p&gt;This is where it gets interesting. I use CircleCI for continuous integration, and I added CodeAnt as an AI-assisted quality gate. CodeAnt reviews every PR automatically, whether it came from a human or an agent.&lt;/p&gt;

&lt;p&gt;The agent's job is to resolve every Critical and High finding from CodeAnt before it reports back to me. If CodeAnt flags a Medium or Low that is reasonable and does not expand scope, the agent fixes that too. The agent pushes fixes iteratively until the PR is clean.&lt;/p&gt;

&lt;p&gt;This creates a tight loop: the agent writes code, CodeAnt reviews it, the agent fixes what CodeAnt found, CodeAnt reviews again. Most of the time, by the time I look at the PR, the obvious problems are gone. I am reviewing the architecture decision, not catching missing null checks.&lt;/p&gt;

&lt;p&gt;I also run a contract ledger that validates specific changes. If someone removes a dbt model, renames a column, or changes a data contract, the ledger catches it and the CI gate fails. This matters because in healthcare data engineering, a renamed column can silently break a downstream clinical dashboard that nobody notices for three weeks. The contract ledger prevents that class of problem for both human and agent PRs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Human-in-the-Loop Is Not a Limitation
&lt;/h2&gt;

&lt;p&gt;People hear "human must approve merges" and think the system is not really autonomous. That is the wrong framing. The autonomy is in the execution. The human checkpoint is in the judgment.&lt;/p&gt;

&lt;p&gt;Think about what a human developer actually does in a healthcare shop. They spend time understanding the compliance context, checking whether a change touches PHI, making sure the data contracts are intact, and deciding whether the approach is right. The coding itself, the test writing, the linting, the back-and-forth on review comments, that is the time-consuming mechanical work. That is what the agent owns.&lt;/p&gt;

&lt;p&gt;The human owns the decision. The agent owns the delivery.&lt;/p&gt;

&lt;p&gt;This split also means I can give the agent work that would otherwise sit in the backlog for weeks because nobody has bandwidth. Test coverage improvements. Schema documentation. Incremental refactors. Bug fixes that are important but never urgent enough to prioritize. The agent clears that queue, and I review the output in minutes instead of spending hours writing the code myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hard Gates
&lt;/h2&gt;

&lt;p&gt;I defined hard rules for the agent that are non-negotiable. These are not soft preferences. They are the boundary of its autonomy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never modify production databases or schemas. Read-only against prod.&lt;/li&gt;
&lt;li&gt;Never expose PHI in code, tests, logs, commit messages, or PR descriptions.&lt;/li&gt;
&lt;li&gt;Never commit secrets.&lt;/li&gt;
&lt;li&gt;Never rewrite shared history or force-push to protected branches.&lt;/li&gt;
&lt;li&gt;Never grant or widen access permissions on its own.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else, the agent owns. The gates are the boundary, not a checklist that pauses every action. The agent makes reasonable decisions within those boundaries and only escalates when something hits a gate or genuinely needs my input.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Actually Looks Like in Practice
&lt;/h2&gt;

&lt;p&gt;On a typical day, I come in and there are one or two PRs waiting from the agent. I read the PR description, check that the tests pass, scan the diff for anything that touches PHI or data contracts, and either merge or leave a comment. The whole review takes five to fifteen minutes per PR.&lt;/p&gt;

&lt;p&gt;If CodeAnt still has unresolved findings, the PR is not ready and I do not look at it. The agent knows to resolve those first. If the change is too big or the approach is wrong, I close the PR and explain why. The agent picks up the next task.&lt;/p&gt;

&lt;p&gt;The result is that the engineering team ships more work without growing headcount. The agent handles the mechanical delivery. I handle the judgment calls. And nothing reaches production without a human making a deliberate decision to put it there.&lt;/p&gt;

&lt;p&gt;That is the model. Not autonomous merges. Autonomous delivery with human gates. In healthcare, that distinction is the whole game.&lt;/p&gt;

</description>
      <category>healthcare</category>
      <category>ai</category>
      <category>devops</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Salesforce Health Cloud Implementation: Real Costs and Timelines (2026)</title>
      <dc:creator>Christopher Gainus</dc:creator>
      <pubDate>Thu, 06 Aug 2026 16:55:14 +0000</pubDate>
      <link>https://dev.to/christopher_gainus_84f002/salesforce-health-cloud-implementation-real-costs-and-timelines-2026-48kb</link>
      <guid>https://dev.to/christopher_gainus_84f002/salesforce-health-cloud-implementation-real-costs-and-timelines-2026-48kb</guid>
      <description>&lt;p&gt;Salesforce Health Cloud costs between $250 and $500 per user per month in licensing alone. Add implementation, integration, and customization, and a 50-clinician deployment runs $200,000 to $600,000 over the first 18 months.&lt;/p&gt;

&lt;p&gt;I have scaled Health Cloud from 5 users to 250 in a Medicare Advantage primary care organization. Here's what drives the cost, where the money goes, and how to avoid the mistakes that inflate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you're paying for
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Salesforce licenses:&lt;/strong&gt; Health Cloud is an add-on to Sales Cloud or Service Cloud. You need the base license plus the Health Cloud add-on. Budget $250-$500/user/month depending on your Salesforce edition and negotiation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation labor:&lt;/strong&gt; This is where costs vary wildly. A straightforward Health Cloud deployment with standard objects and minimal integration runs $75,000-$150,000. A complex deployment with custom care coordination workflows, EHR integration, and Agentforce automation runs $250,000-$500,000.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration work:&lt;/strong&gt; Health Cloud doesn't replace your EHR. It sits alongside it. You need integration via FHIR R4 APIs, HL7 feeds, or middleware (MuleSoft is the Salesforce-preferred path, at additional cost). Integration is typically 30-40% of total implementation cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data migration and cleanup:&lt;/strong&gt; Moving patient data from legacy systems into Health Cloud requires deduplication, field mapping, and validation. Budget $25,000-$75,000 depending on data quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ongoing administration:&lt;/strong&gt; Salesforce needs a dedicated administrator. Whether that's a full-time employee ($90,000-$130,000/year) or a fractional arrangement depends on your org size.&lt;/p&gt;

&lt;h2&gt;
  
  
  What drives cost up
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Custom objects instead of standard ones.&lt;/strong&gt; Health Cloud ships with a data model designed for healthcare: patient profiles, care plans, care teams, assessments, clinical alerts. Organizations that build custom objects instead of using the standard model add 40-60% to their implementation cost and create upgrade headaches for years.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Underestimating data quality.&lt;/strong&gt; If your legacy system has duplicate patient records, incomplete insurance data, or inconsistent naming, those problems surface during migration. I've seen data cleanup consume 25% of a project budget because nobody scoped it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layering Agentforce before the basics work.&lt;/strong&gt; Salesforce's AI agent product is powerful but it's a layer on top of a functioning Health Cloud deployment. If your care coordination workflows aren't clean, Agentforce will surface the messiness, not fix it. Get the foundation working first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fixed-bid contracts on undefined scope.&lt;/strong&gt; If a systems integrator gives you a fixed price before understanding your org, they've priced in risk they don't understand. You'll either pay for their overestimation or eat their underestimation. A paid discovery phase ($10,000-$25,000) prevents both outcomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a realistic timeline looks like
&lt;/h2&gt;

&lt;p&gt;I tell clients to expect 4-9 months from kickoff to go-live for a mid-size deployment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weeks 1-4: Discovery, requirements, data model validation&lt;/li&gt;
&lt;li&gt;Weeks 5-12: Configuration, custom development, integration development&lt;/li&gt;
&lt;li&gt;Weeks 13-20: Integration testing, user acceptance testing, data migration&lt;/li&gt;
&lt;li&gt;Weeks 21-36: Training, pilot, staged rollout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyone promising go-live in under 4 months is either skipping discovery, skipping testing, or deploying out-of-the-box Health Cloud with zero customization. The last option is fine if that's what you need. The first two are not.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to control cost
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use the standard data model.&lt;/strong&gt; Salesforce designed Health Cloud's schema for healthcare workflows. Customize fields and page layouts, not the underlying structure. This keeps your implementation faster and your upgrade path clean.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run a paid discovery phase.&lt;/strong&gt; Spend $15,000-$25,000 to understand your integration surface, data quality, and workflow requirements before committing to a number. This sounds like added cost. It saves 2-3x its price in scope changes during implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prioritize integrations.&lt;/strong&gt; Not every integration needs to be live on day one. Phase your EHR integration, your analytics integration, and your patient portal. Get the clinical workflow working, then layer on the adjacent systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hire a Salesforce architect, not just a developer.&lt;/strong&gt; Architecture decisions made in the first three weeks of a project determine whether your implementation costs $150,000 or $400,000. An architect costs more per hour and saves more per project.&lt;/p&gt;

&lt;h2&gt;
  
  
  US implementation cost benchmarks
&lt;/h2&gt;

&lt;p&gt;Based on rates I see in the market for US-based Salesforce Health Cloud architects and consultants:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;US architect: $200-$300/hour&lt;/li&gt;
&lt;li&gt;US senior consultant: $150-$200/hour&lt;/li&gt;
&lt;li&gt;Offshore developer (through a US firm): $100-$150/hour&lt;/li&gt;
&lt;li&gt;Offshore developer (direct): $50-$90/hour&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rate differential between US and offshore is real, but healthcare implementations require someone who understands HIPAA, clinical workflows, and compliance. Offshore development can work for well-specified configuration tasks. It should not own your architecture decisions.&lt;/p&gt;




&lt;p&gt;If you're evaluating Health Cloud or in the middle of a deployment that's off track, that's the work I do. &lt;a href="https://pumatech.dev" rel="noopener noreferrer"&gt;PumaTech&lt;/a&gt; handles Salesforce Health Cloud consulting, implementation, and integration for healthcare organizations.&lt;/p&gt;

</description>
      <category>salesforce</category>
      <category>healthcare</category>
      <category>implementation</category>
      <category>cost</category>
    </item>
    <item>
      <title>What Is a Fractional CTO? (And When You Actually Need One)</title>
      <dc:creator>Christopher Gainus</dc:creator>
      <pubDate>Thu, 06 Aug 2026 16:48:12 +0000</pubDate>
      <link>https://dev.to/christopher_gainus_84f002/what-is-a-fractional-cto-and-when-you-actually-need-one-2caf</link>
      <guid>https://dev.to/christopher_gainus_84f002/what-is-a-fractional-cto-and-when-you-actually-need-one-2caf</guid>
      <description>&lt;p&gt;I take on a small number of fractional CTO clients through &lt;a href="https://pumatech.dev" rel="noopener noreferrer"&gt;PumaTech&lt;/a&gt;. If your organization needs hands-on technology leadership without a full-time hire, reach out.&lt;/p&gt;

</description>
      <category>cto</category>
      <category>leadership</category>
      <category>healthcare</category>
      <category>consulting</category>
    </item>
    <item>
      <title>Is AI HIPAA Compliant? A Practical Guide for Healthcare Organizations (2026)</title>
      <dc:creator>Christopher Gainus</dc:creator>
      <pubDate>Thu, 06 Aug 2026 16:47:27 +0000</pubDate>
      <link>https://dev.to/christopher_gainus_84f002/is-ai-hipaa-compliant-a-practical-guide-for-healthcare-organizations-2026-110f</link>
      <guid>https://dev.to/christopher_gainus_84f002/is-ai-hipaa-compliant-a-practical-guide-for-healthcare-organizations-2026-110f</guid>
      <description>

&lt;p&gt;When a clinic administrator asks "is ChatGPT HIPAA compliant?", the honest answer is no by default. Not because the technology can't handle it. Because compliance depends on configuration, contracts, and what data you feed it.&lt;/p&gt;

&lt;p&gt;I've spent the last three years building AI systems for a Medicare Advantage primary care organization. Here's what I've learned about which tools you can use with PHI, which ones require a BAA, and which ones will get you fined.&lt;/p&gt;

&lt;h2&gt;
  
  
  HIPAA compliance is not a property of software
&lt;/h2&gt;

&lt;p&gt;HIPAA doesn't certify products. It regulates how covered entities handle protected health information. A tool is "HIPAA compliant" when:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You have a signed Business Associate Agreement (BAA) with the vendor&lt;/li&gt;
&lt;li&gt;The vendor agrees to safeguard PHI per HIPAA Security Rule requirements&lt;/li&gt;
&lt;li&gt;You configure the tool to not retain or train on your data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A product can have every security certification in the industry and still produce a HIPAA violation if your staff paste patient names into it without a BAA in place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which AI tools have signed BAAs (as of 2026)
&lt;/h2&gt;

&lt;p&gt;I'll be specific here because vague answers are what get clinics in trouble.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microsoft Azure OpenAI:&lt;/strong&gt; Yes. Microsoft offers a BAA through their Online Services Terms. Azure OpenAI does not train on your data by default. This is the most common path I see for healthcare organizations that want GPT-4 class models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Cloud Vertex AI (Gemini):&lt;/strong&gt; Yes. Google Cloud offers a BAA and will sign one for Vertex AI. Gemini data is not used for training when accessed through Vertex AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anthropic Claude (via AWS Bedrock):&lt;/strong&gt; Yes. AWS offers a BAA for Bedrock. Claude models accessed through Bedrock are covered. Claude accessed through the consumer website is not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenAI ChatGPT:&lt;/strong&gt; Not by default. The consumer ChatGPT product does not have a BAA. OpenAI does not offer a BAA for ChatGPT as of mid-2026. If you need GPT-4 for healthcare work, use Azure OpenAI instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Otter.ai:&lt;/strong&gt; No BAA available. People search for this constantly (110 searches/month for "is Otter AI HIPAA compliant"). The answer is no. Do not use Otter for meetings where PHI is discussed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fireflies.ai:&lt;/strong&gt; No BAA available. Same situation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plaud.ai:&lt;/strong&gt; No BAA available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fathom:&lt;/strong&gt; No BAA available as of mid-2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Granola:&lt;/strong&gt; No BAA available.&lt;/p&gt;

&lt;p&gt;The pattern: note-taking and transcription AI tools almost universally lack BAAs. This is a gap in the market, and it's why clinics keep asking.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to deploy AI with PHI safely
&lt;/h2&gt;

&lt;p&gt;The architecture I use in production:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1: Azure OpenAI with a BAA.&lt;/strong&gt; Route API calls through a backend proxy that strips identifiers before sending prompts. Configure Azure to disable data retention and training. Monitor usage logs for PHI leakage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2: Private LLM deployment.&lt;/strong&gt; Run an open-weights model (Llama, Mistral) on infrastructure you control. No data leaves your network. No BAA needed because no third party processes the data. The tradeoff is higher operational cost and you need someone who can manage the infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 3: LiteLLM routing to HIPAA-covered endpoints.&lt;/strong&gt; Use LiteLLM as an API gateway that routes requests to Azure OpenAI or AWS Bedrock (both BAA-covered). LiteLLM handles the routing, rate limiting, and fallback. Your application talks to one endpoint. The data stays within BAA-covered infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually gets clinics fined
&lt;/h2&gt;

&lt;p&gt;It's almost never the AI tool. It's the workflow.&lt;/p&gt;

&lt;p&gt;A clinician pastes a patient's medication list into ChatGPT to check for interactions. That's a PHI disclosure to a vendor without a BAA. The tool didn't fail. The process did.&lt;/p&gt;

&lt;p&gt;I've seen this happen at organizations with otherwise strong compliance programs. The fix is not better AI. It's blocking access to non-BAA AI tools on work devices, providing a sanctioned alternative (Azure OpenAI proxy), and training staff on what they can and cannot type into an AI prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions I get asked most
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Can I use Claude for clinical notes?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Through the consumer website, no. Through AWS Bedrock with a BAA, yes. The model is the same. The compliance posture is entirely different.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Is Gemini HIPAA compliant?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Through Google Cloud Vertex AI with a BAA, yes. Through gemini.google.com, no. 20 people per month search this exact question. The distinction matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Do we need an AI governance committee?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not a formal one on day one. But you need a named owner, a written policy on approved tools, and a vendor evaluation checklist that covers BAA terms, data retention, subprocessor disclosures, and breach notification windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;The question isn't whether AI is HIPAA compliant. It's whether your deployment of it is. Microsoft, Google, and AWS all offer BAA-covered AI services that can handle PHI. The consumer tools you've heard of (ChatGPT, Otter, Fireflies) do not.&lt;/p&gt;

&lt;p&gt;If you're a healthcare organization figuring out which AI tools you can actually use, that's the work I do. &lt;a href="https://pumatech.dev" rel="noopener noreferrer"&gt;PumaTech&lt;/a&gt; builds and deploys HIPAA-compliant AI systems, data platforms, and Salesforce Health Cloud integrations for healthcare organizations.&lt;/p&gt;

</description>
      <category>healthcare</category>
      <category>ai</category>
      <category>hipaa</category>
      <category>compliance</category>
    </item>
  </channel>
</rss>
