# NemoClaw Agentic Workflows

> Orchestrating autonomous clinical AI with ReAct reasoning, HIPAA data boundaries, and network policy isolation

- **Category**: scaling-agentic-ai-healthcare-lakehouse

- **Canonical URL**: https://designpattern.fyi/scaling-agentic-ai-healthcare-lakehouse/nemoclaw-agentic-workflows/

---

## Description
Orchestrating autonomous clinical AI with ReAct reasoning, HIPAA data boundaries, and network policy isolation








## Additional Notes

# NemoClaw Agentic Workflows & PHI Security

Deploying agents in clinical environments requires isolating Protected Health Information (PHI) while permitting models to execute reasoning loops. NemoClaw combines foundation models with a ReAct orchestration layer to implement strict de-identification/re-identification boundaries.

<div id="hcp-dd-container">
<style>
#hcp-dd-container * { box-sizing: border-box; }
#hcp-dd-container .tab-bar { display: flex; border-bottom: 0.5px solid var(--border); margin-bottom: 1.5rem; }
#hcp-dd-container .tb { padding: 9px 15px; font-size: 13px; color: var(--text-secondary); background: none; border: none; border-bottom: 2.5px solid transparent; cursor: pointer; font-family: var(--font-sans); margin-bottom: -1px; transition: color .15s; }
#hcp-dd-container .tb.on { color: var(--text-primary); font-weight: 500; border-bottom-color: var(--text-primary); }
#hcp-dd-container .tb:hover:not(.on) { color: var(--text-primary); }
#hcp-dd-container .pnl { display: none; }
#hcp-dd-container .pnl.on { display: block; }
#hcp-dd-container .ch { font-size: 11px; padding: 3px 8px; border-radius: 20px; border: 0.5px solid; display: inline-block; }
#hcp-dd-container .pu { background: rgba(127,119,221,0.15); border-color: rgba(127,119,221,0.4); color: #8b5cf6; }
#hcp-dd-container .bl { background: rgba(55,138,221,0.15); border-color: rgba(55,138,221,0.4); color: #3b82f6; }
#hcp-dd-container .te { background: rgba(29,158,117,0.15); border-color: rgba(29,158,117,0.4); color: #10b981; }
#hcp-dd-container .gy { background: var(--surface-0); border-color: var(--border-strong); color: var(--text-secondary); }
#hcp-dd-container .am { background: rgba(186,117,23,0.15); border-color: rgba(186,117,23,0.4); color: #f59e0b; }
#hcp-dd-container .co { background: rgba(216,90,48,0.15); border-color: rgba(216,90,48,0.4); color: #f97316; }
#hcp-dd-container .gn { background: rgba(99,153,34,0.15); border-color: rgba(99,153,34,0.4); color: #84cc16; }
#hcp-dd-container .rd { background: rgba(252,235,235,0.15); border-color: rgba(240,149,149,0.4); color: #ef4444; }
#hcp-dd-container .sh { font-size: 12px; font-weight: 500; color: var(--text-muted); margin: 14px 0 9px; display: flex; align-items: center; gap: 8px; }
#hcp-dd-container .sh::after { content: ''; flex: 1; height: 0.5px; background: var(--border); }
#hcp-dd-container .code-blk { background: var(--surface-1); border: 0.5px solid var(--border); border-radius: 8px; padding: 12px 14px; font-family: var(--font-mono); font-size: 11px; line-height: 1.7; overflow-x: auto; white-space: pre; color: var(--text-secondary); }
#hcp-dd-container .ck { color: #3b82f6; }
#hcp-dd-container .cv { color: #10b981; }
#hcp-dd-container .cc { color: var(--text-muted); }
#hcp-dd-container .fn { border: 0.5px solid var(--border); border-radius: 8px; padding: 10px 12px; background: var(--surface-1); font-size: 12px; }
#hcp-dd-container .fn-name { font-size: 13px; font-weight: 500; color: var(--text-primary); margin-bottom: 3px; }
#hcp-dd-container .fn-sub { font-size: 11px; color: var(--text-muted); font-family: var(--font-mono); }
#hcp-dd-container .mx-tbl { width: 100%; border-collapse: collapse; font-size: 12px; }
#hcp-dd-container .mx-tbl th { font-size: 11px; font-weight: 500; color: var(--text-muted); padding: 5px 8px; border-bottom: 0.5px solid var(--border); text-align: left; }
#hcp-dd-container .mx-tbl td { padding: 5px 8px; border-bottom: 0.5px solid var(--border); color: var(--text-secondary); vertical-align: top; }
#hcp-dd-container .mx-tbl td:first-child { font-weight: 500; color: var(--text-primary); white-space: nowrap; }
#hcp-dd-container .mx-tbl tr:last-child td { border-bottom: none; }
#hcp-dd-container .step-card { border: 0.5px solid var(--border); border-left: 3px solid; border-radius: 12px; padding: 16px; background: var(--surface-1); min-height: 220px; }
#hcp-dd-container .step-title { font-size: 14px; font-weight: 500; color: var(--text-primary); margin-bottom: 6px; }
#hcp-dd-container .step-desc { font-size: 13px; color: var(--text-secondary); line-height: 1.55; margin-bottom: 12px; }
#hcp-dd-container .step-items { list-style: none; padding: 0; margin: 0; }
#hcp-dd-container .step-items li { font-size: 12px; color: var(--text-secondary); padding-left: 14px; position: relative; margin-bottom: 5px; line-height: 1.45; }
#hcp-dd-container .step-items li::before { content: '›'; position: absolute; left: 2px; color: var(--text-muted); }
#hcp-dd-container .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--border-strong); cursor: pointer; transition: background .15s; border: none; padding: 0; }
#hcp-dd-container .dot.on { background: var(--text-primary); }
#hcp-dd-container .phi-stage { display: flex; gap: 12px; align-items: stretch; margin-bottom: 6px; }
#hcp-dd-container .phi-ico { width: 32px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; font-size: 16px; color: var(--text-muted); }
#hcp-dd-container .phi-blk { flex: 1; background: var(--surface-1); border: 0.5px solid var(--border); border-left: 3px solid; border-radius: 10px; padding: 10px 14px; }
#hcp-dd-container .phi-name { font-size: 13px; font-weight: 500; color: var(--text-primary); margin-bottom: 3px; }
#hcp-dd-container .phi-desc { font-size: 12px; color: var(--text-secondary); line-height: 1.4; }
#hcp-dd-container .phi-con { margin-left: 15px; color: var(--text-muted); font-size: 14px; line-height: 1; margin-bottom: 2px; }
#hcp-dd-container .tree { font-family: var(--font-mono); font-size: 12px; line-height: 1.75; background: var(--surface-1); border: 0.5px solid var(--border); border-radius: 8px; padding: 14px 16px; }
#hcp-dd-container .td { color: var(--text-primary); font-weight: 500; }
#hcp-dd-container .tc { color: var(--text-muted); font-family: var(--font-sans); font-size: 11px; }
#hcp-dd-container .tf { color: var(--text-secondary); }
#hcp-dd-container .lbl-g { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-bottom: 8px; }
#hcp-dd-container .lbl-c { background: var(--surface-1); border: 0.5px solid var(--border); border-radius: 8px; padding: 10px 12px; }
#hcp-dd-container .lbl-name { font-size: 11px; font-weight: 500; color: var(--text-primary); margin-bottom: 5px; font-family: var(--font-mono); }
#hcp-dd-container .lbl-row { font-size: 11px; color: var(--text-secondary); margin-bottom: 2px; display: flex; gap: 5px; }
#hcp-dd-container .lbl-k { color: var(--text-muted); min-width: 68px; flex-shrink: 0; }
@media (max-width: 1024px) {
  #hcp-dd-container .lbl-g { grid-template-columns: 1fr; }
}
</style>

<div class="tab-bar">
<button class="tb on" onclick="sw_dd('dd-gt',this)"><i class="ti ti-git-branch" aria-hidden="true"></i>&thinsp; GitOps fleet</button>
<button class="tb" onclick="sw_dd('dd-rct',this)"><i class="ti ti-robot" aria-hidden="true"></i>&thinsp; ReAct agent loop</button>
<button class="tb" onclick="sw_dd('dd-phi',this)"><i class="ti ti-database" aria-hidden="true"></i>&thinsp; PHI data flow</button>
<button class="tb" onclick="sw_dd('dd-iac',this)"><i class="ti ti-folder" aria-hidden="true"></i>&thinsp; IaC structure</button>
</div>

<!-- GITOPS FLEET PANEL -->
<div id="dd-gt" class="pnl on">
<div class="sh">Fleet overview</div>
<div style="display:flex;gap:10px;align-items:stretch;margin-bottom:16px;flex-wrap:wrap;">
<div style="display:flex;flex-direction:column;gap:8px;flex:0 0 176px">
<div class="fn" style="border-left:3px solid #7F77DD">
<div class="fn-name"><i class="ti ti-git-branch" style="color:#7F77DD;font-size:15px" aria-hidden="true"></i> Git repository</div>
<div class="fn-sub">GitHub / GitLab — source of truth</div>
</div>
<div style="text-align:center;font-size:12px;color:var(--text-muted)">commit → webhook</div>
<div class="fn" style="border-left:3px solid #7F77DD">
<div class="fn-name"><i class="ti ti-settings" style="color:#7F77DD;font-size:15px" aria-hidden="true"></i> ArgoCD hub</div>
<div class="fn-sub">Management cluster, ApplicationSets</div>
</div>
</div>
<div style="display:flex;align-items:center;color:var(--text-muted);font-size:22px;padding:0 2px">→</div>
<div style="display:grid;grid-template-columns:1fr 1fr;grid-template-rows:repeat(3,1fr);gap:5px;flex:1">
<div class="fn" style="border-top:2px solid #378ADD;padding:7px 10px"><div style="font-size:10px;font-weight:500;color:#185FA5">EKS</div><div style="font-size:11px;color:var(--text-secondary)">AWS prod</div></div>
<div class="fn" style="border-top:2px solid #378ADD;padding:7px 10px"><div style="font-size:10px;font-weight:500;color:#185FA5">AKS</div><div style="font-size:11px;color:var(--text-secondary)">Azure prod</div></div>
<div class="fn" style="border-top:2px solid #378ADD;padding:7px 10px"><div style="font-size:10px;font-weight:500;color:#185FA5">GKE</div><div style="font-size:11px;color:var(--text-secondary)">GCP prod</div></div>
<div class="fn" style="border-top:2px solid #1D9E75;padding:7px 10px"><div style="font-size:10px;font-weight:500;color:#0F6E56">kubeadm</div><div style="font-size:11px;color:var(--text-secondary)">DC primary</div></div>
<div class="fn" style="border-top:2px solid #1D9E75;padding:7px 10px"><div style="font-size:10px;font-weight:500;color:#0F6E56">RKE2</div><div style="font-size:11px;color:var(--text-secondary)">DC secondary</div></div>
<div class="fn" style="border-top:2px solid #1D9E75;padding:7px 10px"><div style="font-size:10px;font-weight:500;color:#0F6E56">OpenShift</div><div style="font-size:11px;color:var(--text-secondary)">Regulated DC</div></div>
</div>
</div>

<div class="sh">Cluster labels (ArgoCD cluster secret annotations)</div>
<div class="lbl-g">
<div class="lbl-c"><div class="lbl-name">eks-us-east-prod</div><div class="lbl-row"><span class="lbl-k">flavor:</span><span>eks</span></div><div class="lbl-row"><span class="lbl-k">env:</span><span>prod</span></div><div class="lbl-row"><span class="lbl-k">gpu:</span><span>true</span></div><div class="lbl-row"><span class="lbl-k">compliance:</span><span>hipaa</span></div></div>
<div class="lbl-c"><div class="lbl-name">aks-eastus-prod</div><div class="lbl-row"><span class="lbl-k">flavor:</span><span>aks</span></div><div class="lbl-row"><span class="lbl-k">env:</span><span>prod</span></div><div class="lbl-row"><span class="lbl-k">gpu:</span><span>true</span></div><div class="lbl-row"><span class="lbl-k">compliance:</span><span>hipaa</span></div></div>
<div class="lbl-c"><div class="lbl-name">gke-us-central-prod</div><div class="lbl-row"><span class="lbl-k">flavor:</span><span>gke</span></div><div class="lbl-row"><span class="lbl-k">env:</span><span>prod</span></div><div class="lbl-row"><span class="lbl-k">gpu:</span><span>true</span></div><div class="lbl-row"><span class="lbl-k">compliance:</span><span>hipaa</span></div></div>
<div class="lbl-c"><div class="lbl-name">dc1-kubeadm-prod</div><div class="lbl-row"><span class="lbl-k">flavor:</span><span>kubeadm</span></div><div class="lbl-row"><span class="lbl-k">env:</span><span>prod</span></div><div class="lbl-row"><span class="lbl-k">gpu:</span><span>true</span></div><div class="lbl-row"><span class="lbl-k">compliance:</span><span>hipaa</span></div></div>
<div class="lbl-c"><div class="lbl-name">dc2-rke2-prod</div><div class="lbl-row"><span class="lbl-k">flavor:</span><span>rke2</span></div><div class="lbl-row"><span class="lbl-k">env:</span><span>prod</span></div><div class="lbl-row"><span class="lbl-k">gpu:</span><span>true</span></div><div class="lbl-row"><span class="lbl-k">compliance:</span><span>hipaa</span></div></div>
<div class="lbl-c"><div class="lbl-name">dc3-ocp-regulated</div><div class="lbl-row"><span class="lbl-k">flavor:</span><span>openshift</span></div><div class="lbl-row"><span class="lbl-k">env:</span><span>prod</span></div><div class="lbl-row"><span class="lbl-k">gpu:</span><span>true</span></div><div class="lbl-row"><span class="lbl-k">compliance:</span><span>hipaa,hitrust</span></div></div>
</div>

<div class="sh">ApplicationSet pattern (platform addons fleet)</div>
<div class="code-blk"><span class="cc">apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: platform-addons
  namespace: argocd
spec:
  generators:
  - clusters:
      selector:
        matchLabels:
          </span><span class="ck">platform</span><span class="cc">: </span><span class="cv">healthcare-ai</span><span class="cc">            </span><span class="tc"># targets all 6 clusters</span><span class="cc">
  template:
    metadata:
      name: </span><span class="cv">'platform-{{name}}'</span><span class="cc">
    spec:
      project: platform
      source:
        repoURL: </span><span class="cv">https://github.com/org/platform-iac</span><span class="cc">
        path: </span><span class="cv">addons/{{metadata.labels.flavor}}</span><span class="cc">  </span><span class="tc"># per-flavor path</span><span class="cc">
        targetRevision: </span><span class="cv">HEAD</span><span class="cc">
      destination:
        server: </span><span class="cv">'{{server}}'</span><span class="cc">
      syncPolicy:
        automated:
          prune: </span><span class="cv">true</span><span class="cc">
          selfHeal: </span><span class="cv">true</span><span class="cc">
        retry:
          limit: </span><span class="cv">3</span></div>

<div class="sh">Addon deployment matrix — flavor-specific overrides</div>
<table class="mx-tbl">
<thead><tr><th>Addon</th><th>Cloud (EKS/AKS/GKE)</th><th>On-prem (kubeadm/RKE2)</th><th>OpenShift</th></tr></thead>
<tbody>
<tr><td>Cilium CNI</td><td><i class="ti ti-check" style="color:var(--text-success)"></i> deployed</td><td><i class="ti ti-check" style="color:var(--text-success)"></i> deployed</td><td>— OVN-Kubernetes (built-in)</td></tr>
<tr><td>Istio service mesh</td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td></tr>
<tr><td>MetalLB</td><td>— cloud LB used</td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td></tr>
<tr><td>Cloud CSI driver</td><td><i class="ti ti-check" style="color:var(--text-success)"></i> EBS/Disk/PD</td><td>— Longhorn / Rook-Ceph</td><td>— ODF (Ceph)</td></tr>
<tr><td>Longhorn storage</td><td>— cloud CSI used</td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td>— ODF used</td></tr>
<tr><td>Kyverno</td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td>— SCC + OPA only</td></tr>
<tr><td>OPA Gatekeeper</td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td></tr>
<tr><td>Nvidia GPU Operator</td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td><i class="ti ti-check" style="color:var(--text-success)"></i> via OperatorHub</td></tr>
<tr><td>cert-manager</td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td></tr>
<tr><td>NemoClaw / NIM</td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td><td><i class="ti ti-check" style="color:var(--text-success)"></i></td></tr>
</tbody>
</table>
</div>

<!-- REACT PANEL -->
<div id="dd-rct" class="pnl">
<div style="font-size:12px;color:var(--text-secondary);margin-bottom:14px;line-height:1.5">
Step through a complete NemoClaw agent reasoning cycle for a clinical drug interaction check. The agent uses a <span class="ch pu">Reason</span> → <span class="ch co">Act</span> → <span class="ch te">Observe</span> loop until it has enough information to synthesize a safe clinical output.
</div>

<div id="step-header" style="display:flex;justify-content:space-between;align-items:center;margin-bottom:10px">
<div id="step-badge"></div>
<div id="step-counter" style="font-size:12px;color:var(--text-muted)"></div>
</div>

<div id="step-card" class="step-card">
<div id="step-title" class="step-title"></div>
<div id="step-desc" class="step-desc"></div>
<ul id="step-items" class="step-items"></ul>
</div>

<div class="step-nav" style="display:flex;justify-content:space-between;align-items:center;margin-top:8px">
<button id="prev-btn" onclick="go(-1)" style="font-size:13px;padding:6px 14px;background:none;border:0.5px solid var(--border-strong);border-radius:6px;color:var(--text-secondary);cursor:pointer">← Previous</button>
<div id="step-dots" style="display:flex;gap:6px"></div>
<button id="next-btn" onclick="go(1)" style="font-size:13px;padding:6px 14px;background:none;border:0.5px solid var(--border-strong);border-radius:6px;color:var(--text-secondary);cursor:pointer">Next →</button>
</div>
</div>

<!-- PHI PANEL -->
<div id="dd-phi" class="pnl">
<div class="sh">PHI data journey — from EHR to clinical AI output</div>

<div class="phi-stage">
<div class="phi-ico"><i class="ti ti-building-hospital" aria-hidden="true"></i></div>
<div class="phi-blk" style="border-left-color:#378ADD">
<div class="phi-name">EHR / source systems</div>
<div class="phi-desc">Epic, Cerner, or Meditech emits clinical events. SMART on FHIR app launches in EHR context with scoped access token (patient/*.read).</div>
<div class="chips"><span class="ch bl">Epic SMART on FHIR</span><span class="ch bl">Cerner Millennium</span><span class="ch bl">HL7 v2 ADT feeds</span><span class="ch bl">DICOM modalities</span></div>
</div>
</div>
<div class="phi-con"><i class="ti ti-chevron-down" aria-hidden="true"></i></div>

<div class="phi-stage">
<div class="phi-ico"><i class="ti ti-arrow-guide" aria-hidden="true"></i></div>
<div class="phi-blk" style="border-left-color:#378ADD">
<div class="phi-name">FHIR R4 ingestion — namespace: clinical-data</div>
<div class="phi-desc">Incoming FHIR resources validated (schema + terminology), persisted to Hapi FHIR server. HL7 v2 converted via FHIR Converter. DICOM metadata indexed. All writes trigger an audit event.</div>
<div class="chips"><span class="ch bl">Hapi FHIR R4 server</span><span class="ch bl">HL7 v2 → FHIR Converter</span><span class="ch bl">DICOM → DICOMweb adapter</span><span class="ch bl">Audit: write logged</span></div>
</div>
</div>
<div class="phi-con"><i class="ti ti-chevron-down" aria-hidden="true"></i></div>

<div class="phi-stage">
<div class="phi-ico"><i class="ti ti-eye-off" aria-hidden="true"></i></div>
<div class="phi-blk" style="border-left-color:#D85A30">
<div class="phi-name">De-identification pipeline</div>
<div class="phi-desc">Before any data reaches AI agents, the de-ID pipeline strips all 18 HIPAA Safe Harbor identifiers using NLP + rule-based detectors. A secure token maps the de-identified payload back to the original patient record.</div>
<div class="chips"><span class="ch co">18 HIPAA identifier removal</span><span class="ch co">NLP NER (dates, names, MRN)</span><span class="ch co">Secure re-link token issued</span><span class="ch co">Reversible only by clinical-data ns</span></div>
</div>
</div>
<div class="phi-con"><i class="ti ti-chevron-down" aria-hidden="true"></i></div>

<div class="phi-stage">
<div class="phi-ico"><i class="ti ti-robot" aria-hidden="true"></i></div>
<div class="phi-blk" style="border-left-color:#D85A30">
<div class="phi-name">NemoClaw agents — namespace: nemo-agents</div>
<div class="phi-desc">Agent Supervisor receives the de-identified payload and routes to the appropriate clinical agent. Agents operate entirely on de-identified data. Tool calls back to clinical-data namespace are authenticated via mTLS service identity and audit-logged.</div>
<div class="chips"><span class="ch co">De-identified payload only</span><span class="ch co">mTLS service identity (SPIFFE)</span><span class="ch co">Tool calls audit-logged</span><span class="ch co">ReAct reasoning loop</span></div>
</div>
</div>
<div class="phi-con"><i class="ti ti-chevron-down" aria-hidden="true"></i></div>

<div class="phi-stage">
<div class="phi-ico"><i class="ti ti-cpu" aria-hidden="true"></i></div>
<div class="phi-blk" style="border-left-color:#BA7517">
<div class="phi-name">NIM LLM inference — namespace: ai-platform</div>
<div class="phi-desc">NemoClaw calls NIM or Triton for LLM reasoning. De-identified clinical context is included in the prompt. NeMo GuardRails validates the model output for clinical safety before returning to the agent.</div>
<div class="chips"><span class="ch am">NIM API (no PHI in prompt)</span><span class="ch am">Triton Inference Server</span><span class="ch am">NeMo GuardRails validation</span><span class="ch am">GPU-resident, no egress</span></div>
</div>
</div>
<div class="phi-con"><i class="ti ti-chevron-down" aria-hidden="true"></i></div>

<div class="phi-stage">
<div class="phi-ico"><i class="ti ti-link" aria-hidden="true"></i></div>
<div class="phi-blk" style="border-left-color:#639922">
<div class="phi-name">Re-identification & output delivery</div>
<div class="phi-desc">Clinical AI output is re-linked to the patient record using the secure token held by the clinical-data namespace. The output is written as a FHIR Communication or ClinicalImpression resource and delivered to the clinician's EHR session.</div>
<div class="chips"><span class="ch gn">Secure token re-links to MRN</span><span class="ch gn">Output → FHIR Communication</span><span class="ch gn">Delivered to EHR SMART context</span><span class="ch gn">Clinician review + sign-off</span></div>
</div>
</div>
<div class="phi-con"><i class="ti ti-chevron-down" aria-hidden="true"></i></div>

<div class="phi-stage">
<div class="phi-ico"><i class="ti ti-file-description" aria-hidden="true"></i></div>
<div class="phi-blk" style="border-left-color:#888780">
<div class="phi-name">Immutable audit trail</div>
<div class="phi-desc">Every PHI access, de-ID operation, agent tool call, LLM inference, and clinical output delivery is appended to an immutable log store (WORM). Logs are shipped to the SIEM for HIPAA audit readiness and stored for 7 years minimum.</div>
<div class="chips"><span class="ch gy">User ID + timestamp + action</span><span class="ch gy">PHI resource accessed</span><span class="ch gy">WORM log store (7-year retain)</span><span class="ch gy">Splunk / Elastic SIEM</span></div>
</div>
</div>
</div>

<!-- IAC PANEL -->
<div id="dd-iac" class="pnl">
<div class="sh">IaC monorepo structure</div>
<div class="tree">
<div><span class="td">platform-iac/</span></div>
<div>├── <span class="td">clusters/</span>               <span class="tc">Cluster API + Crossplane manifests</span></div>
<div>│   ├── <span class="td">cloud/</span></div>
<div>│   │   ├── <span class="tf">eks/</span>            <span class="tc">AWS CAPA ClusterClass + MachinePool</span></div>
<div>│   │   ├── <span class="tf">aks/</span>            <span class="tc">Azure CAPZ ClusterClass + MachinePool</span></div>
<div>│   │   └── <span class="tf">gke/</span>            <span class="tc">GCP CAPG ClusterClass + NodePool</span></div>
<div>│   └── <span class="td">onprem/</span></div>
<div>│       ├── <span class="tf">kubeadm/</span>        <span class="tc">CAPD/CAPH machine + kubeadmControlPlane</span></div>
<div>│       ├── <span class="tf">rke2/</span>           <span class="tc">CAPRKE2 cluster + machine config</span></div>
<div>│       └── <span class="tf">openshift/</span>      <span class="tc">IPI install-config + MachineConfig</span></div>
<div>│</div>
<div>├── <span class="td">addons/</span>                 <span class="tc">Helm + Kustomize add-on configs per flavor</span></div>
<div>│   ├── <span class="tf">networking/</span>         <span class="tc">Cilium, Istio, Gateway API, MetalLB</span></div>
<div>│   ├── <span class="tf">storage/</span>            <span class="tc">CSI drivers, Longhorn, Rook-Ceph, Velero</span></div>
<div>│   ├── <span class="tf">monitoring/</span>         <span class="tc">Prometheus stack, Grafana, Loki, OTel</span></div>
<div>│   ├── <span class="tf">security/</span>           <span class="tc">OPA, Kyverno, Falco, Trivy, cert-manager</span></div>
<div>│   └── <span class="tf">gpu/</span>                <span class="tc">GPU Operator, Network Operator, DCGM</span></div>
<div>│</div>
<div>├── <span class="td">ai-platform/</span>            <span class="tc">Nvidia NIM, Triton, vLLM, KServe</span></div>
<div>│   ├── <span class="tf">nim/</span>                <span class="tc">NIM deployment manifests + model config</span></div>
<div>│   ├── <span class="tf">triton/</span>             <span class="tc">Triton server + model repository config</span></div>
<div>│   ├── <span class="tf">vllm/</span>               <span class="tc">vLLM deployment + quantisation config</span></div>
<div>│   └── <span class="tf">kserve/</span>             <span class="tc">InferenceService + ServingRuntime CRDs</span></div>
<div>│</div>
<div>├── <span class="td">nemo/</span>                   <span class="tc">NemoClaw agent framework workloads</span></div>
<div>│   ├── <span class="tf">agents/</span>             <span class="tc">Agent Supervisor, tool registry, ReAct config</span></div>
<div>│   ├── <span class="tf">guardrails/</span>         <span class="tc">NeMo GuardRails config + clinical policies</span></div>
<div>│   ├── <span class="tf">milvus/</span>             <span class="tc">Milvus vector DB + embedding pipeline</span></div>
<div>│   └── <span class="tf">redis/</span>              <span class="tc">Redis cluster for short-term agent memory</span></div>
<div>│</div>
<div>├── <span class="td">clinical/</span>               <span class="tc">PHI-scoped healthcare workloads</span></div>
<div>│   ├── <span class="tf">fhir/</span>               <span class="tc">Hapi FHIR R4 server + PostgreSQL</span></div>
<div>│   ├── <span class="tf">hl7/</span>                <span class="tc">HL7 v2 broker + FHIR Converter</span></div>
<div>│   └── <span class="tf">deid/</span>               <span class="tc">De-identification pipeline + token store</span></div>
<div>│</div>
<div>├── <span class="td">gitops/</span>                 <span class="tc">ArgoCD App of Apps bootstrap</span></div>
<div>│   ├── <span class="tf">bootstrap/</span>          <span class="tc">ArgoCD self-install + root app</span></div>
<div>│   ├── <span class="tf">platform-appset.yaml</span>    <span class="tc">Deploys addons to all clusters</span></div>
<div>│   ├── <span class="tf">ai-appset.yaml</span>          <span class="tc">Deploys AI platform (gpu=true selector)</span></div>
<div>│   └── <span class="tf">clinical-appset.yaml</span>    <span class="tc">PHI workloads (compliance=hipaa selector)</span></div>
<div>│</div>
<div>└── <span class="td">terraform/</span>              <span class="tc">Cloud prerequisites only (VPC, IAM, KMS)</span></div>
<div>    ├── <span class="tf">modules/</span>            <span class="tc">eks-prereqs, aks-prereqs, gke-prereqs</span></div>
<div>    └── <span class="tf">environments/</span>       <span class="tc">dev / staging / prod tfvars</span></div>
</div>

<div style="background:var(--surface-1);border:0.5px solid var(--border);border-radius:8px;padding:11px 14px;margin-top:10px;font-size:12px;color:var(--text-secondary);line-height:1.5">
<span style="font-weight:500;color:var(--text-primary)">Key convention — </span>each <span style="font-family:var(--font-mono)">addons/&lt;flavor&gt;/</span> directory holds a Kustomize base shared with <span style="font-family:var(--font-mono)">addons/common/</span> and applies flavor-specific patches. The ArgoCD ApplicationSet resolves <span style="font-family:var(--font-mono)">&#123;&#123;metadata.labels.flavor&#125;&#125;</span> at sync time so a single ApplicationSet serves all 6 cluster flavors from one template.
</div>
</div>

<script>
function sw_dd(id,btn){
  const container = document.getElementById('hcp-dd-container');
  container.querySelectorAll('.pnl').forEach(p=>p.classList.remove('on'));
  container.querySelectorAll('.tb').forEach(t=>t.classList.remove('on'));
  container.querySelector('#' + id).classList.add('on');
  btn.classList.add('on');
}

const typeColor={'receive':'#888780','reason':'#7F77DD','act':'#D85A30','observe':'#1D9E75','guardrails':'#BA7517','output':'#639922'};
const typeCls={'receive':'gy','reason':'pu','act':'co','observe':'te','guardrails':'am','output':'gn'};
const typeLabel={'receive':'Request received','reason':'Reason','act':'Act','observe':'Observe','guardrails':'Context + guardrails','output':'Clinical output'};

const steps=[
  {type:'receive',title:'Drug interaction check triggered',desc:'A clinician opens the drug interaction checker via a SMART on FHIR app. The request is authenticated via Keycloak OIDC and routed to the NemoClaw Agent Supervisor in the nemo-agents namespace.',items:['Source: SMART on FHIR app (scoped Epic session, patient/*.read)','Request: "Check drug interactions for patient P-48291"','JWT validated by Istio AuthorizationPolicy at ingress gateway','Agent Supervisor assigns task to Drug Interaction Agent']},
  {type:'reason',title:'Agent plans tool call sequence',desc:'Before acting, the ReAct engine analyzes the request and builds a tool execution plan. This prevents redundant tool calls and sets up the reasoning loop.',items:['Thought: must retrieve full medication list before checking interactions','Thought: check all drug pairs via DrugBank and OpenFDA','Thought: if major interactions exist, fetch patient labs for clinical context','Tool plan: [fhir_get_meds → drugbank_check → fhir_get_labs → clinical_kb → synthesize]']},
  {type:'act',title:'Tool call — FHIR patient medications',desc:'The agent calls the fhir_get_patient_meds tool. The tool uses the service account SPIFFE identity (mTLS) to authenticate against the FHIR R4 server in the clinical-data namespace.',items:['Tool: fhir_get_patient_meds(patient_id="P-48291", status="active")','Endpoint: GET /fhir/r4/MedicationRequest?patient=P-48291&status=active','Namespace: clinical-data (Istio PeerAuthentication STRICT, mTLS only)','PHI access event logged: agent-drug-interaction, timestamp, patient resource']},
  {type:'observe',title:'Medication list retrieved — 6 active medications',desc:'The FHIR server returns 6 active MedicationRequest resources. The agent parses each one and stores the medication list in Redis (short-term agent memory) keyed to this conversation.',items:['Warfarin 5mg daily — anticoagulant (CYP2C9 substrate, narrow therapeutic index)','Amoxicillin 500mg TID — penicillin-class antibiotic','Ibuprofen 400mg PRN — NSAID / COX-1 and COX-2 inhibitor','Metoprolol 25mg BID — beta-1 selective blocker','Lisinopril 10mg daily — ACE inhibitor','Atorvastatin 40mg daily — HMG-CoA reductase inhibitor']},
  {type:'act',title:'Tool call — drug interaction check (15 pairs)',desc:'The agent submits all 15 possible medication pairs (6 choose 2) to the drugbank_check_interactions tool, which queries DrugBank v5.1, OpenFDA adverse event DB, and the WHO interaction database in parallel.',items:['Tool: drugbank_check_interactions(medications=[...6 meds...])',  '15 pairs checked concurrently via async tool call','Severity classification returned: Major / Moderate / Minor / None','DDI mechanism type returned: pharmacokinetic or pharmacodynamic']},
  {type:'observe',title:'2 significant interactions identified',desc:'DrugBank returns 2 clinically significant drug-drug interactions. The agent identifies that it needs the patient\'s current INR to properly assess severity and updates its reasoning plan.',items:['[MAJOR] Warfarin + Ibuprofen — NSAID inhibits platelet function; ibuprofen displaces warfarin from protein binding → elevated INR + increased bleeding risk','[MODERATE] Warfarin + Amoxicillin — antibiotic disrupts gut flora → reduced Vitamin K synthesis → elevated INR','Updated plan: fetch patient INR from FHIR labs, then get warfarin+NSAID clinical guideline','Remaining 13 pairs: no clinically significant interactions found']},
  {type:'guardrails',title:'Clinical context fetched — NeMo GuardRails applied',desc:'The agent fetches the patient\'s recent INR from FHIR labs (INR 3.1, supratherapeutic). Before calling the NIM LLM to synthesize the response, NeMo GuardRails validates the planned output against clinical safety rules.',items:['fhir_get_labs: INR = 3.1 drawn 5 days ago (target range 2.0–3.0 — supratherapeutic)','clinical_kb_lookup: ACCP 2012 guidelines — avoid NSAIDs in anticoagulated patients','GuardRails: no dosing change recommendations (MD authority required — blocked)','GuardRails: all drug names and interactions verified against DrugBank IDs','GuardRails: no contradiction of established clinical guidelines — pass']},
  {type:'output',title:'Structured clinical alert delivered to EHR',desc:'The NIM LLM synthesizes a structured clinical alert. The agent re-links the output to the patient MRN via secure token, writes a FHIR Communication resource, and delivers it to the clinician\'s active EHR session.',items:['[MAJOR] Warfarin + Ibuprofen: Hold ibuprofen; use acetaminophen if analgesia needed; recheck INR in 48h (current INR 3.1 — supratherapeutic)','[MODERATE] Warfarin + Amoxicillin: Monitor INR 2–3 times during antibiotic course; adjust warfarin dose if INR exceeds 3.5','INR context: current level 3.1 elevates bleeding risk from both interactions — expedited follow-up recommended','References: DrugBank DB01050 (ibuprofen), PMID 18322875, ACCP 2012 Antithrombotic Guidelines §3.2','Audit: alert delivered to clinician C-112 at timestamp; full agent trace retained 90 days']}
];

let cur_dd=0;

function render_dd(){
  const s=steps[cur_dd];
  const col=typeColor[s.type];
  const cls=typeCls[s.type];
  const lbl=typeLabel[s.type];
  document.getElementById('step-badge').innerHTML='<span class="ch '+cls+'" style="font-size:12px">'+lbl+'</span>';
  document.getElementById('step-counter').textContent='Step '+(cur_dd+1)+' of '+steps.length;
  const card=document.getElementById('step-card');
  card.style.borderLeftColor=col;
  document.getElementById('step-title').textContent=s.title;
  document.getElementById('step-desc').textContent=s.desc;
  const ul=document.getElementById('step-items');
  ul.innerHTML=s.items.map(i=>'<li>'+i+'</li>').join('');
  document.getElementById('prev-btn').disabled=cur_dd===0;
  document.getElementById('prev-btn').style.opacity=cur_dd===0?'0.4':'1';
  document.getElementById('next-btn').disabled=cur_dd===steps.length-1;
  document.getElementById('next-btn').style.opacity=cur_dd===steps.length-1?'0.4':'1';
  const dots=document.getElementById('step-dots');
  dots.innerHTML=steps.map((_,i)=>'<button class="dot'+(i===cur_dd?' on':'')+'" onclick="jump_dd('+i+')" aria-label="Step '+(i+1)+'"></button>').join('');
}

function go(d){cur_dd=Math.max(0,Math.min(steps.length-1,cur_dd+d));render_dd();}
function jump_dd(n){cur_dd=n;render_dd();}
render_dd();
</script>

---

## Safety & Guardrails for Clinical AI

Workloads deployed inside the `clinical-apps` and `clinical-data` namespaces must implement strict boundary parameters using K8s native admission policies and service meshes:

### 1. Cilium Network Policy — Clinical Data Namespace Isolation

Enforces strict zero-trust isolation on the `clinical-data` namespace, preventing arbitrary traffic ingress and egress.

```yaml
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: clinical-data-isolation
  namespace: clinical-data
spec:
  endpointSelector: {}
  ingress:
  - fromEndpoints:
    - matchLabels:
        io.kubernetes.pod.namespace: nemo-agents
    toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
      rules:
        http:
        - method: GET
          path: /fhir/r4/.*
  - fromEndpoints:
    - matchLabels:
        io.kubernetes.pod.namespace: clinical-apps
  - fromEndpoints:
    - matchLabels:
        io.kubernetes.pod.namespace: monitoring
    toPorts:
    - ports:
      - port: "9090"
  egress:
  - toEndpoints:
    - matchLabels:
        io.kubernetes.pod.namespace: kube-system
        k8s-app: kube-dns
    toPorts:
    - ports:
      - port: "53"
        protocol: UDP
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: clinical-data
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress
```

### 2. Istio PeerAuthentication & AuthorizationPolicy

Enforces strict mTLS in-transit encryption and explicitly validates SPIFFE identities.

```yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: clinical-data-mtls-strict
  namespace: clinical-data
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: fhir-server-allow
  namespace: clinical-data
spec:
  selector:
    matchLabels:
      app: hapi-fhir
  action: ALLOW
  rules:
  - from:
    - source:
        principals:
        - "cluster.local/ns/nemo-agents/sa/drug-interaction-agent"
        - "cluster.local/ns/nemo-agents/sa/diagnostic-agent"
        - "cluster.local/ns/nemo-agents/sa/radiology-agent"
        - "cluster.local/ns/clinical-apps/sa/clinician-app"
    to:
    - operation:
        methods: ["GET"]
        paths: ["/fhir/r4/*"]
    when:
    - key: request.auth.claims[aud]
      values: ["fhir-server"]
```

### 3. Istio Egress Gateway for External Tool APIs

Forces all external agent requests through a centralized, audited egress gateway.

```yaml
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: drugbank-external
  namespace: nemo-agents
spec:
  hosts:
  - api.drugbank.com
  ports:
  - number: 443
    name: https
    protocol: HTTPS
  location: MESH_EXTERNAL
  resolution: DNS
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nemo-agents-egress
  namespace: nemo-agents
spec:
  hosts:
  - api.drugbank.com
  - api.fda.gov
  tls:
  - match:
    - port: 443
    route:
    - destination:
        host: istio-egressgateway.istio-system.svc.cluster.local
```




