agentsclimarketplace

Openevidence data handling

Skill jeremylongshore/claude-code-plugins-plus-skills/plugins/saas-packs/openevidence-pack/skills/openevidence-data-handling

'Data Handling for OpenEvidence.From its SKILL.md

Install
npx -y skills add jeremylongshore/claude-code-plugins-plus-skills --skill openevidence-data-handling

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

What its file declares

Copied from the file, not written here

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

5.4 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it

OpenEvidence Data Handling

Overview

OpenEvidence provides AI-powered clinical evidence synthesis for healthcare professionals. Data types include clinical queries (potentially containing PHI), evidence citations from medical literature, patient-contextualized responses, research paper references, and usage analytics. All data handling must comply with HIPAA (PHI safeguards, minimum necessary standard, BAA requirements), GDPR for EU clinicians, and FDA guidance on clinical decision support. Query data may contain patient identifiers, diagnoses, or treatment details that require de-identification before storage or analytics.

Data Classification

Data TypeSensitivityRetentionEncryption
Clinical queries (may contain PHI)CriticalDe-identify within 24h, purge raw in 7 daysAES-256 + TLS, field-level for PHI
Evidence citationsLowIndefinite (public literature)TLS in transit
Patient-contextualized responsesHigh (derived PHI)30 days max, then de-identifyAES-256 at rest
Research paper metadataLowIndefiniteTLS in transit
Clinician usage analyticsMedium1 year (de-identified)AES-256 at rest

Data Import

interface ClinicalQuery {
  queryId: string; clinicianId: string; queryText: string;
  patientContext?: { age?: number; sex?: string; conditions?: string[] };
  timestamp: string;
}

async function submitClinicalQuery(query: ClinicalQuery): Promise<string> {
  const sanitized = { ...query, queryText: deidentifyPHI(query.queryText) };
  const res = await fetch('https://api.openevidence.com/v1/query', {
    method: 'POST',
    headers: { Authorization: `Bearer ${process.env.OPENEVIDENCE_API_KEY}`, 'Content-Type': 'application/json' },
    body: JSON.stringify(sanitized),
  });
  return (await res.json()).evidenceId;
}

function deidentifyPHI(text: string): string {
  return text
    .replace(/\b(MRN|mrn)[:\s]?\d{6,}\b/g, '[MRN_REDACTED]')
    .replace(/\b\d{3}-\d{2}-\d{4}\b/g, '[SSN_REDACTED]')
    .replace(/\b(DOB|dob)[:\s]?\d{1,2}\/\d{1,2}\/\d{2,4}\b/g, '[DOB_REDACTED]')
    .replace(/\b[A-Z][a-z]+ [A-Z][a-z]+, (MD|DO|NP|PA)\b/g, '[PROVIDER_REDACTED]');
}

Data Export

async function exportEvidenceSummary(queryIds: string[]) {
  const summaries = [];
  for (const id of queryIds) {
    const res = await fetch(`https://api.openevidence.com/v1/evidence/${id}`, {
      headers: { Authorization: `Bearer ${process.env.OPENEVIDENCE_API_KEY}` },
    });
    const data = await res.json();
    summaries.push({ queryId: id, citations: data.citations,
      summary: deidentifyPHI(data.summary), confidence: data.confidenceScore });
  }
  return summaries;
}

Data Validation

function validateClinicalQuery(q: ClinicalQuery): string[] {
  const errors: string[] = [];
  if (!q.queryId) errors.push('Missing query ID');
  if (!q.clinicianId) errors.push('Missing clinician identifier');
  if (!q.queryText || q.queryText.length < 10) errors.push('Query too short for meaningful evidence retrieval');
  if (q.queryText.length > 5000) errors.push('Query exceeds 5000 char limit');
  if (/\b\d{3}-\d{2}-\d{4}\b/.test(q.queryText)) errors.push('CRITICAL: SSN detected in query text');
  if (/\b(MRN|mrn)[:\s]?\d{6,}\b/.test(q.queryText)) errors.push('CRITICAL: MRN detected in query text');
  if (q.timestamp && isNaN(Date.parse(q.timestamp))) errors.push('Invalid timestamp');
  return errors;
}

Compliance

  • HIPAA: BAA executed with OpenEvidence before any PHI transmission
  • HIPAA: PHI de-identified using Safe Harbor method before storage/analytics
  • HIPAA: Minimum necessary standard enforced — only transmit required clinical context
  • HIPAA: Audit trail for all PHI access with clinician ID, timestamp, and query purpose
  • HIPAA: Breach notification procedure documented (72-hour window)
  • GDPR: EU clinician data subject rights (access, erasure, portability)
  • FDA: Clinical decision support disclaimer included in all evidence responses
  • Data retention: raw queries purged at 7 days, de-identified analytics retained 1 year

Error Handling

IssueCauseFix
PHI detected in stored queryDe-identification regex missed a patternAdd pattern to deidentifyPHI, re-scan stored queries
API 403 on query submissionBAA not on file or expired API credentialsVerify BAA status, rotate API key
Evidence response contains patient nameUpstream model hallucinated PHIPost-process all responses through de-identification before display
Audit log gapLogging service outage during query windowReplay from API request logs, flag gap in compliance report
Export exceeds size limitToo many citations in bulk exportPaginate export, limit to 50 evidence summaries per request

Resources

Next Steps

See openevidence-security-basics.

What ships with it: 1 file

2.2 KB alongside SKILL.md

references/

Keep looking

Skills are one crate of 326,144. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.