--- name: cva-healthcare-compliance description: Brazilian healthcare compliance for regulated medical and psychological content. Includes LGPD data protection, CFM/CRP/ANVISA regulatory requirements, scientific research validation, and data sanitization. Use when developing healthcare applications, ensuring LGPD compliance, validating medical content, implementing data protection, or creating regulated healthcare systems in Brazil. allowed-tools: Read,Bash,Edit,Write --- # Healthcare Compliance for Brazil > **⚠️ COMPLIANCE WARNING:** This skill covers regulated healthcare content in Brazil > **Regulations:** LGPD, CFM (Conselho Federal de Medicina), CRP (Conselho Regional de Psicologia), ANVISA > **Last Updated:** 2025-10-29 ## 🎯 Overview Healthcare content in Brazil is subject to strict regulatory oversight from multiple authorities. This skill provides comprehensive compliance frameworks for: - **LGPD Compliance**: Data protection for sensitive health information - **CFM/CRP Regulations**: Professional council requirements for medical and psychological content - **ANVISA Standards**: Health surveillance requirements for medications and procedures - **Scientific Validation**: Evidence-based content requirements and research protocols - **Data Sanitization**: Technical implementation of privacy protection ## 🔒 LGPD Data Protection Requirements ### Sensitive Health Data Categories (Art. 5º, II, LGPD) ```clojure (ns lab.compliance.lgpd.health-data "LGPD-compliant health data classification and handling") (def sensitive-data-categories {:category-1-clinical-direct {:level :critical :types [:diagnoses :lab-results :imaging :prescriptions :treatment-history :allergies :adverse-reactions] :retention-days 90 :encryption-required true} :category-2-biometric {:level :critical :types [:fingerprints :facial-recognition :iris :voice :unique-physical-characteristics] :retention-days 30 :encryption-required true} :category-3-genetic {:level :critical :types [:genetic-sequencing :paternity-tests :genetic-predispositions :hereditary-info] :retention-days 180 :encryption-required true} :category-4-behavioral {:level :high :types [:eating-habits :substance-use :physical-activity :sleep-patterns :mental-health] :retention-days 60 :encryption-required true} :category-5-indirect-identification {:level :medium :types [:appointment-locations :visit-frequency :family-relationships :insurance-plans :payment-history] :retention-days 30 :encryption-required false}}) (defn classify-data-sensitivity "Classify health data by sensitivity level and compliance requirements" [data-type] (some (fn [[category config]] (when (some #{data-type} (:types config)) (assoc config :category category))) sensitive-data-categories)) (defn requires-encryption? "Check if data type requires encryption under LGPD" [data-type] (:encryption-required (classify-data-sensitivity data-type))) ``` ### Legal Bases for Health Data Processing ```clojure (def lgpd-legal-bases {:life-protection {:article "Art. 7º, III" :description "Protection of life or physical safety" :requires-consent false :use-cases [:emergency-care :critical-interventions]} :health-protection {:article "Art. 11, II, a" :description "Health protection in procedures by health professionals" :requires-consent false :use-cases [:medical-diagnosis :treatment :health-services]} :public-interest {:article "Art. 7º, III" :description "Public interest for public health policy execution" :requires-consent false :use-cases [:epidemiology :public-health :health-surveillance]} :specific-consent {:article "Art. 11, I" :description "Specific and highlighted consent" :requires-consent true :use-cases [:research :marketing :data-sharing]}}) (defn validate-legal-basis "Validate if operation has proper legal basis under LGPD" [operation-type context] (let [basis (get lgpd-legal-bases operation-type)] {:valid? (not (nil? basis)) :requires-consent? (:requires-consent basis) :article (:article basis) :applicable-use-cases (:use-cases basis)})) ``` ### Data Subject Rights Implementation ```clojure (ns lab.compliance.lgpd.subject-rights "Implementation of LGPD data subject rights") (def subject-rights {:access {:deadline-days 15 :description "Access to personal data" :implementation-required [:data-export :readable-format]} :correction {:deadline-days 10 :description "Correction of incomplete, inaccurate, or outdated data" :implementation-required [:update-interface :validation :audit-trail]} :deletion {:deadline-days 15 :description "Deletion of unnecessary or excessive data" :implementation-required [:soft-delete :anonymization :retention-policies]} :portability {:deadline-days 20 :description "Data portability to another service provider" :implementation-required [:structured-export :machine-readable :common-formats]} :information {:deadline-days 15 :description "Information about data sharing with public and private entities" :implementation-required [:sharing-log :third-party-tracking :consent-records]}}) (defn handle-subject-request "Process data subject rights request according to LGPD requirements" [request-type patient-id] (let [right (get subject-rights request-type) deadline (java.time.LocalDate/now) deadline (.plusDays deadline (:deadline-days right))] {:request-type request-type :patient-id patient-id :deadline deadline :required-actions (:implementation-required right) :status :pending})) ``` ### Data Sanitization and Anonymization ```clojure (ns lab.compliance.lgpd.sanitization "Data sanitization and anonymization utilities") (def pii-patterns {:cpf #"\d{3}\.\d{3}\.\d{3}-\d{2}" :cpf-unformatted #"\d{11}" :rg #"\d{1,2}\.\d{3}\.\d{3}-[\dXx]" :phone #"\(?\d{2}\)?\s?\d{4,5}-?\d{4}" :email #"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" :cep #"\d{5}-?\d{3}" :full-name #"\b[A-Z][a-z]+\s+([A-Z][a-z]+\s+)*[A-Z][a-z]+\b" :date-birth #"\d{2}/\d{2}/\d{4}" :medical-record #"(?i)prontu[aá]rio\s*:?\s*\d+"}) (defn sanitize-text "Remove or mask PII from text content" [text mask-char] (reduce (fn [sanitized [type pattern]] (clojure.string/replace sanitized pattern (fn [match] (case type :cpf "***.***.***-**" :email (str (subs match 0 2) "***@***" (subs match (clojure.string/last-index-of match "."))) :phone "(XX) XXXXX-XXXX" (apply str (repeat (count match) mask-char)))))) text pii-patterns)) (defn anonymize-patient-data "Anonymize patient data for research or analytics" [patient-data] {:patient-id (generate-anonymous-id (:patient-id patient-data)) :age-range (age-to-range (:age patient-data)) :gender (:gender patient-data) :region (location-to-region (:location patient-data)) :condition-category (generalize-condition (:diagnosis patient-data)) :treatment-type (generalize-treatment (:treatment patient-data))}) (defn validate-anonymization "Validate that anonymized data cannot be re-identified" [anonymized-data original-count] (let [k-anonymity-threshold 5 unique-combinations (count-unique-combinations anonymized-data)] {:k-anonymity (/ original-count unique-combinations) :meets-threshold? (>= (/ original-count unique-combinations) k-anonymity-threshold) :risk-level (if (< unique-combinations 5) :high :acceptable)})) ``` ### LGPD Compliance Checklist ```clojure (ns lab.compliance.lgpd.checklist "LGPD compliance validation checklist") (def compliance-requirements {:technical-security-measures [{:id "SEC-001" :requirement "Implement encryption for sensitive health data at rest" :regulation "Art. 46, LGPD" :severity :critical :validation-fn #(check-encryption-at-rest %)} {:id "SEC-002" :requirement "Implement encryption for data in transit (TLS 1.2+)" :regulation "Art. 46, LGPD" :severity :critical :validation-fn #(check-tls-version %)} {:id "SEC-003" :requirement "Implement access control and authentication" :regulation "Art. 46, LGPD" :severity :critical :validation-fn #(check-access-control %)} {:id "SEC-004" :requirement "Implement audit logging for data access" :regulation "Art. 37, LGPD" :severity :high :validation-fn #(check-audit-logs %)}] :administrative-measures [{:id "ADM-001" :requirement "Maintain processing activity records" :regulation "Art. 37, LGPD" :severity :high :validation-fn #(check-processing-records %)} {:id "ADM-002" :requirement "Conduct privacy impact assessment (DPIA)" :regulation "Art. 38, LGPD" :severity :high :validation-fn #(check-dpia-exists %)} {:id "ADM-003" :requirement "Designate Data Protection Officer (DPO) if required" :regulation "Art. 41, LGPD" :severity :medium :validation-fn #(check-dpo-designation %)}] :incident-response [{:id "INC-001" :requirement "Notify ANPD of data breaches within 72 hours" :regulation "Art. 48, LGPD" :severity :critical :validation-fn #(check-notification-procedure %)} {:id "INC-002" :requirement "Notify affected data subjects of breaches" :regulation "Art. 48, II, LGPD" :severity :critical :validation-fn #(check-subject-notification-procedure %)}] :subject-rights [{:id "SUB-001" :requirement "Implement data access request mechanism" :regulation "Art. 18, LGPD" :severity :high :validation-fn #(check-access-mechanism %)} {:id "SUB-002" :requirement "Implement data deletion mechanism" :regulation "Art. 18, VI, LGPD" :severity :high :validation-fn #(check-deletion-mechanism %)} {:id "SUB-003" :requirement "Implement data portability mechanism" :regulation "Art. 18, V, LGPD" :severity :medium :validation-fn #(check-portability-mechanism %)}]}) (defn validate-compliance "Validate system against LGPD requirements" [system-config] (let [all-checks (flatten (vals compliance-requirements)) results (map (fn [check] (assoc check :result ((:validation-fn check) system-config))) all-checks)] {:total-checks (count results) :passed (count (filter #(:result %) results)) :critical-failures (filter #(and (= :critical (:severity %)) (not (:result %))) results) :all-results results})) ``` ## 🏥 CFM/CRP Professional Council Requirements ### Mandatory Disclaimers ```clojure (ns lab.compliance.councils.disclaimers "CFM and CRP required disclaimers for healthcare content") (def disclaimer-templates {:cfm-general {:urgency :critical :applies-to [:diagnoses :medications :invasive-procedures :contraindications] :text "As informações apresentadas não substituem a consulta médica. Sempre procure um profissional médico qualificado para diagnóstico e tratamento adequados." :placement :top :visual-style :warning} :cfm-specialized {:urgency :high :applies-to [:specialist-content :treatment-efficacy :medical-procedures] :text "Este conteúdo é de caráter informativo e não substitui a avaliação médica especializada. O diagnóstico e tratamento devem ser realizados por médico especialista na área." :placement :top :visual-style :info} :cfm-procedures {:urgency :critical :applies-to [:surgical-procedures :invasive-treatments :medical-devices] :text "Os procedimentos médicos mencionados possuem riscos e benefícios que devem ser avaliados individualmente. Consulte sempre um médico especializado." :placement :top-and-bottom :visual-style :warning} :crp-general {:urgency :high :applies-to [:mental-health :psychological-assessment :therapy-approaches] :text "As informações sobre saúde mental são de caráter educativo e não substituem a avaliação psicológica profissional. Procure um psicólogo registrado no CRP." :placement :top :visual-style :info} :crp-therapeutic {:urgency :high :applies-to [:therapy-techniques :psychological-interventions :self-help] :text "As abordagens terapêuticas mencionadas devem ser conduzidas por profissionais qualificados. Não pratique auto-terapia baseada nestas informações." :placement :top-and-bottom :visual-style :warning} :anvisa-medications {:urgency :critical :applies-to [:medication-info :drug-recommendations :prescription-drugs] :text "As informações sobre medicamentos são de caráter educativo. Não utilize medicamentos sem prescrição e orientação médica." :placement :top :visual-style :danger} :anvisa-procedures {:urgency :high :applies-to [:aesthetic-procedures :therapeutic-procedures :medical-devices] :text "Procedimentos estéticos e terapêuticos devem ser realizados por profissionais habilitados em estabelecimentos regularizados pela ANVISA." :placement :bottom :visual-style :info} :emergency-warning {:urgency :critical :applies-to [:all-medical-content] :text "Em caso de emergência médica, procure imediatamente um pronto-socorro ou ligue para o SAMU (192). Este conteúdo não oferece orientações para situações de urgência ou emergência médica." :placement :bottom :visual-style :danger} :results-disclaimer {:urgency :medium :applies-to [:treatment-outcomes :success-rates :before-after] :text "Os resultados podem variar individualmente e dependem de diversos fatores incluindo histórico médico, idade, estilo de vida e adesão ao tratamento. Não há garantia de resultados específicos." :placement :bottom :visual-style :info}}) (defn select-required-disclaimers "Select required disclaimers based on content type" [content-metadata] (let [content-type (:type content-metadata) topics (:topics content-metadata)] (filter (fn [[key config]] (some (set (:applies-to config)) topics)) disclaimer-templates))) (defn format-disclaimer-html "Format disclaimer as HTML with proper styling" [disclaimer-key config] (let [styles {:warning "background: #fff3cd; border-left: 4px solid #ffc107;" :danger "background: #f8d7da; border-left: 4px solid #dc3545;" :info "background: #e7f3ff; border: 1px solid #bee5eb;"} style (get styles (:visual-style config))] (str "
" (:text config) "
" "