Skip to main content

Nigeria Health Pack

Overview

NigeriaHealthcareCompliance enforces Nigerian healthcare AI regulations simultaneously, including patient consent, clinical oversight requirements, and special-category health data restrictions under the NDPA.

from comply54.sectors import NigeriaHealthcareCompliance

compliance = NigeriaHealthcareCompliance()
result = compliance.check(
action="generate_diagnosis",
params={"patient_id": "P001", "symptoms": ["fever", "headache"]},
context={"human_clinician_oversight": True, "consent_documented": True},
)

Included packs

Pack IDRegulationAuthorityKey controls
nigeria/nhaNational Health Act 2014FMOHPatient consent (§26), confidentiality (§29), prescription prohibition (§30), cross-border health data
nigeria/ndpaNDPA 2023 — special-categoryNITDAHealth data as special-category, cross-border restrictions (§25), consent
nigeria/bvn-ninBVN/NIN FrameworkCBN/NIMCBiometric PII detection in outputs
universal/pii-leakageOWASP LLM01OWASPPatient ID, health record numbers, diagnoses in outputs
universal/prompt-injectionOWASP LLM01OWASPJailbreak and indirect injection patterns
universal/tool-permissionsOWASP LLM08OWASPExcessive tool scope, unauthorised record access
universal/human-approvalOWASP LLM08OWASPIrreversible clinical actions require human sign-off

Decision matrix by action type

Patient data access

ConditionDecisionReason
consent_documented = trueallow / further checksNHA §26 consent present
consent_documented = falsedenyNHA §26: patient consent required before accessing health records
Cross-border, health datadenyNDPA §25 + NHA §29: health data is special-category
Bulk access > 10 recordsescalateNHA §29: bulk health record access requires escalation

AI diagnosis

ConditionDecisionReason
human_clinician_oversight = trueescalateFMOH AI Policy Guideline 4: clinician sign-off required
human_clinician_oversight = falsedenyFMOH Guideline 4: AI diagnosis without clinician oversight prohibited

Prescriptions

ConditionDecisionReason
licensed_clinician_approval = trueallowMDP Act Cap M8 §16 met
licensed_clinician_approval = falsedenyNHA §30 + MDP Act §16: only licensed clinicians may prescribe

Research / analytics

ConditionDecisionReason
Purpose = researchescalateNHA §29: IRB/ethics approval required for research use
Purpose = treatmentStandard checksNormal clinical workflow

Usage

Standalone check

from comply54.sectors import NigeriaHealthcareCompliance

compliance = NigeriaHealthcareCompliance()

# Access patient records — consent required
result = compliance.check(
action="access_patient_records",
params={"patient_id": "P001", "record_type": "full_history"},
context={"consent_documented": True},
)

if result.blocked:
print(result.primary_violation.messages[0])
elif result.overall == "escalate":
print(f"Escalation required — audit ID: {result.audit_id}")

With LangGraph (ReAct agent)

from comply54.sectors import NigeriaHealthcareCompliance
from comply54.langchain import Comply54Guard, comply54_route
from langgraph.graph import StateGraph, MessagesState
from langgraph.prebuilt import ToolNode

compliance = NigeriaHealthcareCompliance()
tools = [access_patient_records_tool, generate_diagnosis_tool, prescribe_medication_tool]
guard = Comply54Guard(compliance, tools)

def build_graph():
graph = StateGraph(MessagesState)
graph.add_node("agent", agent_node)
graph.add_node("guard", guard)
graph.add_node("tools", ToolNode(tools))

graph.set_entry_point("agent")
graph.add_conditional_edges("agent", comply54_route, {"guard": "guard", "__end__": "__end__"})
graph.add_edge("guard", "tools")
graph.add_edge("tools", "agent")
return graph.compile()

# Pass clinical context via compliance_context state key
result = build_graph().invoke({
"messages": [("user", "Generate a diagnosis for patient P001")],
"compliance_context": {
"consent_documented": True,
"human_clinician_oversight": False, # will be denied by FMOH Guideline 4
},
})

Strict mode

In strict mode, escalate decisions are upgraded to deny — no clinical action proceeds without full human approval:

compliance = NigeriaHealthcareCompliance(strict_mode=True)

Accessing all decisions

result = compliance.check(
action="generate_diagnosis",
params={"patient_id": "P001"},
context={"human_clinician_oversight": True, "consent_documented": True},
)

for decision in result.decisions:
status = "✓" if decision.action == "allow" else "!"
print(f"{status} {decision.pack}: {decision.action}")
for msg in decision.messages:
print(f" {msg}")

Properties

compliance = NigeriaHealthcareCompliance()
compliance.name # "Nigeria Healthcare Compliance"
compliance.jurisdictions # ["NG"]
len(compliance.packs) # 7