Discuss litigation and how to avoid it in surgery- from standard literature like sabiston/bailey , if possible in an easy memorable format/Table in a downloadable one page pdf/image.
mkdir -p /tmp/workspace/litigation-surgery && ls /tmp/workspace/
~/litigation-surgery/make_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.platypus import (SimpleDocTemplate, Table, TableStyle, Paragraph,
Spacer, HRFlowable)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import KeepTogether
OUTPUT = "/tmp/workspace/litigation-surgery/Litigation_in_Surgery.pdf"
# --- Color palette ---
DARK_BLUE = colors.HexColor("#1a3a5c")
MID_BLUE = colors.HexColor("#2e6da4")
LIGHT_BLUE = colors.HexColor("#d6e8f7")
ORANGE = colors.HexColor("#e8813a")
LIGHT_ORANGE= colors.HexColor("#fde9d5")
GREEN = colors.HexColor("#2a7a4b")
LIGHT_GREEN = colors.HexColor("#d5eed9")
RED = colors.HexColor("#c0392b")
LIGHT_RED = colors.HexColor("#fde8e6")
YELLOW_BG = colors.HexColor("#fffbe6")
GRAY_LIGHT = colors.HexColor("#f5f5f5")
GRAY_MID = colors.HexColor("#d0d0d0")
WHITE = colors.white
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=1.2*cm, rightMargin=1.2*cm,
topMargin=1.0*cm, bottomMargin=1.0*cm
)
styles = getSampleStyleSheet()
title_style = ParagraphStyle("Title", parent=styles["Normal"],
fontSize=15, fontName="Helvetica-Bold", textColor=WHITE,
alignment=TA_CENTER, spaceAfter=2)
subtitle_style = ParagraphStyle("Sub", parent=styles["Normal"],
fontSize=8, fontName="Helvetica-Oblique", textColor=WHITE,
alignment=TA_CENTER, spaceAfter=1)
section_style = ParagraphStyle("Sec", parent=styles["Normal"],
fontSize=9, fontName="Helvetica-Bold", textColor=DARK_BLUE,
alignment=TA_LEFT, spaceBefore=3, spaceAfter=1)
cell_head = ParagraphStyle("CH", parent=styles["Normal"],
fontSize=8.5, fontName="Helvetica-Bold", textColor=WHITE, alignment=TA_CENTER)
cell_body = ParagraphStyle("CB", parent=styles["Normal"],
fontSize=7.5, fontName="Helvetica", textColor=colors.black,
alignment=TA_LEFT, leading=10)
cell_body_center = ParagraphStyle("CBC", parent=styles["Normal"],
fontSize=7.5, fontName="Helvetica", textColor=colors.black,
alignment=TA_CENTER, leading=10)
mnemonic_style = ParagraphStyle("Mn", parent=styles["Normal"],
fontSize=9, fontName="Helvetica-Bold", textColor=ORANGE,
alignment=TA_CENTER, spaceBefore=2, spaceAfter=1)
footer_style = ParagraphStyle("Ft", parent=styles["Normal"],
fontSize=6.5, fontName="Helvetica-Oblique", textColor=colors.HexColor("#666666"),
alignment=TA_CENTER)
box_head = ParagraphStyle("BH", parent=styles["Normal"],
fontSize=8.5, fontName="Helvetica-Bold", textColor=DARK_BLUE,
alignment=TA_LEFT)
box_body = ParagraphStyle("BB", parent=styles["Normal"],
fontSize=7.5, fontName="Helvetica", textColor=colors.black,
alignment=TA_LEFT, leading=10)
# =====================================================================
# HELPER
# =====================================================================
def hdr(txt, color=MID_BLUE):
return Paragraph(f'<font color="white"><b>{txt}</b></font>', cell_head)
def cell(txt, bold=False):
tag = "b" if bold else "font"
if bold:
return Paragraph(f"<b>{txt}</b>", cell_body)
return Paragraph(txt, cell_body)
def cellc(txt):
return Paragraph(txt, cell_body_center)
W = A4[0] - 2.4*cm # usable width
story = []
# =====================================================================
# TITLE BANNER
# =====================================================================
title_table = Table([[
Paragraph("LITIGATION IN SURGERY", title_style),
Paragraph("Principles, Pitfalls & Prevention", subtitle_style)
]], colWidths=[W*0.65, W*0.35])
title_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("BOX", (0,0), (-1,-1), 0, DARK_BLUE),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
]))
story.append(title_table)
story.append(Spacer(1, 3*mm))
# =====================================================================
# SECTION 1 — DEFINITION & LEGAL FRAMEWORK (3-col table)
# =====================================================================
story.append(Paragraph("1. LEGAL FRAMEWORK — THE 4 Ds OF NEGLIGENCE", section_style))
four_d_data = [
[hdr("DUTY"), hdr("DERELICTION"), hdr("DAMAGE"), hdr("DIRECT CAUSATION")],
[
cell("Doctor-patient relationship established; obligation to meet standard of care"),
cell("Failure to meet that standard (below what a reasonable surgeon of similar training would do)"),
cell("Actual harm/injury suffered by the patient"),
cell("Dereliction directly & proximately caused the damage")
]
]
four_d = Table(four_d_data, colWidths=[W/4]*4)
four_d.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("BACKGROUND", (0,1), (-1,-1), LIGHT_BLUE),
("BOX", (0,0), (-1,-1), 0.5, GRAY_MID),
("INNERGRID", (0,0), (-1,-1), 0.3, GRAY_MID),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
]))
story.append(four_d)
story.append(Spacer(1, 2*mm))
# =====================================================================
# SECTION 2 — COMMON CAUSES (SURGICAL SPECIALTIES) — color table
# =====================================================================
story.append(Paragraph("2. COMMON CAUSES OF LITIGATION IN SURGERY (Essentials of Forensic Medicine & Toxicology / Schwartz / Parikh)", section_style))
cause_data = [
[hdr("SPECIALTY", MID_BLUE), hdr("TOP CAUSES OF CLAIMS", MID_BLUE)],
[cell("General Surgery", bold=True),
cell("Retained foreign body (swab/instrument) • Wrong patient/site/side/organ • Delayed diagnosis (acute abdomen) • Accidental ligation (e.g. CBD during gastrectomy) • Bowel perforation • Diathermy burns • Failure to biopsy")],
[cell("Anaesthesia", bold=True),
cell("No informed consent • Failure to examine/take history • Awareness under GA • Hypoxic brain damage • Blood transfusion error • Broken spinal needle left in situ • Peripheral nerve damage from positioning/splinting")],
[cell("Orthopaedics", bold=True),
cell("Missed fractures (scaphoid, NOF, cervical spine) • Overtight plaster cast • Missed foreign body • Sciatic palsy after hip surgery • Failure to admit when indicated")],
[cell("Obstetrics & Gynaecology", bold=True),
cell("Neonatal hypoxic brain damage (prolonged labour) • Failed sterilisation without proper warning • Ureteric ligation / VVF during hysterectomy • Perinatal death")],
[cell("Neurosurgery / Plastic Surgery", bold=True),
cell("Undiagnosed intracranial haemorrhage • Failure to use ophthalmoscope in head injury • Inadequate informed consent for cosmetic outcome")]
]
cause_col = [W*0.22, W*0.78]
cause_t = Table(cause_data, colWidths=cause_col)
cause_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), MID_BLUE),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GRAY_LIGHT]),
("BOX", (0,0), (-1,-1), 0.5, GRAY_MID),
("INNERGRID", (0,0), (-1,-1), 0.3, GRAY_MID),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
]))
story.append(cause_t)
story.append(Spacer(1, 2*mm))
# =====================================================================
# SECTION 3 — HOW TO AVOID LITIGATION (main table, color-coded)
# =====================================================================
story.append(Paragraph("3. HOW TO AVOID LITIGATION — THE C-A-R-E-S FRAMEWORK", section_style))
story.append(Paragraph("C = Consent | A = Accurate documentation | R = Recognised standard | E = Early communication | S = System checks", mnemonic_style))
avoid_data = [
[hdr("PILLAR", DARK_BLUE), hdr("KEY ACTIONS", DARK_BLUE), hdr("COMMON PITFALL", DARK_BLUE)],
# C
[cell("C CONSENT", bold=True),
cell("• Obtain valid INFORMED consent — discuss risks, benefits, alternatives, uncertainties\n"
"• Document consent discussion in notes + signed form\n"
"• Warn specifically: e.g. failed vasectomy may not guarantee sterility\n"
"• Re-consent if procedure changes significantly"),
cell("Consent taken by junior doctor; risks not individualised; no documentation of discussion")],
# A
[cell("A ACCURATE RECORDS", bold=True),
cell("• Write clear, timed, legible operation notes\n"
"• Document ALL clinical decisions and reasons\n"
"• Record pre-op examination & investigations\n"
"• Instrument/swab counts documented & verified\n"
"• Discharge summary with follow-up plan"),
cell("Illegible, incomplete or retrospectively altered notes are the single biggest medicolegal risk")],
# R
[cell("R RECOGNISED STANDARD OF CARE", bold=True),
cell("• Follow evidence-based guidelines (NICE, RCS, specialty societies)\n"
"• Do not exceed your competence — refer/consult when uncertain\n"
"• Ensure appropriate supervision of trainees\n"
"• Document deviation from guidelines with clinical reasons"),
cell("Failure to refer or consult a specialist when indicated; undertrained operator doing complex procedure")],
# E
[cell("E EARLY & HONEST COMMUNICATION", bold=True),
cell("• Disclose complications promptly and honestly (duty of candour)\n"
"• Apologise — an apology is NOT an admission of liability\n"
"• Involve patient in management of complication\n"
"• Document all discussions about adverse events"),
cell("Delay, evasion, or apparent cover-up dramatically increases likelihood of litigation")],
# S
[cell("S SYSTEM SAFETY CHECKS", bold=True),
cell("• WHO Surgical Safety Checklist (Sign In, Time Out, Sign Out)\n"
"• Mark operative site before anaesthesia\n"
"• Confirm patient identity and procedure at every step\n"
"• Instrument/swab/needle counts before closure\n"
"• Post-op handover with clear instructions"),
cell("Wrong-site, wrong-patient & retained foreign body are the most preventable sentinel events")]
]
avoid_col = [W*0.16, W*0.52, W*0.32]
avoid_t = Table(avoid_data, colWidths=avoid_col)
avoid_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
# Alternate row colours by pillar
("BACKGROUND", (0,1), (-1,1), LIGHT_BLUE),
("BACKGROUND", (0,2), (-1,2), LIGHT_GREEN),
("BACKGROUND", (0,3), (-1,3), LIGHT_ORANGE),
("BACKGROUND", (0,4), (-1,4), LIGHT_RED),
("BACKGROUND", (0,5), (-1,5), YELLOW_BG),
("BOX", (0,0), (-1,-1), 0.5, GRAY_MID),
("INNERGRID", (0,0), (-1,-1), 0.3, GRAY_MID),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
]))
story.append(avoid_t)
story.append(Spacer(1, 2*mm))
# =====================================================================
# SECTION 4 — BOTTOM ROW: RES IPSA LOQUITUR + QUICK MEMORY BOX
# =====================================================================
# Left: Res Ipsa Loquitur
res_ipsa_data = [
[Paragraph("<b>RES IPSA LOQUITUR</b><br/><i>\"The thing speaks for itself\"</i>", box_head)],
[Paragraph(
"Applies when negligence is <b>self-evident</b> from the facts alone — no expert needed to prove breach of duty.<br/>"
"Classic surgical examples:<br/>"
"• Retained swab / instrument in abdomen<br/>"
"• Operation on wrong limb or organ<br/>"
"• Wrong-patient surgery<br/>"
"<b>Burden of proof SHIFTS to the defendant surgeon.</b>",
box_body)]
]
res_t = Table(res_ipsa_data, colWidths=[W*0.42])
res_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), LIGHT_BLUE),
("BACKGROUND", (0,1), (-1,-1), WHITE),
("BOX", (0,0), (-1,-1), 1, MID_BLUE),
("INNERGRID", (0,0), (-1,-1), 0.3, GRAY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
]))
# Right: Memory mnemonic
memo_data = [
[Paragraph("<b>MEMORY AID: D-O-C-T-O-R</b>", box_head)],
[Paragraph(
"<b>D</b> ocument everything (records, consent, discussions)<br/>"
"<b>O</b> btain proper informed consent every time<br/>"
"<b>C</b> heck — WHO checklist, site marking, swab counts<br/>"
"<b>T</b> alk to the patient: disclose, apologise, communicate<br/>"
"<b>O</b> perate within your competence; refer when in doubt<br/>"
"<b>R</b> efer to guidelines; never deviate without reason",
box_body)]
]
memo_t = Table(memo_data, colWidths=[W*0.42])
memo_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), LIGHT_GREEN),
("BACKGROUND", (0,1), (-1,-1), WHITE),
("BOX", (0,0), (-1,-1), 1, GREEN),
("INNERGRID", (0,0), (-1,-1), 0.3, GRAY_MID),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
]))
bottom_row = Table([[res_t, Spacer(W*0.08, 1), memo_t]],
colWidths=[W*0.46, W*0.08, W*0.46])
bottom_row.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 0),
]))
story.append(bottom_row)
story.append(Spacer(1, 2*mm))
# =====================================================================
# FOOTER
# =====================================================================
story.append(HRFlowable(width="100%", thickness=0.5, color=GRAY_MID))
story.append(Paragraph(
"Sources: Essentials of Forensic Medicine & Toxicology 36e (2026) • Parikh's Textbook of Medical Jurisprudence • "
"Schwartz's Principles of Surgery 11e • Sabiston Textbook of Surgery • "
"Morgan & Mikhail's Clinical Anaesthesiology 7e | For educational use only.",
footer_style))
doc.build(story)
print("PDF created:", OUTPUT)
python /tmp/workspace/litigation-surgery/make_pdf.py 2>&1
Litigation in Surgery
PDF Document · PDF
| D | Meaning |
|---|---|
| Duty | A doctor-patient relationship existed |
| Dereliction | Care fell below the standard a reasonable surgeon of similar training would provide |
| Damage | Actual harm occurred |
| Direct causation | The dereliction directly caused that harm |
| Letter | Pillar | Key Actions |
|---|---|---|
| C | Consent | Valid informed consent every time; document the discussion, not just the signature; warn of specific uncertainties (e.g. failed vasectomy not 100%) |
| A | Accurate Records | Timed, legible op notes; document decisions + reasons; swab/instrument count recorded |
| R | Recognised Standard | Follow guidelines; refer/consult when at the edge of competence; supervise trainees properly |
| E | Early Communication | Duty of candour - disclose complications promptly; apologise (an apology is NOT admission of liability) |
| S | System Safety Checks | WHO Surgical Safety Checklist (Sign In / Time Out / Sign Out); site marking; patient identity confirmation |