Execute Abridge production readiness checklist for clinical AI deployment. Use when launching Abridge in a healthcare org, preparing for go-live, or validating HIPAA compliance before production deployment. Trigger: "abridge production checklist", "abridge go-live", "abridge launch readiness", "abridge prod deploy".
Production readiness checklist for deploying Abridge clinical AI in a healthcare organization. Clinical documentation systems are safety-critical — this checklist covers HIPAA compliance, EHR integration validation, provider onboarding, and rollback procedures.
// src/prod/readiness-check.ts
interface ReadinessResult {
check: string;
status: 'pass' | 'fail' | 'warn';
detail: string;
}
async function runReadinessChecks(): Promise<ReadinessResult[]> {
const results: ReadinessResult[] = [];
// 1. API connectivity
try {
const res = await fetch(`${process.env.ABRIDGE_BASE_URL}/health`, {
headers: { 'Authorization': `Bearer ${process.env.ABRIDGE_CLIENT_SECRET}` },
});
results.push({ check: 'API Health', status: res.ok ? 'pass' : 'fail', detail: `HTTP ${res.status}` });
} catch (err) {
results.push({ check: 'API Health', status: 'fail', detail: (err as Error).message });
}
// 2. FHIR endpoint
try {
const res = await fetch(`${process.env.EPIC_FHIR_BASE_URL}/metadata`);
results.push({ check: 'FHIR Server', status: res.ok ? 'pass' : 'fail', detail: `HTTP ${res.status}` });
} catch (err) {
results.push({ check: 'FHIR Server', status: 'fail', detail: (err as Error).message });
}
// 3. TLS version
results.push({
check: 'TLS Version',
status: process.env.NODE_TLS_MIN_VERSION === 'TLSv1.3' ? 'pass' : 'warn',
detail: `Min TLS: ${process.env.NODE_TLS_MIN_VERSION || 'not set'}`,
});
// 4. Secrets not in env file
const envFiles = ['.env', '.env.local', '.env.production'];
for (const f of envFiles) {
try {
const content = await import('fs').then(fs => fs.readFileSync(f, 'utf8'));
if (content.includes('ABRIDGE_CLIENT_SECRET')) {
results.push({ check: `Secrets in ${f}`, status: 'fail', detail: 'Credentials in file — use secret manager' });
}
} catch { /* file doesn't exist — good */ }
}
// 5. Audit logging
results.push({
check: 'Audit Logging',
status: process.env.AUDIT_LOG_ENABLED === 'true' ? 'pass' : 'fail',
detail: 'HIPAA requires audit trail for all PHI access',
});
return results;
}
// Run and display
runReadinessChecks().then(results => {
console.log('\n=== Abridge Production Readiness ===\n');
for (const r of results) {
const icon = r.status === 'pass' ? 'PASS' : r.status === 'warn' ? 'WARN' : 'FAIL';
console.log(`[${icon}] ${r.check}: ${r.detail}`);
}
const failures = results.filter(r => r.status === 'fail');
console.log(`\n${failures.length === 0 ? 'READY FOR PRODUCTION' : `${failures.length} BLOCKING ISSUES`}`);
});
#!/bin/bash
# scripts/abridge-rollback.sh
# Rollback Abridge integration — revert to manual documentation
echo "=== Abridge Rollback Procedure ==="
# 1. Disable Abridge in EHR
echo "Step 1: Disable Abridge module in Epic App Orchard"
echo " - Navigate to Epic > Admin > App Orchard > Abridge"
echo " - Set status: DISABLED"
# 2. Notify providers
echo "Step 2: Send notification to enrolled providers"
echo " - Subject: Abridge temporarily offline — use manual documentation"
# 3. Verify EHR still accepts manual notes
echo "Step 3: Verify manual note creation in Epic works"
curl -X POST "${EPIC_FHIR_BASE_URL}/DocumentReference" \
-H "Authorization: Bearer $EPIC_TOKEN" \
-H "Content-Type: application/fhir+json" \
-d '{"resourceType":"DocumentReference","status":"current","content":[{"attachment":{"contentType":"text/plain","data":"'"$(echo 'Manual note test' | base64)"'"}}]}'
echo "=== Rollback Complete ==="
| Metric | Target | Alert Threshold |
|---|---|---|
| Note generation latency | < 30s | > 60s |
| API error rate | < 1% | > 5% |
| Provider adoption | > 80% in 30 days | < 50% |
| Note acceptance rate | > 90% | < 70% |
| Patient summary delivery | < 5s | > 15s |
For version upgrades, see abridge-upgrade-migration.