Read this USg finding we will discuss
| Organ | Finding |
|---|---|
| Liver | Normal (size, echotexture, portal/hepatic veins, CBD) |
| Gallbladder | Two polyps - largest measuring 3 mm |
| Spleen | Normal outline and echotexture |
| Pancreas | Normal |
| Kidneys | Normal bilaterally (RT and LT) - size, echotexture, corticomedullary differentiation, parenchymal thickness, calyces/calicectasis all normal |
| Urinary Bladder | Normal |
| Uterus | Measures 7.5 x 4.5 x 4 cm, normal outline, echotexture and position. Endometrial thickness (ET) = 11 mm |
| Adnexae | Normal |
| Free fluid / Lymphadenopathy | Negative (circled - absent) |
| Others | Nil |
Risk factors etiopathogenesis of poly payholphysiology
gallbladder polyp etiopathogenesis risk factors
gallbladder polyp pathogenesis cholesterol
| Type | Frequency | Neoplastic? |
|---|---|---|
| Cholesterol polyp | ~60-70% | No |
| Inflammatory polyp | ~10% | No |
| Adenomyoma | ~25% | No |
| Adenoma | ~4% | Yes (pre-malignant) |
| Carcinoma | ~2% | Yes |

| Risk Factor | Mechanism |
|---|---|
| Female sex | Estrogen increases cholesterol secretion into bile; progesterone reduces GB motility |
| Obesity | Increases hepatic cholesterol secretion; frequency of ~38% in cholecystectomy specimens from bariatric patients |
| Age (middle age) | Risk increases with age up to 60; after 60, gender difference narrows |
| Western diet (high fat/cholesterol) | Increases biliary cholesterol load |
| Metabolic syndrome / Dyslipidemia | Elevated serum cholesterol drives supersaturation |
| Insulin resistance / Diabetes | Alters bile composition |
| Rapid weight loss | Cholesterol mobilized rapidly into bile |
| Prolonged fasting / TPN | Reduces GB emptying, stasis promotes deposition |
Create a clinical summary document on GB polyp surveillance & management guidelines
gallbladder polyp management surveillance guidelines
PMID: 40483673
PMID: 37226819
SRU 2022 gallbladder polyp surveillance consensus recommendations size criteria
mkdir -p /tmp/workspace/gb-polyp && ls /tmp/workspace/gb-polyp/
~/gb-polyp/build_doc.py
from docx import Document
from docx.shared import Pt, Inches, RGBColor, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_ALIGN_VERTICAL
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import datetime
doc = Document()
# ── Page margins ──────────────────────────────────────────────
section = doc.sections[0]
section.top_margin = Cm(2.0)
section.bottom_margin = Cm(2.0)
section.left_margin = Cm(2.5)
section.right_margin = Cm(2.5)
# ── Styles ────────────────────────────────────────────────────
normal_style = doc.styles['Normal']
normal_style.font.name = 'Calibri'
normal_style.font.size = Pt(11)
h1 = doc.styles['Heading 1']
h1.font.name = 'Calibri'
h1.font.size = Pt(16)
h1.font.bold = True
h1.font.color.rgb = RGBColor(0x1F, 0x49, 0x7D)
h2 = doc.styles['Heading 2']
h2.font.name = 'Calibri'
h2.font.size = Pt(13)
h2.font.bold = True
h2.font.color.rgb = RGBColor(0x2E, 0x74, 0xB5)
h3 = doc.styles['Heading 3']
h3.font.name = 'Calibri'
h3.font.size = Pt(11)
h3.font.bold = True
h3.font.color.rgb = RGBColor(0x1F, 0x49, 0x7D)
# ── Helper functions ──────────────────────────────────────────
def add_colored_para(doc, text, bg_hex, font_size=10.5, bold=False):
"""Add a paragraph with background shading."""
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(4)
p.paragraph_format.space_after = Pt(4)
p.paragraph_format.left_indent = Inches(0.1)
run = p.add_run(text)
run.font.name = 'Calibri'
run.font.size = Pt(font_size)
run.bold = bold
# shading
pPr = p._p.get_or_add_pPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), bg_hex)
pPr.append(shd)
return p
def set_cell_bg(cell, hex_color):
tc = cell._tc
tcPr = tc.get_or_add_tcPr()
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), hex_color)
tcPr.append(shd)
def set_cell_text(cell, text, bold=False, font_size=10, color_rgb=None, align=WD_ALIGN_PARAGRAPH.LEFT):
cell.text = ''
p = cell.paragraphs[0]
p.alignment = align
run = p.add_run(text)
run.font.name = 'Calibri'
run.font.size = Pt(font_size)
run.bold = bold
if color_rgb:
run.font.color.rgb = color_rgb
def add_bullet(doc, text, level=0, bold_prefix=None):
p = doc.add_paragraph(style='List Bullet')
p.paragraph_format.left_indent = Inches(0.25 + level * 0.25)
p.paragraph_format.space_after = Pt(2)
if bold_prefix:
run = p.add_run(bold_prefix)
run.bold = True
run.font.name = 'Calibri'
run.font.size = Pt(11)
p.add_run(text).font.name = 'Calibri'
else:
run = p.add_run(text)
run.font.name = 'Calibri'
run.font.size = Pt(11)
return p
def add_hr(doc):
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(4)
p.paragraph_format.space_after = Pt(4)
pPr = p._p.get_or_add_pPr()
pBdr = OxmlElement('w:pBdr')
bottom = OxmlElement('w:bottom')
bottom.set(qn('w:val'), 'single')
bottom.set(qn('w:sz'), '6')
bottom.set(qn('w:space'), '1')
bottom.set(qn('w:color'), '2E74B5')
pBdr.append(bottom)
pPr.append(pBdr)
# ══════════════════════════════════════════════════════════════
# COVER BLOCK
# ══════════════════════════════════════════════════════════════
title_p = doc.add_paragraph()
title_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
title_run = title_p.add_run('GALLBLADDER POLYPS')
title_run.font.name = 'Calibri'
title_run.font.size = Pt(22)
title_run.bold = True
title_run.font.color.rgb = RGBColor(0x1F, 0x49, 0x7D)
sub_p = doc.add_paragraph()
sub_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
sub_run = sub_p.add_run('Clinical Summary: Surveillance & Management Guidelines')
sub_run.font.name = 'Calibri'
sub_run.font.size = Pt(14)
sub_run.font.color.rgb = RGBColor(0x2E, 0x74, 0xB5)
meta_p = doc.add_paragraph()
meta_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
meta_run = meta_p.add_run(f'Prepared by Orris AI | Date: {datetime.date.today().strftime("%d %B %Y")} | Based on SRU 2022, European 2022, CAR 2025/2026 Guidelines')
meta_run.font.name = 'Calibri'
meta_run.font.size = Pt(9)
meta_run.font.color.rgb = RGBColor(0x80, 0x80, 0x80)
meta_run.italic = True
add_hr(doc)
doc.add_paragraph() # spacer
# ══════════════════════════════════════════════════════════════
# SECTION 1 - DEFINITION & EPIDEMIOLOGY
# ══════════════════════════════════════════════════════════════
doc.add_heading('1. Definition & Epidemiology', level=1)
add_colored_para(doc,
'A gallbladder (GB) polyp is any mucosal projection into the lumen of the gallbladder. '
'Most are non-neoplastic pseudopolyps with no malignant potential, detected incidentally on ultrasound.',
'EBF5FB', font_size=11)
doc.add_paragraph()
doc.add_heading('Prevalence', level=2)
add_bullet(doc, 'Detected in ~1-5% of adults on transabdominal ultrasound (TAUS)')
add_bullet(doc, 'Up to 5-10% in some Asian populations')
add_bullet(doc, 'Most are asymptomatic incidental findings')
add_bullet(doc, 'Cholesterol polyps account for ~60-70% of all GB polyps')
doc.add_paragraph()
doc.add_heading('Classification by Type', level=2)
# Classification table
tbl = doc.add_table(rows=1, cols=4)
tbl.style = 'Table Grid'
tbl.alignment = WD_TABLE_ALIGNMENT.CENTER
hdr_cells = tbl.rows[0].cells
headers = ['Type', 'Frequency', 'Neoplastic?', 'Malignant Potential']
hdr_colors = ['1F497D', '1F497D', '1F497D', '1F497D']
for i, (h, c) in enumerate(zip(headers, hdr_colors)):
set_cell_bg(hdr_cells[i], c)
set_cell_text(hdr_cells[i], h, bold=True, font_size=10,
color_rgb=RGBColor(0xFF, 0xFF, 0xFF), align=WD_ALIGN_PARAGRAPH.CENTER)
data = [
('Cholesterol polyp', '~60-70%', 'No (pseudopolyp)', 'None'),
('Inflammatory polyp', '~10%', 'No (pseudopolyp)', 'None'),
('Adenomyoma', '~25%', 'No (hyperplastic)', 'None'),
('Adenoma', '~4%', 'YES - true neoplasm', 'Low-moderate (size-dependent)'),
('Carcinoma', '~2%', 'YES - malignant', 'High'),
]
row_colors = ['FFFFFF', 'F2F2F2', 'FFFFFF', 'FFF2CC', 'FFE0E0']
for row_data, row_color in zip(data, row_colors):
row = tbl.add_row()
for i, val in enumerate(row_data):
set_cell_bg(row.cells[i], row_color.replace('#',''))
bold = (i == 0)
set_cell_text(row.cells[i], val, bold=bold, font_size=10)
doc.add_paragraph()
# ══════════════════════════════════════════════════════════════
# SECTION 2 - RISK FACTORS FOR MALIGNANCY
# ══════════════════════════════════════════════════════════════
add_hr(doc)
doc.add_heading('2. Risk Factors for Malignancy in GB Polyps', level=1)
add_colored_para(doc,
'CLINICAL ALERT: The following risk factors increase the probability that a polyp is neoplastic (adenoma or carcinoma) rather than benign. Their presence should escalate management.',
'FFF2CC', font_size=10.5, bold=True)
doc.add_paragraph()
# Risk factors table - 2 column
rf_tbl = doc.add_table(rows=1, cols=3)
rf_tbl.style = 'Table Grid'
rf_hdr = rf_tbl.rows[0].cells
for cell, txt in zip(rf_hdr, ['Risk Factor', 'Threshold', 'Guideline Source']):
set_cell_bg(cell, '2E74B5')
set_cell_text(cell, txt, bold=True, font_size=10,
color_rgb=RGBColor(0xFF, 0xFF, 0xFF), align=WD_ALIGN_PARAGRAPH.CENTER)
rf_data = [
('Polyp size', '≥ 10 mm (European); ≥ 15 mm (SRU 2022)', 'Both guidelines'),
('Morphology - sessile / broad-based', 'Sessile with focal wall thickening > 4 mm = indeterminate risk', 'SRU 2022'),
('Age', '> 60 years', 'European 2022 / Sleisenger'),
('Primary Sclerosing Cholangitis (PSC)', 'Any polyp size - risk up to 60%', 'Both guidelines'),
('Presence of gallstones', 'Co-existing cholelithiasis', 'Sleisenger / Yamada'),
('Asian ethnicity', 'Higher background GB cancer risk', 'European 2022 / Korean review'),
('Single polyp', 'Solitary vs. multiple (multiple = usually benign cholesterol)', 'Sleisenger'),
('Rapid growth', '≥ 4 mm growth within 12 months (SRU); ≥ 2 mm in 2 years (European)', 'SRU 2022 / European 2022'),
('Familial / genetic syndromes', 'FAP, Peutz-Jeghers syndrome', 'Yamada / Sleisenger'),
]
for i, (factor, threshold, source) in enumerate(rf_data):
row = rf_tbl.add_row()
bg = 'FFFFFF' if i % 2 == 0 else 'F2F2F2'
set_cell_bg(row.cells[0], bg)
set_cell_bg(row.cells[1], bg)
set_cell_bg(row.cells[2], bg)
set_cell_text(row.cells[0], factor, bold=True, font_size=10)
set_cell_text(row.cells[1], threshold, font_size=10)
set_cell_text(row.cells[2], source, font_size=9)
doc.add_paragraph()
# ══════════════════════════════════════════════════════════════
# SECTION 3 - DIAGNOSTIC IMAGING
# ══════════════════════════════════════════════════════════════
add_hr(doc)
doc.add_heading('3. Diagnostic Imaging', level=1)
doc.add_heading('Transabdominal Ultrasound (TAUS) - First-Line', level=2)
add_bullet(doc, 'Primary imaging modality for detection and surveillance of GB polyps')
add_bullet(doc, 'Sensitivity ~80% for detection; accuracy for characterizing polyp type as low as 20%')
add_bullet(doc, 'Key feature: polyp does not move with patient position change (distinguishes from calculi); no acoustic shadowing')
add_bullet(doc, 'Up to 1/3 of "polyps" seen on US are not confirmed at cholecystectomy (false positives, especially <5 mm)')
doc.add_paragraph()
doc.add_heading('Endoscopic Ultrasound (EUS) - Second-Line', level=2)
add_bullet(doc, 'Diagnostic accuracy >90% for differentiating polyp types')
add_bullet(doc, 'EUS scoring system (size, number, shape, echogenicity, margins, Doppler flow) predicts neoplastic potential')
add_bullet(doc, 'Indicated when TAUS findings are indeterminate, or polyp is 6-9 mm with risk factors')
doc.add_paragraph()
doc.add_heading('Other Modalities', level=2)
add_bullet(doc, 'CEUS (Contrast-Enhanced US): detects vascularity in neoplastic polyps; emerging role')
add_bullet(doc, 'FDG-PET: anecdotal reports of predicting malignancy; not routine')
add_bullet(doc, 'CT scan: may miss polyps without contrast; limited role in characterization')
doc.add_paragraph()
# ══════════════════════════════════════════════════════════════
# SECTION 4 - SRU 2022 RISK STRATIFICATION
# ══════════════════════════════════════════════════════════════
add_hr(doc)
doc.add_heading('4. SRU 2022 Risk Stratification Algorithm', level=1)
add_colored_para(doc,
'The 2022 Society of Radiologists in Ultrasound (SRU) consensus stratifies GB polyps by MORPHOLOGY first, then SIZE. '
'This is now endorsed by the Canadian Association of Radiologists (CAR 2025/2026) as the preferred approach over European size-first guidelines.',
'E2EFDA', font_size=11)
doc.add_paragraph()
# SRU stratification table
sru_tbl = doc.add_table(rows=1, cols=4)
sru_tbl.style = 'Table Grid'
sru_hdr = sru_tbl.rows[0].cells
for cell, txt in zip(sru_hdr, ['Risk Category', 'Morphology Criteria', 'Size', 'Action']):
set_cell_bg(cell, '1F497D')
set_cell_text(cell, txt, bold=True, font_size=10,
color_rgb=RGBColor(0xFF, 0xFF, 0xFF), align=WD_ALIGN_PARAGRAPH.CENTER)
sru_data = [
('EXTREMELY LOW RISK',
'Pedunculated, thin-stalked ("ball-on-wall" appearance); almost certainly cholesterol/benign',
'≤ 9 mm\n10-14 mm\n≥ 15 mm',
'No follow-up needed\nFollow-up US at 12 months\nSurgical consultation',
'E2EFDA'),
('LOW RISK',
'Sessile or thick-stalked polyp WITHOUT adjacent focal wall thickening > 4 mm',
'≤ 6 mm\n7-9 mm\n10-14 mm\n≥ 15 mm',
'No follow-up needed\nFollow-up US at 12 months\nUS or surgical consultation\nSurgical consultation',
'FFF2CC'),
('INDETERMINATE RISK',
'Any polyp with adjacent focal wall thickening > 4 mm (raises concern for neoplasm)',
'≤ 6 mm\n≥ 7 mm',
'Follow-up US at 6 months\nSurgical consultation (always consider surgery)',
'FFE0E0'),
]
for cat, morphology, sizes, actions, bg in sru_data:
row = sru_tbl.add_row()
set_cell_bg(row.cells[0], bg)
set_cell_bg(row.cells[1], bg)
set_cell_bg(row.cells[2], bg)
set_cell_bg(row.cells[3], bg)
set_cell_text(row.cells[0], cat, bold=True, font_size=10)
set_cell_text(row.cells[1], morphology, font_size=9.5)
set_cell_text(row.cells[2], sizes, font_size=9.5)
set_cell_text(row.cells[3], actions, font_size=9.5)
doc.add_paragraph()
add_colored_para(doc,
'SRU Growth Trigger: Polyp growth ≥ 4 mm within 12 months = rapid growth → surgical referral regardless of category. '
'Growth ≤ 3 mm is within normal variation. Decrease ≥ 4 mm → consider discontinuing surveillance.',
'FFF2CC', font_size=10.5, bold=True)
doc.add_paragraph()
# ══════════════════════════════════════════════════════════════
# SECTION 5 - EUROPEAN 2022 GUIDELINES
# ══════════════════════════════════════════════════════════════
add_hr(doc)
doc.add_heading('5. European 2022 Joint Guidelines (ESGAR/EASL/EAHPBA/ESP)', level=1)
add_colored_para(doc,
'The European guidelines are SIZE-FIRST, then risk-factor stratified. They are more conservative than SRU 2022 '
'(lower surgery threshold at ≥10 mm). The CAR 2025 endorses SRU approach as preferred over European.',
'EBF5FB', font_size=11)
doc.add_paragraph()
doc.add_heading('European Indications for Cholecystectomy', level=2)
eu_tbl = doc.add_table(rows=1, cols=3)
eu_tbl.style = 'Table Grid'
eu_hdr = eu_tbl.rows[0].cells
for cell, txt in zip(eu_hdr, ['Scenario', 'Polyp Size', 'Recommendation']):
set_cell_bg(cell, '2E74B5')
set_cell_text(cell, txt, bold=True, font_size=10,
color_rgb=RGBColor(0xFF, 0xFF, 0xFF), align=WD_ALIGN_PARAGRAPH.CENTER)
eu_data = [
('Any polyp - large', '≥ 10 mm', 'Cholecystectomy recommended'),
('Symptomatic polyp', '< 10 mm', 'Cholecystectomy recommended'),
('6-9 mm + ANY risk factor*', '6-9 mm', 'Cholecystectomy recommended'),
('6-9 mm - NO risk factors', '6-9 mm', 'US surveillance at 6m, 1yr, 2yr'),
('< 5 mm + NO risk factors', '< 5 mm', 'No surveillance needed'),
('< 5 mm + risk factor present', '< 5 mm', 'US at 6m, 1yr, 2yr'),
]
for i, row_data in enumerate(eu_data):
row = eu_tbl.add_row()
bg = 'FFFFFF' if i % 2 == 0 else 'F2F2F2'
for j, val in enumerate(row_data):
set_cell_bg(row.cells[j], bg)
set_cell_text(row.cells[j], val, bold=(j==0), font_size=10)
doc.add_paragraph()
p = doc.add_paragraph()
r = p.add_run('*European risk factors for malignancy: age > 60 years | primary sclerosing cholangitis | Asian ethnicity | sessile polyp / focal GB wall thickening > 4 mm')
r.font.size = Pt(9)
r.font.italic = True
r.font.name = 'Calibri'
doc.add_paragraph()
doc.add_heading('European Growth Trigger', level=2)
add_bullet(doc, 'Growth ≥ 2 mm within the 2-year surveillance period → reassess with current size + risk factors')
add_bullet(doc, 'Multidisciplinary discussion to decide continuation of monitoring vs. cholecystectomy')
doc.add_paragraph()
# ══════════════════════════════════════════════════════════════
# SECTION 6 - GUIDELINE COMPARISON TABLE
# ══════════════════════════════════════════════════════════════
add_hr(doc)
doc.add_heading('6. Head-to-Head Guideline Comparison: SRU 2022 vs. European 2022', level=1)
comp_tbl = doc.add_table(rows=1, cols=3)
comp_tbl.style = 'Table Grid'
comp_hdr = comp_tbl.rows[0].cells
for cell, txt in zip(comp_hdr, ['Parameter', 'SRU 2022', 'European 2022']):
set_cell_bg(cell, '1F497D')
set_cell_text(cell, txt, bold=True, font_size=10,
color_rgb=RGBColor(0xFF, 0xFF, 0xFF), align=WD_ALIGN_PARAGRAPH.CENTER)
comp_data = [
('Primary stratifier', 'Polyp morphology, then size', 'Polyp size, then risk factors'),
('Surgery threshold', '≥ 15 mm (extremely low risk)\n≥ 10 mm (low risk)\n≥ 7 mm (indeterminate risk)', '≥ 10 mm universally'),
('6-9 mm polyp, no risk factors', 'No follow-up (extremely low risk)\nor US at 12 months (low risk)', 'US at 6m, 1yr, 2yr'),
('< 6 mm, no risk factors', 'No follow-up (all categories)', 'No follow-up'),
('Rapid growth trigger', '≥ 4 mm in 12 months → surgery', '≥ 2 mm in 2 years → reassess'),
('PSC patients', 'Indeterminate risk → surgery from ≥ 7 mm', 'Surgery for any polyp (high risk)'),
('Use of risk factors', 'Not in core algorithm (modifier only)', 'Central to algorithm'),
('CAR 2025 endorsement', 'PREFERRED (less aggressive, evidence-based)', 'More conservative; not preferred by CAR'),
]
for i, row_data in enumerate(comp_data):
row = comp_tbl.add_row()
bg = 'FFFFFF' if i % 2 == 0 else 'F2F2F2'
for j, val in enumerate(row_data):
set_cell_bg(row.cells[j], bg)
set_cell_text(row.cells[j], val, bold=(j==0), font_size=10)
doc.add_paragraph()
# ══════════════════════════════════════════════════════════════
# SECTION 7 - NATURAL HISTORY
# ══════════════════════════════════════════════════════════════
add_hr(doc)
doc.add_heading('7. Natural History', level=1)
add_bullet(doc, 'Mayo Clinic data: 200 patients with GB polyps followed for 15 years - <10% developed symptoms requiring surgery; NONE developed GB cancer')
add_bullet(doc, 'Annual/semi-annual US over 5 years in 109 patients with polyps < 10 mm: NO cancer developed; >88% showed no growth')
add_bullet(doc, 'Multiplicity of polyps strongly predicts benignity (cholesterol polyps mean number = 8 per series)')
add_bullet(doc, 'Single, large (>12 mm) adenomas frequently contain foci of carcinoma at resection (Japan series)')
add_bullet(doc, 'Cost-benefit (UK): surveillance of ALL GB polyps costs ~$9.7M over 20 years to save an estimated 5.4 lives/year; cost-effectiveness improves if restricted to 5-10 mm polyps')
doc.add_paragraph()
# ══════════════════════════════════════════════════════════════
# SECTION 8 - INDICATIONS FOR CHOLECYSTECTOMY (SUMMARY)
# ══════════════════════════════════════════════════════════════
add_hr(doc)
doc.add_heading('8. Indications for Cholecystectomy - Summary', level=1)
add_colored_para(doc,
'ABSOLUTE INDICATIONS (both SRU and European agree)',
'1F497D', font_size=11, bold=True)
p = doc.add_paragraph()
r = p.add_run('ABSOLUTE INDICATIONS (both SRU and European agree)')
r.font.bold = True
r.font.color.rgb = RGBColor(0x1F, 0x49, 0x7D)
r.font.name = 'Calibri'
r.font.size = Pt(11)
add_bullet(doc, 'Any polyp ≥ 15 mm (SRU) OR ≥ 10 mm (European) - strong suspicion of neoplasm')
add_bullet(doc, 'Symptomatic polyp (biliary pain attributable to polyp) at any size')
add_bullet(doc, 'Rapid growth: ≥ 4 mm in 12 months (SRU) / ≥ 2 mm in 2 years (European)')
add_bullet(doc, 'Indeterminate-risk polyp ≥ 7 mm on SRU criteria (focal wall thickening > 4 mm)')
add_bullet(doc, 'PSC patient with any polyp - malignant risk up to 60%')
add_bullet(doc, 'Polyp in setting of gallstones AND age > 60 years')
doc.add_paragraph()
p = doc.add_paragraph()
r = p.add_run('RELATIVE INDICATIONS (consider surgery, individualize)')
r.font.bold = True
r.font.color.rgb = RGBColor(0xC5, 0x50, 0x00)
r.font.name = 'Calibri'
r.font.size = Pt(11)
add_bullet(doc, 'Polyp 6-9 mm with one or more risk factors (European guideline)')
add_bullet(doc, 'Polyp 10-14 mm that is low-risk morphology on SRU - patient preference or evidence of growth')
add_bullet(doc, 'Solitary polyp with patient anxiety / inability to comply with surveillance')
doc.add_paragraph()
# ══════════════════════════════════════════════════════════════
# SECTION 9 - PATIENT APPLICATION (this case)
# ══════════════════════════════════════════════════════════════
add_hr(doc)
doc.add_heading('9. Application to This Patient', level=1)
add_colored_para(doc,
'Patient: 21-year-old female | Findings: 2 gallbladder polyps, largest 3 mm | Source: Western Regional Hospital USG Report',
'EBF5FB', font_size=11, bold=True)
doc.add_paragraph()
doc.add_heading('Assessment', level=2)
add_bullet(doc, 'Size: 3 mm - well below all thresholds for surgical concern (<5 mm)')
add_bullet(doc, 'Multiplicity: TWO polyps - strong predictor of cholesterol polyps (benign pseudopolyps)')
add_bullet(doc, 'Demographics: Young female - classic profile for cholesterol polyps (estrogen effect)')
add_bullet(doc, 'No gallstones, no free fluid, no biliary dilation on this report')
doc.add_paragraph()
doc.add_heading('Management Recommendation', level=2)
add_colored_para(doc,
'Per SRU 2022 (CAR-endorsed preferred guideline): If morphology is pedunculated / extremely low-risk - NO surveillance ultrasound needed for polyps ≤ 9 mm.',
'E2EFDA', font_size=10.5)
doc.add_paragraph()
add_colored_para(doc,
'Per European 2022: Polyps < 5 mm with NO risk factors - NO follow-up required.',
'E2EFDA', font_size=10.5)
doc.add_paragraph()
add_bullet(doc, 'ACTION: Reassure patient - this is almost certainly a benign cholesterol polyp')
add_bullet(doc, 'No immediate intervention or surgery indicated')
add_bullet(doc, 'If any risk factors present (PSC, age >60, Asian): US at 6 months, 1 year, 2 years')
add_bullet(doc, 'If polyp grows ≥ 4 mm or becomes symptomatic: reassess and consider cholecystectomy')
add_bullet(doc, 'Address modifiable risk: dietary advice regarding fat/cholesterol intake, weight management if applicable')
doc.add_paragraph()
# ══════════════════════════════════════════════════════════════
# SECTION 10 - REFERENCES
# ══════════════════════════════════════════════════════════════
add_hr(doc)
doc.add_heading('10. Key References', level=1)
refs = [
'Sleisenger and Fordtran\'s Gastrointestinal and Liver Disease, 11th ed. Chapter 67: Cholesterolosis & Gallbladder Polyps.',
'Yamada\'s Textbook of Gastroenterology, 7th ed. Chapter 84: Benign Tumors of the Gallbladder.',
'Fung CI, Kamaya A, et al. Recommendations for the Management of Incidentally Detected Gallbladder Polyps: Update of the 2020 CAR Recommendations. Can Assoc Radiol J. 2026. PMID: 40483673.',
'Son JH. Recent Updates on Management and Follow-up of Gallbladder Polyps. Korean J Gastroenterol. 2023. PMID: 37226819.',
'Society of Radiologists in Ultrasound (SRU) Consensus Conference Recommendations for Incidental Gallbladder Polyp Management. Radiology. November 2022.',
'European (ESGAR/EASL/EAHPBA/ESP) Joint Guidelines on GB Polyp Management. 2022.',
'Fischer\'s Mastery of Surgery, 8th ed. Chapter: Gallbladder Polyps.',
]
for i, ref in enumerate(refs, 1):
p = doc.add_paragraph()
p.paragraph_format.left_indent = Inches(0.25)
p.paragraph_format.first_line_indent = Inches(-0.25)
p.paragraph_format.space_after = Pt(4)
r = p.add_run(f'{i}. {ref}')
r.font.name = 'Calibri'
r.font.size = Pt(9.5)
# ══════════════════════════════════════════════════════════════
# FOOTER
# ══════════════════════════════════════════════════════════════
add_hr(doc)
footer_p = doc.add_paragraph()
footer_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
fr = footer_p.add_run('This document is a clinical summary prepared for educational purposes. Clinical decisions should be individualized based on patient presentation, local guidelines, and specialist consultation.')
fr.font.name = 'Calibri'
fr.font.size = Pt(8.5)
fr.font.italic = True
fr.font.color.rgb = RGBColor(0x80, 0x80, 0x80)
# Save
out_path = '/tmp/workspace/gb-polyp/GB_Polyp_Surveillance_Management.docx'
doc.save(out_path)
print(f'Saved: {out_path}')
python3 /tmp/workspace/gb-polyp/build_doc.py
python3 -c " from docx import Document doc = Document('/tmp/workspace/gb-polyp/GB_Polyp_Surveillance_Management.docx') print('Sections:', len(doc.sections)) print('Paragraphs:', len(doc.paragraphs)) print('Tables:', len(doc.tables)) # print first few headings count = 0 for p in doc.paragraphs: if 'Heading' in str(p.style.name) and p.text.strip(): print(f' [{p.style.name}] {p.text}') count += 1 if count > 15: break "
GB Polyp Surveillance Management
Word Document · DOCX
| Section | Content |
|---|---|
| 1. Definition & Epidemiology | Prevalence, full classification table by polyp type with malignancy risk |
| 2. Risk Factors for Malignancy | Highlighted alert box + 9-row table (size, morphology, age, PSC, gallstones, ethnicity, growth) |
| 3. Diagnostic Imaging | TAUS, EUS, CEUS, PET - with sensitivity/specificity data |
| 4. SRU 2022 Algorithm | Color-coded 3-tier risk table (Extremely Low / Low / Indeterminate) with size-specific actions |
| 5. European 2022 Guidelines | Size-first approach table with risk factor-based modifications |
| 6. Guideline Comparison | Head-to-head SRU vs. European table on 8 parameters |
| 7. Natural History | Mayo Clinic data, long-term follow-up studies, cost-benefit analysis |
| 8. Surgery Indications | Absolute vs. relative indications cleanly separated |
| 9. Patient Application | Applied directly to Aachilaa's case (3 mm, 2 polyps, 21F) with management recommendation |
| 10. References | 7 citations including Sleisenger, Yamada, SRU 2022, CAR 2025, PMID-linked papers |
Why and how number and sizes increases ?
gallbladder polyp growth natural history size increase
Textbook note: "Although they may be solitary in 20% of cases, the mean number of cholesterol polyps present in one series was 8. The multiplicity of polyps generally indicates cholesterol polyps and predicts benignity." - Sleisenger & Fordtran, Ch. 67
| Step | Mechanism |
|---|---|
| 1. Sustained supersaturation | If the bile remains lithogenic (abnormal bile composition persists), the mucosal absorption of cholesterol continues without equilibrium |
| 2. More foam cells recruited | Each polyp villus recruits additional macrophages from the lamina propria, expanding the foam cell mass |
| 3. Villous hyperplasia | The mucosa itself undergoes villous hyperplasia (the polyp's "skeleton" grows as the epithelium proliferates to accommodate the lipid load) |
| 4. Coalescence | Adjacent lipid deposits merge, creating a larger, lobulated mass |
| 5. Failure of GB motility | Impaired GB emptying (e.g. from hormones, fasting, dysmotility) = prolonged contact time between bile and mucosa = more absorption per cycle |
Normal epithelium
↓ (initial mutagenic hit - bile acids, carcinogens, chronic inflammation)
Epithelial dysplasia (focal)
↓ (accumulation of further mutations: TP53, KRAS, PIK3CA pathways)
Adenoma (benign neoplasm)
↓ (additional oncogenic mutations)
Adenocarcinoma (invasive cancer)
12 mm: frequently contain foci of carcinoma (Japan series: 7 of 18 adenomas >12 mm had carcinoma foci)
18 mm: often contain advanced invasive cancer with serosal involvement
| Feature | Cholesterol Polyp Growth | Neoplastic Polyp Growth |
|---|---|---|
| Rate | Slow, self-limiting | Progressive, may accelerate |
| Mechanism | Lipid accumulation | Cell division (mitosis) |
| Upper size limit | Rarely >10 mm | No limit - can grow to >30 mm |
| Number | Usually multiple (8 on average) | Usually solitary |
| Shape change | Remains pedunculated, smooth | May become sessile, irregular, broad-based |
| Growth trigger for surgery | Detachment complications | Malignant transformation |
| SRU growth alarm | ≥ 4 mm in 12 months | Any rapid growth |
How do estrogen and female sex hormones specifically promote cholesterol polyp formation?
estrogen sex hormones gallbladder cholesterol bile lithogenicity
Estrogen
↓ binds hepatic Estrogen Receptor-α (ERα) — NOT ERβ
Activates SREBP-2 pathway
(Sterol Regulatory Element Binding Protein-2)
↓
SREBP-2 responsive genes upregulated
↓
↑ Hepatic cholesterol BIOSYNTHESIS (new cholesterol made)
↓
↑ Secretion of newly synthesized cholesterol into bile
↓
BILE SUPERSATURATED WITH CHOLESTEROL
Estrogen
↓
↑ Hepatic LDL receptor expression
↓
↑ Clearance of plasma LDL cholesterol from blood into liver
↓ (liver now has excess cholesterol load)
↑ Secretion of this cleared cholesterol into bile
↓
Further bile supersaturation
"The hepatic estrogen receptor α, which is activated by estrogen, interferes with the negative feedback regulation of cholesterol biosynthesis by stimulating the SREBP-2 pathway, with resulting activation of SREBP-2-responsive genes in the cholesterol biosynthetic pathway. These alterations lead to increased hepatic secretion of newly synthesized cholesterol and supersaturation of bile."
- Sleisenger & Fordtran, Ch. 65
Progesterone
↓
Inhibits smooth muscle contraction of GB wall
↓
↓ Gallbladder ejection fraction
↓
↑ Fasting gallbladder volume (GB doesn't empty between meals)
↑ Fed gallbladder volume (GB doesn't empty after meals either)
↓
Bile stasis - bile sits in contact with mucosa for longer
↓
↑ Mucosal absorption time for cholesterol micelles
↓
More cholesterol absorbed into lamina propria macrophages
= MORE FOAM CELLS = BIGGER / MORE POLYPS
Progesterone
↓
↓ Bile acid secretion into bile
↓
Ratio shifts: less bile acids, same cholesterol
↓
Cholesterol Saturation Index (CSI) rises further
+
Qualitative change: more hydrophobic (toxic) bile acids produced
↓
Mucosal damage + increased cholesterol precipitation
| Hormonal State | Estrogen Effect | Progesterone Effect | Net Biliary Risk |
|---|---|---|---|
| Post-pubertal (cycling) | ↑ cholesterol secretion | Luteal phase ↓ GB motility | Moderate - cyclic |
| Oral contraceptives | High-dose OCP doubles gallstone prevalence | Synthetic progestins add stasis | HIGH |
| Pregnancy (esp. 3rd trimester) | Estrogen peaks → max cholesterol secretion | Progesterone peaks → max stasis | VERY HIGH (sludge in 36% pregnant women) |
| HRT (postmenopausal) | Unopposed estrogen → HR 1.38 for cholecystectomy | Variable | HIGH (especially unopposed estrogen) |
| After menopause (no HRT) | Estrogen drops | Progesterone drops | Risk equalizes with men by age 60 |
This explains the epidemiological observation: "Women are twice as likely as men to form cholesterol gallstones. The difference begins at puberty and continues through childbearing years... Cholesterolosis shows a marked predilection for women until age 60 years. After that, gender differences are less pronounced."
- Sleisenger & Fordtran, Ch. 65 & 67
| Factor | Gallstone Formation | Cholesterol Polyp Formation |
|---|---|---|
| Site of excess cholesterol | Precipitates in GB lumen (nucleation) | Absorbed into GB epithelium/lamina propria |
| Requires | Nucleating proteins in bile | Mucosal absorptive capacity |
| Rate of mucosal esterification | Low → cholesterol stays in bile → stone | High → cholesterol stored in macrophages → polyp |
| Stasis effect | Longer contact → crystal nucleation | Longer contact → more mucosal absorption |