Communitygithub.com

patrones-scd-clinicos

Patrones de desarrollo para Sistemas de Apoyo a la Decisión Clínica (SADC). Comprobación de interacciones farmacológicas, validación de dosis, puntuación clínica (NEWS2, qSOFA), clasificación de gravedad de alertas e integración en flujos de trabajo de HCE.

¿Qué es patrones-scd-clinicos?

Esta habilidad proporciona patrones comprobados para construir Sistemas de Apoyo a la Decisión Clínica (SADC) que se integran de manera segura en los flujos de trabajo de la Historia Clínica Electrónica (HCE). Está diseñada para desarrolladores que implementan funciones críticas de seguridad del paciente, como la comprobación de interacciones farmacológicas, la validación de dosis ajustadas por peso, edad y función renal, y sistemas de puntuación clínica estandarizados como NEWS2 y qSOFA. El motor SADC se implementa como una biblioteca de funciones puras sin efectos secundarios, lo que garantiza una alta comprobabilidad y un rendimiento predecible. La habilidad es compatible con cualquier plataforma que admita TypeScript o JavaScript y es especialmente valiosa para equipos que construyen sistemas de entrada de órdenes médicas, alertas de laboratorio y módulos de seguridad de medicación. Proporciona interfaces y lógica de ejemplo, reglas de clasificación de gravedad de alertas con comportamientos de UI asociados (crítica, mayor, menor) y pautas estrictas de prueba (tolerancia cero a falsos negativos). También incluye una lista de anti-patrones a evitar, como hacer que las comprobaciones sean opcionales o silenciar errores.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/healthcare-cdss-patterns

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Patrones de Desarrollo de SADC Clínico

Patrones para construir Sistemas de Apoyo a la Decisión Clínica que se integren en los flujos de trabajo de la HCE. Los módulos SADC son críticos para la seguridad del paciente: tolerancia cero a falsos negativos.

Cuándo Usar

  • Implementar comprobación de interacciones farmacológicas
  • Construir motores de validación de dosis
  • Implementar sistemas de puntuación clínica (NEWS2, qSOFA, APACHE, GCS)
  • Diseñar sistemas de alerta para valores clínicos anormales
  • Construir entrada de órdenes de medicación con controles de seguridad
  • Integrar interpretación de resultados de laboratorio con contexto clínico

Cómo Funciona

El motor SADC es una biblioteca de funciones puras sin efectos secundarios. Ingrese datos clínicos, obtenga alertas. Esto lo hace completamente comprobable.

Tres módulos principales:

  1. checkInteractions(newDrug, currentMeds, allergies) — Comprueba un nuevo fármaco contra medicamentos actuales y alergias conocidas. Devuelve InteractionAlert[] ordenado por gravedad. Utiliza el modelo de datos DrugInteractionPair.
  2. validateDose(drug, dose, route, weight, age, renalFunction) — Valida una dosis prescrita según reglas basadas en peso, ajustadas por edad y función renal. Devuelve DoseValidationResult.
  3. calculateNEWS2(vitals) — Puntuación Nacional de Alerta Temprana 2 a partir de NEWS2Input. Devuelve NEWS2Result con puntuación total, nivel de riesgo y guía de escalamiento.
Interfaz HCE
  ↓ (el usuario ingresa datos)
Motor SADC (funciones puras, sin efectos secundarios)
  ├── Comprobador de Interacciones Farmacológicas
  ├── Validador de Dosis
  ├── Puntuación Clínica (NEWS2, qSOFA, etc.)
  └── Clasificador de Alertas
  ↓ (devuelve alertas)
Interfaz HCE (muestra alertas en línea, bloquea si es crítico)

Comprobación de Interacciones Farmacológicas

interface DrugInteractionPair {
  drugA: string;           // nombre genérico
  drugB: string;           // nombre genérico
  severity: 'critical' | 'major' | 'minor';
  mechanism: string;
  clinicalEffect: string;
  recommendation: string;
}

function checkInteractions(
  newDrug: string,
  currentMedications: string[],
  allergyList: string[]
): InteractionAlert[] {
  if (!newDrug) return [];
  const alerts: InteractionAlert[] = [];
  for (const current of currentMedications) {
    const interaction = findInteraction(newDrug, current);
    if (interaction) {
      alerts.push({ severity: interaction.severity, pair: [newDrug, current],
        message: interaction.clinicalEffect, recommendation: interaction.recommendation });
    }
  }
  for (const allergy of allergyList) {
    if (isCrossReactive(newDrug, allergy)) {
      alerts.push({ severity: 'critical', pair: [newDrug, allergy],
        message: `Reactividad cruzada con alergia documentada: ${allergy}`,
        recommendation: 'No prescribir sin consulta de alergología' });
    }
  }
  return alerts.sort((a, b) => severityOrder(a.severity) - severityOrder(b.severity));
}

Los pares de interacción deben ser bidireccionales: si el fármaco A interactúa con el fármaco B, entonces el fármaco B interactúa con el fármaco A.

Validación de Dosis

interface DoseValidationResult {
  valid: boolean;
  message: string;
  suggestedRange: { min: number; max: number; unit: string } | null;
  factors: string[];
}

function validateDose(
  drug: string,
  dose: number,
  route: 'oral' | 'iv' | 'im' | 'sc' | 'topical',
  patientWeight?: number,
  patientAge?: number,
  renalFunction?: number
): DoseValidationResult {
  const rules = getDoseRules(drug, route);
  if (!rules) return { valid: true, message: 'No hay reglas de validación disponibles', suggestedRange: null, factors: [] };
  const factors: string[] = [];

  // SEGURIDAD: si las reglas requieren peso pero falta el peso, BLOQUEAR (no pasar)
  if (rules.weightBased) {
    if (!patientWeight || patientWeight <= 0) {
      return { valid: false, message: `Se requiere peso para ${drug} (fármaco mg/kg)`,
        suggestedRange: null, factors: ['weight_missing'] };
    }
    factors.push('weight');
    const maxDose = rules.maxPerKg * patientWeight;
    if (dose > maxDose) {
      return { valid: false, message: `La dosis excede el máximo para ${patientWeight}kg`,
        suggestedRange: { min: rules.minPerKg * patientWeight, max: maxDose, unit: rules.unit }, factors };
    }
  }

  // Ajuste por edad (cuando las reglas definen rangos de edad y se proporciona la edad)
  if (rules.ageAdjusted && patientAge !== undefined) {
    factors.push('age');
    const ageMax = rules.getAgeAdjustedMax(patientAge);
    if (dose > ageMax) {
      return { valid: false, message: `Excede el máximo ajustado por edad para ${patientAge}años`,
        suggestedRange: { min: rules.typicalMin, max: ageMax, unit: rules.unit }, factors };
    }
  }

  // Ajuste renal (cuando las reglas definen rangos de eGFR y se proporciona eGFR)
  if (rules.renalAdjusted && renalFunction !== undefined) {
    factors.push('renal');
    const renalMax = rules.getRenalAdjustedMax(renalFunction);
    if (dose > renalMax) {
      return { valid: false, message: `Excede el máximo ajustado por función renal para eGFR ${renalFunction}`,
        suggestedRange: { min: rules.typicalMin, max: renalMax, unit: rules.unit }, factors };
    }
  }

  // Máximo absoluto
  if (dose > rules.absoluteMax) {
    return { valid: false, message: `Excede el máximo absoluto ${rules.absoluteMax}${rules.unit}`,
      suggestedRange: { min: rules.typicalMin, max: rules.absoluteMax, unit: rules.unit },
      factors: [...factors, 'absolute_max'] };
  }
  return { valid: true, message: 'Dentro del rango',
    suggestedRange: { min: rules.typicalMin, max: rules.typicalMax, unit: rules.unit }, factors };
}

Puntuación Clínica: NEWS2

interface NEWS2Input {
  respiratoryRate: number; oxygenSaturation: number; supplementalOxygen: boolean;
  temperature: number; systolicBP: number; heartRate: number;
  consciousness: 'alert' | 'voice' | 'pain' | 'unresponsive';
}
interface NEWS2Result {
  total: number;           // 0-20
  risk: 'low' | 'low-medium' | 'medium' | 'high';
  components: Record<string, number>;
  escalation: string;
}

Las tablas de puntuación deben coincidir exactamente con la especificación del Royal College of Physicians.

Gravedad de Alerta y Comportamiento UI

GravedadComportamiento UIAcción Clínica Requerida
CríticaBloquear acción. Modal no descartable. Rojo.Debe documentar el motivo de anulación para continuar
MayorBanner de advertencia en línea. Naranja.Debe reconocer antes de continuar
MenorNota informativa en línea. Amarillo.Solo conciencia, no se requiere acción

Las alertas críticas NUNCA deben descartarse automáticamente ni implementarse como notificaciones toast. Los motivos de anulación deben almacenarse en el registro de auditoría.

Pruebas de SADC (Tolerancia Cero a Falsos Negativos)

describe('SADC — Seguridad del Paciente', () => {
  INTERACTION_PAIRS.forEach(({ drugA, drugB, severity }) => {
    it(`detecta ${drugA} + ${drugB} (${severity})`, () => {
      const alerts = checkInteractions(drugA, [drugB], []);
      expect(alerts.length).toBeGreaterThan(0);
      expect(alerts[0].severity).toBe(severity);
    });
    it(`detecta ${drugB} + ${drugA} (inverso)`, () => {
      const alerts = checkInteractions(drugB, [drugA], []);
      expect(alerts.length).toBeGreaterThan(0);
    });
  });
  it('bloquea fármaco mg/kg cuando falta el peso', () => {
    const result = validateDose('gentamicin', 300, 'iv');
    expect(result.valid).toBe(false);
    expect(result.factors).toContain('weight_missing');
  });
  it('maneja datos de fármaco mal formados con gracia', () => {
    expect(() => checkInteractions('', [], [])).not.toThrow();
  });
});

Criterio de aprobación: 100%. Una sola interacción omitida es un evento de seguridad del paciente.

Anti-Patrones

  • Hacer que las comprobaciones SADC sean opcionales o se puedan omitir sin una razón documentada
  • Implementar comprobaciones de interacción como notificaciones toast
  • Usar tipos any para datos de fármacos o clínicos
  • Codificar pares de interacción en lugar de usar una estructura de datos mantenible
  • Capturar errores silenciosamente en el motor SADC (debe mostrar fallos en voz alta)
  • Omitir la validación basada en peso cuando no está disponible el peso (debe bloquear, no pasar)

Ejemplos

Ejemplo 1: Comprobación de Interacción Farmacológica

const alerts = checkInteractions('warfarin', ['aspirin', 'metformin'], ['penicillin']);
// [{ severity: 'critical', pair: ['warfarin', 'aspirin'],
//    message: 'Riesgo aumentado de sangrado', recommendation: 'Evitar la combinación' }]

Ejemplo 2: Validación de Dosis

const ok = validateDose('paracetamol', 1000, 'oral', 70, 45);
// { valid: true, suggestedRange: { min: 500, max: 4000, unit: 'mg' } }

const bad = validateDose('paracetamol', 5000, 'oral', 70, 45);
// { valid: false, message: 'Excede el máximo absoluto 4000mg' }

const noWeight = validateDose('gentamicin', 300, 'iv');
// { valid: false, factors: ['weight_missing'] }

Ejemplo 3: Puntuación NEWS2

const result = calculateNEWS2({
  respiratoryRate: 24, oxygenSaturation: 93, supplementalOxygen: true,
  temperature: 38.5, systolicBP: 100, heartRate: 110, consciousness: 'voice'
});
// { total: 13, risk: 'high', escalation: 'Revisión clínica urgente. Considerar UCI.' }

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

Skills relacionados