Describe I detail about breast topic for surgery postgraduate study purpose. Anatomy, malignant and non malignant breast pathologies, relevant Histopathology, clinical features, investigation (triple assessment), staging, management, recent advances
breast cancer management surgery sentinel lymph node
breast cancer neoadjuvant chemotherapy CDK4/6 immunotherapy recent advances
breast cancer CDK4/6 inhibitor trastuzumab deruxtecan PARP inhibitor
| Risk Factor | Relative Risk |
|---|---|
| Female sex / Increasing age | >4.0 |
| BRCA1/BRCA2 germline mutation | >4.0 |
| Strong family history (>1 first-degree relative) | >4.0 |
| Personal history of breast cancer | >4.0 |
| High breast density | >4.0 |
| Moderate penetrance mutations (PALB2, CHEK2, ATM) | 2-4x |
| Chest wall radiation at young age | 2-4x |
| ADH/ALH on prior biopsy | 4-5x |
| LCIS | 8-10x |
| Early menarche (<12 yrs) / late menopause (>55 yrs) | 1.1-2.0x |
| Nulliparity / first birth >30 yrs | 1.1-2.0x |
| HRT use / OCP use | 1.1-2.0x |
| Obesity (post-menopausal), alcohol | 1.1-2.0x |
| Subtype | ER | PR | HER2 | Frequency | Key Points |
|---|---|---|---|---|---|
| Luminal A | + | + | - | 50-65% | Low Ki-67; best prognosis; endocrine therapy; low chemo benefit |
| Luminal B (HER2-) | + | low/- | - | Included in luminal | High Ki-67; moderate prognosis; chemo often needed |
| Luminal B (HER2+) | + | low/- | + | Included in luminal | Anti-HER2 + endocrine therapy |
| HER2-enriched | - | - | + | ~15% | Anti-HER2 + chemo; poor prognosis before targeted therapy era |
| Triple Negative (TNBC) | - | - | - | ~15% | Highest metastatic risk; brain/visceral; chemo backbone; early relapse |
| T | Description |
|---|---|
| TX | Cannot be assessed |
| T0 | No evidence of primary tumour |
| Tis | Carcinoma in situ: Tis (DCIS) or Tis (Paget) |
| T1 | ≤20 mm: T1mi (≤1mm microinvasion), T1a (>1-5mm), T1b (>5-10mm), T1c (>10-20mm) |
| T2 | >20mm to ≤50mm |
| T3 | >50mm |
| T4 | Any size with direct extension to chest wall (T4a), skin oedema/ulceration (T4b), both (T4c), inflammatory carcinoma (T4d) |
| pN | Description |
|---|---|
| pN0 | No regional LN metastasis |
| pN1mi | Micrometastasis >0.2mm but ≤2mm |
| pN1 | 1-3 positive axillary LN; and/or internal mammary LN by SLN (not clinically detected) |
| pN2 | 4-9 positive axillary LN; or clinically detected internal mammary LN |
| pN3 | ≥10 positive axillary LN; or infraclavicular (Level III) LN; or clinically detected IM LN + axillary LN; or supraclavicular LN |
| Stage | Description | 5-year Survival |
|---|---|---|
| Stage 0 | Tis N0 M0 | ~100% |
| Stage I | T1 N0 M0 (IA); T1 N1mi M0 (IB) | ~99% |
| Stage IIA | T0-1 N1 M0; T2 N0 M0 | ~90% |
| Stage IIB | T2 N1 M0; T3 N0 M0 | ~80% |
| Stage IIIA | T0-3 N2 M0; T3 N1 M0 | ~60-70% |
| Stage IIIB | T4 N0-2 M0 | ~50-60% |
| Stage IIIC | Any T N3 M0 | ~40-50% |
| Stage IV | Any T Any N M1 | ~28% (5-yr) |
| Trial | Finding |
|---|---|
| NSABP B-06 | BCS + RT equivalent to mastectomy in survival |
| ACOSOG Z0011 | 1-2 +ve SLN: no need for ALND if BCS + WBI + systemic therapy |
| AMAROS | Positive SLN: axillary RT equivalent to ALND (less lymphoedema) |
| NSABP B-17 | RT after BCS for DCIS reduces local recurrence |
| NSABP B-24 | Tamoxifen further reduces recurrence in DCIS after BCS + RT |
| TAILORx | RS 11-25: chemo not beneficial in ER+/HER2-/N0 (>50 years) |
| KATHERINE | T-DM1 vs. trastuzumab for residual HER2+ post-NACT: ↑IDFS |
| KEYNOTE-522 | Pembrolizumab + NACT → surgery → adjuvant pembrolizumab ↑pCR in TNBC |
| OlympiA | Adjuvant olaparib in gBRCA+ HER2-: ↓distant metastases |
| monarchE | Adjuvant abemaciclib in high-risk ER+/HER2-: ↑IDFS |
| DESTINY-Breast04 | T-DXd in HER2-low: major improvement in PFS and OS |
| FAST-Forward | 26 Gy/5 fractions = 40 Gy/15 fractions (non-inferior) |
I can’t see the full output here. ?
ls /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "ready"
mkdir -p /tmp/workspace/breast-surgery && python3 << 'PYEOF' from docx import Document from docx.shared import Pt, RGBColor, Inches, Cm from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.oxml.ns import qn from docx.oxml import OxmlElement import copy doc = Document() # --- Page setup --- section = doc.sections[0] section.page_width = Inches(8.27) section.page_height = Inches(11.69) section.left_margin = Inches(1.0) section.right_margin = Inches(1.0) section.top_margin = Inches(1.0) section.bottom_margin = Inches(1.0) # --- Styles helpers --- def heading1(text): p = doc.add_heading(text, level=1) p.runs[0].font.color.rgb = RGBColor(0x1A, 0x35, 0x6E) # dark blue p.runs[0].font.size = Pt(16) return p def heading2(text): p = doc.add_heading(text, level=2) p.runs[0].font.color.rgb = RGBColor(0xC0, 0x39, 0x2B) # dark red p.runs[0].font.size = Pt(13) return p def heading3(text): p = doc.add_heading(text, level=3) p.runs[0].font.color.rgb = RGBColor(0x1A, 0x6E, 0x4A) # green p.runs[0].font.size = Pt(11) return p def para(text, bold_label=None): p = doc.add_paragraph() if bold_label: run = p.add_run(bold_label) run.bold = True p.add_run(text) p.paragraph_format.space_after = Pt(4) return p def bullet(text, level=0): p = doc.add_paragraph(text, style='List Bullet') p.paragraph_format.left_indent = Inches(0.25 * (level + 1)) p.paragraph_format.space_after = Pt(2) return p def add_table(headers, rows, col_widths=None): table = doc.add_table(rows=1 + len(rows), cols=len(headers)) table.style = 'Table Grid' hdr_cells = table.rows[0].cells for i, h in enumerate(headers): hdr_cells[i].text = h run = hdr_cells[i].paragraphs[0].runs[0] run.bold = True run.font.size = Pt(9) tc = hdr_cells[i]._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'), '1A356E') tcPr.append(shd) hdr_cells[i].paragraphs[0].runs[0].font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF) for r_idx, row_data in enumerate(rows): row_cells = table.rows[r_idx + 1].cells for c_idx, cell_text in enumerate(row_data): row_cells[c_idx].text = cell_text row_cells[c_idx].paragraphs[0].runs[0].font.size = Pt(9) if col_widths: for i, w in enumerate(col_widths): for row in table.rows: row.cells[i].width = Inches(w) doc.add_paragraph() # ============================================================ # TITLE PAGE # ============================================================ title = doc.add_paragraph() title.alignment = WD_ALIGN_PARAGRAPH.CENTER run = title.add_run('BREAST') run.bold = True run.font.size = Pt(28) run.font.color.rgb = RGBColor(0x1A, 0x35, 0x6E) subtitle = doc.add_paragraph() subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER run2 = subtitle.add_run('Comprehensive Surgical Postgraduate Notes') run2.bold = True run2.font.size = Pt(16) run2.font.color.rgb = RGBColor(0xC0, 0x39, 0x2B) info = doc.add_paragraph() info.alignment = WD_ALIGN_PARAGRAPH.CENTER info.add_run('Anatomy · Benign & Malignant Pathology · Histopathology\nTriple Assessment · TNM Staging · Management · Recent Advances').font.size = Pt(11) doc.add_paragraph() src = doc.add_paragraph() src.alignment = WD_ALIGN_PARAGRAPH.CENTER src.add_run('Sources: Sabiston Surgery 21e | Bailey & Love 28e | Fischer\'s Mastery 8e\nRobbins Pathology | Mulholland & Greenfield 7e | PubMed 2024-2026').font.size = Pt(9) doc.add_page_break() # ============================================================ # 1. SURGICAL ANATOMY # ============================================================ heading1('1. SURGICAL ANATOMY OF THE BREAST') heading2('1.1 Position and Relations') bullet('Lies between skin/subdermal fat and the superficial pectoral fascia, overlying pectoralis major') bullet('Vertical extent: 2nd to 6th rib; Horizontal: lateral sternal border to mid-axillary line') bullet('Axillary tail of Spence: lateral prolongation passing through foramen of Langer into axilla') bullet('Retromammary space: loose areolar tissue between posterior breast and pectoralis fascia — allows mobility; invaded in advanced cancer') heading2('1.2 Fascial Support — Cooper\'s Ligaments') bullet('Suspensory ligaments of Cooper: fibrous bands from chest wall to overlying dermis') bullet('Provide shape and structural support to the breast') bullet('Cancer infiltration or oedema → ligament tethering → SKIN DIMPLING / PEAU D\'ORANGE') bullet('Peau d\'orange: lymphatic blockage in dermis → skin oedema with follicular pitting') heading2('1.3 Internal Architecture') bullet('3 tissue types: (1) Glandular epithelium (2) Fibrous stroma (3) Adipose tissue') bullet('15–20 lobes, each ending in a lactiferous duct opening at the nipple') bullet('Lactiferous sinus: dilation of each duct beneath the NAC') bullet('Terminal Duct Lobular Unit (TDLU): acini + small ductules — FUNCTIONAL & PATHOLOGICAL UNIT') bullet('TDLUs surrounded by intralobular stroma (loose, cellular); distinct from interlobular stroma (dense, fibrous)') bullet('Post-menopause: glandular involution → replaced by adipose tissue') heading2('1.4 Blood Supply') add_table( ['Source', 'Supply', 'Notes'], [ ['Internal mammary (thoracic) artery', 'Medial breast (~60%)', 'Via 2nd–4th intercostal perforators — dominant supply'], ['Lateral thoracic artery', 'Upper outer quadrant', 'Branch of axillary artery'], ['Acromiothoracic artery', 'Upper breast', 'Branch of axillary artery'], ['Intercostal perforators (3rd–5th)', 'Lateral breast', 'From intercostal arteries'], ], col_widths=[2.0, 1.8, 2.6] ) heading2('1.5 Venous Drainage') bullet('Internal thoracic vein, axillary vein, intercostal veins') bullet('BATSON\'S PARAVERTEBRAL VENOUS PLEXUS: valveless venous plexus; anastomoses with breast veins') bullet(' → Haematogenous spread to vertebrae, skull, pelvis WITHOUT passing through lungs') bullet(' → Explains bony metastases as common first site of distant spread') heading2('1.6 Nerve Supply') bullet('Lateral and anterior cutaneous branches of intercostal nerves T4–T6') bullet('T4 = main sensory supply to nipple-areolar complex (NAC) — preserve during surgery') bullet('Long thoracic nerve (C5-7): supplies serratus anterior — injury → winged scapula') bullet('Thoracodorsal nerve (C6-8): supplies latissimus dorsi — injury → weak adduction/IR of arm') bullet('Medial pectoral nerve: supplies pectoralis major and minor') bullet('Lateral pectoral nerve: supplies pectoralis major') bullet('Intercostobrachial nerve (T2): cutaneous supply to medial upper arm — often sacrificed in ALND → numbness') heading2('1.7 Lymphatic Drainage — CRITICAL FOR SURGERY') para('', bold_label='AXILLARY NODES (~75% of lymphatic drainage):') add_table( ['Level', 'Location', 'Clinical Significance'], [ ['Level I (Low axilla)', 'Lateral to pectoralis minor', 'First echelon; most frequently involved'], ['Level II (Mid axilla)', 'Beneath pectoralis minor; includes Rotter\'s (interpectoral) nodes', 'Skip metastases to Level III uncommon (<5%)'], ['Level III (Apical)', 'Medial to pectoralis minor; infraclavicular', 'Halsted\'s node; N3 if isolated involvement'], ], col_widths=[1.5, 2.5, 2.4] ) bullet('Internal mammary (parasternal) nodes: ~25%, especially inner quadrants — irradiated in PMRT') bullet('Supraclavicular nodes: N3 disease (NOT M1)') bullet('Sentinel Lymph Node (SLN): first echelon node(s); identified by Tc-99m colloid (hot) + Patent blue dye (blue) or ICG fluorescence') doc.add_page_break() # ============================================================ # 2. BENIGN BREAST PATHOLOGIES # ============================================================ heading1('2. NON-MALIGNANT (BENIGN) BREAST PATHOLOGIES') heading2('2.1 ANDI — Aberrations of Normal Development and Involution') bullet('Conceptual framework explaining most benign breast conditions as aberrations of normal physiological processes') bullet('Development phase (puberty): fibroadenoma, juvenile hypertrophy') bullet('Cyclical changes (reproductive): cyclic mastalgia, diffuse nodularity') bullet('Involution (35–55 yrs): cysts, sclerosing adenosis, duct ectasia') heading2('2.2 Fibrocystic Change') bullet('Most common benign breast condition in women aged 30–50') bullet('Spectrum: cysts, adenosis, fibrosis, epithelial hyperplasia') bullet('Simple cysts: oestrogen-driven; USS = anechoic; no further workup needed; aspiration if painful') bullet('Sclerosing adenosis: proliferative lobules with fibrosis; mimics carcinoma on mammography and histology (pseudoinfiltrative)') bullet('Usual-type epithelial hyperplasia: >2 layers in duct; RR ~1.5×') bullet('Atypical Ductal Hyperplasia (ADH): architectural resemblance to low-grade DCIS but <2 ducts or <2mm; RR 4–5×; 10× with family history') bullet('Atypical Lobular Hyperplasia (ALH): fewer than half of acini in lobule distended; RR 4–5×; bilateral marker') heading2('2.3 Fibroadenoma') bullet('Most common breast lump in women UNDER 30 years (\"breast mouse\")') bullet('Histology: BIPHASIC — neoplastic intralobular stromal cells + reactive ductal epithelium') bullet(' Intracanalicular: stroma compresses ducts into slit-like spaces') bullet(' Pericanalicular: stroma grows around ducts (open, round lumina)') bullet('Clinical: rubbery, firm, well-circumscribed, very mobile, non-tender, 1–3 cm') bullet('USS: well-circumscribed, homogeneous, hypoechoic, wider-than-tall; BI-RADS 3') bullet('Natural history: ~30% spontaneously involute within 2 years') bullet('Giant fibroadenoma: >5cm; juvenile fibroadenoma in adolescents') bullet('Complex fibroadenoma: contains cysts/sclerosing adenosis/papillary apocrine change; RR ~3×') bullet('Management:') bullet(' <30 yrs, typical USS + benign CNB → reassurance + 12-month USS follow-up', level=1) bullet(' >35 yrs, enlarging, atypical, patient preference → surgical excision', level=1) heading2('2.4 Phyllodes Tumour') bullet('Fibroepithelial tumour with leaf-like architecture (Greek: phyllon = leaf)') bullet('Spectrum: Benign → Borderline → Malignant (based on stromal cellularity, atypia, mitoses, margins, stromal overgrowth)') bullet('Clinical: rapid growth, large (often >5cm), firm, lobulated; most in 45–50 yr range') bullet('Histology: leaf-like fronds of stroma covered by epithelium; intracanalicular pattern') bullet('KEY: malignant variant spreads HAEMATOGENOUSLY (lung, liver) — NOT via lymphatics → ALND NOT indicated') bullet('Management: WIDE LOCAL EXCISION with 1cm clear margins for all grades') bullet(' Mastectomy if large/multinodular/cannot achieve margins', level=0) bullet(' Recurrence common if margins inadequate', level=0) heading2('2.5 Breast Abscess') add_table( ['Type', 'Organism', 'Associations', 'Treatment'], [ ['Lactational (puerperal)', 'S. aureus (most common), Streptococci', 'First month of breastfeeding', 'Antibiotics + continued lactation; I&D only if fluctuant/refractory'], ['Non-lactational (periareolar)', 'Mixed anaerobes', 'Duct ectasia, squamous metaplasia, fistula formation', 'Antibiotics + I&D; excision of affected duct to prevent recurrence (duct fistula)'], ['Idiopathic Granulomatous Mastitis', 'None (sterile)', 'Autoimmune, hyperprolactinaemia; mimics cancer', 'Steroids/methotrexate; surgery for refractory cases'], ], col_widths=[1.5, 1.5, 2.0, 1.6] ) heading2('2.6 Duct Ectasia / Periductal Mastitis') bullet('Dilated subareolar ducts filled with lipid-rich material; periductal inflammation and fibrosis') bullet('Presents with: nipple retraction (SLIT-LIKE — cf. star-shaped in cancer), multicoloured discharge (green/black), periareolar mass') bullet('Mammary duct fistula: track between duct and periareolar skin; hallmark of chronic periductal mastitis') bullet('Treatment: Hadfield\'s operation = total duct excision (all major subareolar ducts en bloc)') heading2('2.7 Intraductal Papilloma') bullet('Most common cause of BLOODY / SEROUS NIPPLE DISCHARGE in premenopausal women') bullet('Solitary papilloma: in major subareolar duct; benign; low cancer risk') bullet('Multiple peripheral papillomas: increased cancer risk; association with atypical hyperplasia') bullet('Diagnosis: USS + ductography/galactography; MRI ductography if USS inconclusive') bullet('Treatment: microdochectomy (excision of single affected duct); total duct excision for multiple/bilateral') heading2('2.8 Fat Necrosis') bullet('Post-traumatic or post-surgical (including reduction mammoplasty, radiation)') bullet('Lipid-laden macrophages → foreign-body giant cells → fibrosis/calcification') bullet('MIMICS CARCINOMA: hard irregular mass, skin tethering, spiculated/calcified on mammography') bullet('CNB essential to distinguish from malignancy; no treatment needed if confirmed benign') heading2('2.9 Gynaecomastia (Male Breast)') bullet('Benign enlargement of glandular tissue; excess oestrogen-to-androgen ratio') bullet('Causes: Physiological (neonatal, pubertal, senile); Drugs (spironolactone, digoxin, cimetidine, oestrogens, anti-androgens, marijuana); Systemic disease (liver cirrhosis, CKD, hyperthyroidism); Testicular tumours (HCG/oestrogen-secreting)') bullet('Distinguish from MALE BREAST CANCER: eccentric, hard, fixed, unilateral, in elderly') bullet('Treatment: Treat underlying cause; subcutaneous mastectomy for cosmetically distressing/persistent') doc.add_page_break() # ============================================================ # 3. MALIGNANT BREAST PATHOLOGIES # ============================================================ heading1('3. MALIGNANT BREAST PATHOLOGIES') heading2('3.1 Epidemiology') bullet('Most common cancer in women worldwide; ~1 in 8 lifetime risk in Western populations') bullet('~2.3 million new cases globally per year (WHO 2020)') bullet('In men: ~1% of all breast cancers; associated with BRCA2, Klinefelter\'s syndrome') bullet('Peak incidence: 50–70 years; rare before 20 years (<2%)') heading2('3.2 Risk Factors') add_table( ['Risk Factor', 'Relative Risk'], [ ['Female sex / Increasing age', '>4.0'], ['BRCA1/BRCA2 germline mutation (BRCA1: 60–80% lifetime risk; BRCA2: 50–85%)', '>4.0'], ['Strong family history (>1 first-degree relative, young age)', '>4.0'], ['Personal history of breast cancer / LCIS', '>4.0'], ['High mammographic breast density', '>4.0'], ['Moderate penetrance mutations (PALB2, CHEK2, ATM)', '2–4×'], ['Chest wall radiation in childhood/young adulthood', '2–4×'], ['Atypical ductal/lobular hyperplasia (ADH/ALH)', '4–5×'], ['Early menarche (<12 yrs) / Late menopause (>55 yrs)', '1.1–2.0×'], ['Nulliparity / First pregnancy >30 yrs', '1.1–2.0×'], ['HRT (combined oestrogen + progestogen) / OCP use', '1.1–2.0×'], ['Obesity (post-menopausal), Alcohol use, Shift work', '1.1–2.0×'], ], col_widths=[4.2, 1.8] ) para('Protective factors: ', bold_label='') bullet('Early first pregnancy (<20 yrs), prolonged breastfeeding, physical activity, prophylactic oophorectomy before 40') para('', bold_label='BRCA Notes: ') bullet('BRCA1 cancers predominantly TNBC; BRCA2 more commonly ER-positive') bullet('BRCA1 also confers 40–50% ovarian cancer risk; BRCA2 20–30%') bullet('PALB2 mutations: 35% lifetime breast cancer risk; now offer BRCA-equivalent management') heading2('3.3 Classification of Breast Cancer') heading3('Non-Invasive (In Situ) Cancers — 15–20% of screen-detected cancers') add_table( ['Type', 'Features', 'Behaviour'], [ ['DCIS — Comedo', 'Central necrosis + calcification; high nuclear grade; HER2 overexpression common', 'High risk of progression; aggressive'], ['DCIS — Cribriform', 'Round punched-out spaces; bridges span lumen; intermediate grade', 'Lower risk than comedo'], ['DCIS — Solid', 'Fills ductal lumen; variable grade', 'Variable'], ['DCIS — Papillary/Micropapillary', 'Papillary projections; low grade; ER+', 'Indolent; good prognosis'], ['LCIS', 'Small bland cells distending acini; basement membrane intact; E-cadherin negative', 'Bilateral risk marker (8–10× risk); not treated as cancer'], ['Pleomorphic LCIS', 'Large pleomorphic cells; comedo necrosis; more aggressive variant', 'Treated more like DCIS'], ], col_widths=[1.8, 3.0, 1.8] ) bullet('KEY: DCIS calcifies → PLEOMORPHIC/LINEAR MICROCALCIFICATIONS on mammography (segmental distribution)') bullet('LCIS: NOW classified as benign — no longer Tis in AJCC 8th edition') heading3('Invasive Cancers') add_table( ['Type', 'Frequency', 'Key Features'], [ ['Invasive Ductal Carcinoma, NOS (IDC)', '50–70%', 'Cohesive mass; scirrhous/desmoplastic; spiculated on mammography; stony hard on palpation'], ['Invasive Lobular Carcinoma (ILC)', '5–15%', 'Indian-file single-cell infiltration; E-cadherin loss (CDH1 mutation); multifocal/bilateral; difficult to detect on mammography; best on MRI'], ['Tubular carcinoma', '2–3%', 'Pure tubule formation; well-differentiated; >90% ER+; EXCELLENT prognosis'], ['Mucinous (colloid) carcinoma', '2–3%', 'Cells floating in pools of extracellular mucin; elderly women; better prognosis'], ['Medullary carcinoma', '~5%', 'Large pleomorphic cells, syncytial growth, lymphocytic infiltrate, pushing borders; paradoxically GOOD prognosis; BRCA1-associated; often TNBC'], ['Micropapillary carcinoma', '<5%', 'Highly lymphovascular invasive; poor prognosis'], ['Metaplastic carcinoma', '~1%', 'Squamous or sarcomatoid elements; chemoresistant; usually TNBC'], ['Adenoid cystic carcinoma', '<1%', 'Cribriform; low grade; excellent prognosis; perineural invasion'], ], col_widths=[2.0, 0.9, 3.7] ) heading3('Special Clinical Entities') bullet('INFLAMMATORY BREAST CANCER (IBC): T4d; skin erythema + oedema + peau d\'orange >1/3 of breast skin; NOT infection — caused by DERMAL LYMPHATIC TUMOUR EMBOLI; diagnosis = CLINICAL; skin punch biopsy confirms; NACT first → MRM → RT (NO immediate reconstruction)') bullet('PAGET\'S DISEASE OF THE NIPPLE: eczematous change of NAC; Paget cells (large, pale cytoplasm) in nipple epidermis; 97% have underlying DCIS or invasive carcinoma; diagnosis: skin punch biopsy; treat underlying malignancy') bullet('MALE BREAST CANCER: ~1% of all breast cancers; IDC most common; associated with BRCA2, Klinefelter\'s, gynaecomastia, exogenous oestrogens; managed like female breast cancer') doc.add_page_break() # ============================================================ # 4. HISTOPATHOLOGY # ============================================================ heading1('4. HISTOPATHOLOGY') heading2('4.1 Nottingham (Elston-Ellis) Histological Grading') bullet('Applies to INVASIVE cancers only') bullet('Scores 3 parameters, each 1–3:') bullet(' (1) Tubule formation: >75% = 1; 10–75% = 2; <10% = 3', level=1) bullet(' (2) Nuclear pleomorphism: small uniform = 1; moderate = 2; marked = 3', level=1) bullet(' (3) Mitotic count: per 10 HPF (calibrated to microscope field area)', level=1) add_table( ['Total Score', 'Grade', 'Interpretation'], [ ['3–5', 'Grade 1', 'Well differentiated — best prognosis'], ['6–7', 'Grade 2', 'Moderately differentiated'], ['8–9', 'Grade 3', 'Poorly differentiated — worst prognosis'], ], col_widths=[1.2, 1.2, 4.2] ) heading2('4.2 Immunohistochemistry (IHC) Markers') add_table( ['Marker', 'Normal Threshold', 'Clinical Relevance'], [ ['ER (Oestrogen Receptor)', 'Positive: ≥1% nuclear staining (ASCO/CAP)', '~70% of invasive cancers; guides endocrine therapy'], ['PR (Progesterone Receptor)', 'Positive: ≥1% nuclear staining', '~60% positive; ER+/PR+ = best endocrine response'], ['HER2', '3+ by IHC = positive; 2+ = equivocal → FISH/CISH', '15–20% positive; guides trastuzumab/pertuzumab therapy'], ['HER2-low (NEW)', 'IHC 1+ or IHC 2+/FISH-', 'Targetable by T-DXd (DESTINY-Breast04); previously "HER2-negative"'], ['Ki-67', '>14% = high proliferation', 'Distinguishes Luminal A (low) from Luminal B (high); prognostic'], ], col_widths=[1.8, 2.0, 2.8] ) heading2('4.3 Molecular Subtypes') add_table( ['Subtype', 'ER', 'PR', 'HER2', 'Ki-67', 'Frequency', 'Treatment'], [ ['Luminal A', '+', '+', '-', 'Low', '50–65%', 'Endocrine therapy; chemo rarely needed'], ['Luminal B (HER2-)', '+', 'Low/-', '-', 'High', 'Included', 'Endocrine + chemotherapy'], ['Luminal B (HER2+)', '+', 'Low/-', '+', 'Any', 'Included', 'Anti-HER2 + endocrine + chemo'], ['HER2-enriched', '-', '-', '+', 'High', '~15%', 'Anti-HER2 + chemotherapy'], ['Triple Negative (TNBC)', '-', '-', '-', 'High', '~15%', 'Chemotherapy ± immunotherapy ± PARP inhibitor'], ], col_widths=[1.6, 0.4, 0.4, 0.5, 0.5, 0.9, 2.3] ) bullet('TNBC associated with BRCA1 mutations; young women; African American women; early relapse pattern (<8 yrs); brain and visceral metastases predominate') bullet('HER2-enriched: before targeted therapy had worst prognosis; dramatically improved with trastuzumab') heading2('4.4 Histological Features of Specific Cancers') heading3('Invasive Ductal Carcinoma (IDC NOS)') bullet('Irregular infiltrative borders; prominent DESMOPLASTIC STROMA (gives stony hard texture)') bullet('Tubule formation, nuclear pleomorphism, mitotic figures — graded by Nottingham') bullet('Lymphovascular invasion (LVI): important adverse prognostic factor') bullet('Calcification may be present') heading3('Invasive Lobular Carcinoma (ILC)') bullet('Single-file ("Indian file") pattern of tumour cells through stroma') bullet('Small uniform cells with intracytoplasmic mucin vacuoles ("signet-ring" cells)') bullet('Concentric/targetoid growth around pre-existing ducts and lobules') bullet('LOSS OF E-CADHERIN (IHC negative): CDH1 gene mutation/deletion — PATHOGNOMONIC') bullet('Alveolar, solid, pleomorphic, and tubulolobular subtypes exist') heading3('DCIS — Key Histological Points') bullet('Malignant cells WITHIN ductal basement membrane — no stromal invasion') bullet('Comedo DCIS: central necrosis + calcification → microcalcifications on mammography') bullet('Grade and ER status more important than architectural pattern for treatment decisions') bullet('Frequently coexists with invasive cancer; morphology of both usually similar') doc.add_page_break() # ============================================================ # 5. CLINICAL FEATURES # ============================================================ heading1('5. CLINICAL FEATURES') heading2('5.1 History') bullet('Lump: onset, duration, change with menstrual cycle, pain') bullet('Skin changes: dimpling, peau d\'orange, colour change, ulceration') bullet('Nipple changes: discharge (colour, unilateral/bilateral, spontaneous/expressed), retraction, eczema/scaling') bullet('Axillary lump — lymphadenopathy') bullet('Systemic: weight loss, bone pain, breathlessness, jaundice (= metastatic disease)') bullet('Risk factors: family history, OCP/HRT, previous biopsies/DCIS, radiation, BRCA status') heading2('5.2 Examination Technique') heading3('Inspection (arms by sides, above head, hands on hips → contracted pectoralis)') bullet('Asymmetry of breasts in size/shape/level') bullet('Skin changes: peau d\'orange (>1/3 breast = IBC), erythema, oedema, ulceration') bullet('Skin dimpling: Cooper\'s ligament involvement (also visible with arm elevation)') bullet('Nipple retraction: SLIT-LIKE = duct ectasia; STAR-SHAPED / DEVIATED = malignancy') bullet('Venous dilatation over breast (increased vascularity in cancer)') bullet('Satellite skin nodules, ulceration, en cuirasse appearance') heading3('Palpation (supine, arm above head for inner quadrants)') bullet('Technique: pad of 3 fingers; "clock method" or concentric circles; axilla in sitting position') bullet('Document: Site (quadrant + clock face), Size, Shape, Consistency, Surface, Borders') bullet('Mobility: from skin (pinch) + from deep fascia (patient contracts pectoralis major)') bullet('MALIGNANT LUMP: hard, irregular, non-tender, ill-defined, fixed to skin or deep fascia') bullet('Nipple: discharge (express each quadrant); retraction; Paget\'s changes') bullet('Axilla: levels I, II, III; Supraclavicular fossa; Infraclavicular region') bullet('Liver: hepatomegaly in metastatic disease') heading2('5.3 Signs of Advanced Disease') add_table( ['Sign', 'Structure Involved'], [ ['Peau d\'orange', 'Dermal lymphatic blockage'], ['Skin fixity / dimpling', 'Cooper\'s ligaments infiltrated'], ['Deep fixity (pectoralis))', 'Pectoralis fascia / muscle invasion'], ['Skin ulceration / satellite nodules', 'Direct skin infiltration'], ['En cuirasse carcinoma', 'Diffuse chest wall fibrosis'], ['Axillary node fixity / matting', 'N2 disease; extranodal extension'], ['Arm lymphoedema', 'Axillary vessel/node blockage'], ['Supraclavicular nodes', 'N3 disease'], ], col_widths=[2.5, 4.1] ) doc.add_page_break() # ============================================================ # 6. TRIPLE ASSESSMENT # ============================================================ heading1('6. INVESTIGATION — TRIPLE ASSESSMENT') p = doc.add_paragraph() p.add_run('Triple assessment (Clinical + Radiological + Pathological) achieves ~100% positive predictive value. All three components must be CONCORDANT.').bold = True heading2('6.1 Component 1: Clinical Assessment') bullet('E1 = Normal; E2 = Benign; E3 = Probably benign; E4 = Probably malignant; E5 = Malignant') heading2('6.2 Component 2: Radiological Imaging') heading3('Mammography') bullet('FIRST-LINE in women >35–40 years (dense tissue limits sensitivity in young women)') bullet('Low-voltage, high-amperage x-rays; ~1 mGy per film dose') bullet('Standard views: Craniocaudal (CC) + Mediolateral oblique (MLO)') bullet('MAMMOGRAPHIC SIGNS OF MALIGNANCY:') bullet(' Stellate/spiculated density — MOST SPECIFIC for malignancy', level=1) bullet(' Pleomorphic/heterogeneous microcalcifications — DCIS signature', level=1) bullet(' Asymmetric density, architectural distortion', level=1) bullet(' Skin thickening, nipple retraction, axillary adenopathy (advanced signs)', level=1) heading3('BI-RADS Classification (Breast Imaging Reporting and Data System)') add_table( ['BI-RADS', 'Category', 'Malignancy Risk', 'Action'], [ ['0', 'Incomplete', '-', 'Additional imaging needed'], ['1', 'Negative', '0%', 'Routine screening'], ['2', 'Benign', '0%', 'Routine follow-up'], ['3', 'Probably benign', '<2%', '6-month USS/mammography follow-up'], ['4A/B/C', 'Suspicious', '2–95%', 'Biopsy required; 4A low, 4B intermediate, 4C high suspicion'], ['5', 'Highly suspicious', '>95%', 'Biopsy required; tissue diagnosis before treatment'], ['6', 'Known malignancy', '100%', 'Confirmed cancer; staging/treatment planning'], ], col_widths=[0.8, 1.6, 1.4, 2.8] ) heading3('Ultrasonography (USS)') bullet('FIRST-LINE in young women (<35–40 years) and pregnant/lactating women (dense breasts)') bullet('Distinguishes CYSTIC (anechoic, posterior acoustic enhancement) from SOLID lesions') bullet('BENIGN USS features: well-defined, homogeneous, hypoechoic, wider-than-tall, smooth margins') bullet('MALIGNANT USS features: hypoechoic, irregular/spiculated, taller-than-wide, posterior acoustic shadowing, microlobulation') bullet('AXILLARY USS: in all diagnosed cancers; core biopsy of suspicious nodes (loss of echogenic hilum, cortical thickening >3mm)') bullet('Guides needle localization and CNB') heading3('MRI Breast') bullet('Highest sensitivity (~95–99%) for invasive cancer; lower specificity → false positives') bullet('INDICATIONS:') bullet(' BRCA1/2 annual screening (from age 25–30)', level=1) bullet(' Extent of disease assessment (especially ILC, multifocality/multicentricity)', level=1) bullet(' Response to neoadjuvant chemotherapy (serial MRI)', level=1) bullet(' Dense breasts where other imaging inconclusive', level=1) bullet(' Occult primary with axillary nodal metastases', level=1) bullet(' Assessment of residual disease post-augmentation', level=1) bullet('Dynamic contrast enhancement (DCE-MRI): rapid wash-in and wash-out = malignant kinetics') heading2('6.3 Component 3: Pathological Sampling') heading3('Fine Needle Aspiration Cytology (FNAC)') bullet('21–23G needle; smear stained (Papanicolaou, MGG, H&E)') bullet('Reporting: C1 (inadequate), C2 (benign), C3 (atypical), C4 (suspicious), C5 (malignant)') bullet('Advantages: quick, cheap, therapeutic for cysts; minimal discomfort') bullet('LIMITATIONS: CANNOT distinguish invasive from in-situ; no receptor testing; operator-dependent') bullet('Largely superseded by core needle biopsy in most centres') heading3('Core Needle Biopsy (CNB) — Standard of Care') bullet('14G spring-loaded core gun; or vacuum-assisted biopsy (VAB) 8–11G for calcifications') bullet('Guidance: USS (mass lesions) or stereotactic/mammographic (calcifications) or MRI (MRI-only lesions)') bullet('Provides HISTOLOGICAL diagnosis with tumour type, grade, ER/PR/HER2/Ki-67') bullet('Reporting: B1 (normal), B2 (benign), B3 (uncertain malignant potential), B4 (suspicious), B5 (malignant: B5a in-situ; B5b invasive)') bullet('TITANIUM CLIP placed at biopsy site for future localization — essential') bullet('VAB advantages: removes 12+ cores in single insertion; preferred for microcalcifications, radial scar, papillary lesions') heading3('Sentinel Lymph Node Biopsy (SLNB)') bullet('For staging of clinically/radiologically node-negative axilla (cN0)') bullet('DUAL TECHNIQUE: Tc-99m sulphur colloid (injected ~24h pre-op) + Patent blue dye (intraoperative) — >95% identification rate') bullet('ICG (indocyanine green) fluorescence: emerging as equal/superior to blue dye; no allergic reaction risk') bullet('SLN assessed: intraoperative frozen section OR OSNA (One-Step Nucleic Acid Amplification of CK19 mRNA)') bullet('If positive: proceed to ALND or targeted axillary dissection (TAD)') bullet('Axillary USS with CNB of suspicious nodes pre-operatively; TAD = combined SLNB + clipped node excision after NACT') doc.add_page_break() # ============================================================ # 7. TNM STAGING # ============================================================ heading1('7. STAGING — AJCC 8th EDITION TNM (2018)') p = doc.add_paragraph() p.add_run('AJCC 8th Edition (2017): First staging system to incorporate non-anatomic prognostic factors — ER/PR/HER2 status, Nottingham grade, genomic assays (Oncotype DX, MammaPrint) — into a "Prognostic Stage".').bold = True heading2('7.1 T — Primary Tumour') add_table( ['T', 'Description'], [ ['TX', 'Primary tumour cannot be assessed'], ['T0', 'No evidence of primary tumour'], ['Tis (DCIS)', 'Ductal carcinoma in situ'], ['Tis (Paget)', 'Paget\'s disease of nipple NOT associated with invasive carcinoma or DCIS (Paget with DCIS/IDC staged by size of underlying tumour)'], ['T1mi', 'Microinvasion: ≤1 mm'], ['T1a', '>1 mm to ≤5 mm'], ['T1b', '>5 mm to ≤10 mm'], ['T1c', '>10 mm to ≤20 mm'], ['T2', '>20 mm to ≤50 mm'], ['T3', '>50 mm'], ['T4a', 'Any size, direct extension to chest wall (ribs/intercostal muscles/serratus anterior; NOT pectoralis muscle)'], ['T4b', 'Skin oedema (peau d\'orange), ulceration, or satellite nodules confined to same breast'], ['T4c', 'Both T4a and T4b'], ['T4d', 'Inflammatory carcinoma (IBC)'], ], col_widths=[0.8, 5.8] ) bullet('NOTE: invasion of dermis alone does NOT qualify as T4; LCIS no longer classified as Tis') heading2('7.2 N — Regional Lymph Nodes (Pathological pN)') add_table( ['pN', 'Description'], [ ['pN0', 'No regional LN metastasis; isolated tumour cells (ITCs ≤0.2mm) = pN0(i+)'], ['pN1mi', 'Micrometastasis: >0.2 mm but ≤2.0 mm (>200 cells in single cross section)'], ['pN1', '1–3 positive axillary LN; and/or internal mammary LN by SLN (not clinically detected)'], ['pN2', '4–9 positive axillary LN; OR clinically detected internal mammary LN (without axillary LN)'], ['pN3', '≥10 positive axillary LN; OR infraclavicular (Level III) LN; OR clinically detected IM LN + axillary LN; OR supraclavicular LN'], ], col_widths=[0.9, 5.7] ) bullet('Clinical N (cN1): mobile ipsilateral Level I/II axillary LN; cN2: fixed/matted; cN3: infraclavicular, IM+axillary, or supraclavicular') bullet('Metastasis to contralateral axillary nodes or any non-regional node = M1') heading2('7.3 M — Distant Metastasis') bullet('M0: No clinical or radiological distant metastasis; M0(i+): molecular/histological circulating tumour cells found') bullet('M1: Distant metastasis — any non-regional lymph node, bone, lung, liver, brain, skin (beyond primary area)') heading2('7.4 Anatomic Stage Groups') add_table( ['Stage', 'T', 'N', 'M', '5-Year Survival'], [ ['Stage 0', 'Tis', 'N0', 'M0', '~100%'], ['Stage IA', 'T1', 'N0', 'M0', '~99%'], ['Stage IB', 'T0–T1', 'N1mi', 'M0', '~99%'], ['Stage IIA', 'T0–T1 / T2', 'N1 / N0', 'M0', '~90%'], ['Stage IIB', 'T2 / T3', 'N1 / N0', 'M0', '~80%'], ['Stage IIIA', 'T0–T3 / T3', 'N2 / N1', 'M0', '~60–70%'], ['Stage IIIB', 'T4', 'N0–N2', 'M0', '~50–60%'], ['Stage IIIC', 'Any T', 'N3', 'M0', '~40–50%'], ['Stage IV', 'Any T', 'Any N', 'M1', '~28% (5-yr)'], ], col_widths=[1.0, 0.9, 0.9, 0.7, 3.1] ) heading2('7.5 Staging Workup') bullet('Early (Stage I–II): CBC, LFTs, calcium; NO routine bone scan or CT in asymptomatic patients (low yield)') bullet('Locally advanced/Stage III+: CT chest/abdomen/pelvis + bone scintigraphy OR PET-CT (superior, single modality)') bullet('PET-CT: preferred for staging locally advanced, suspected recurrence, equivocal findings') bullet('MRI brain: if neurological symptoms or HER2+ / TNBC with systemic metastases') bullet('Genomic Assays (early ER+/HER2-/LN0):') bullet(' Oncotype DX (21-gene Recurrence Score, RS): RS 0–25 = endocrine therapy only (TAILORx trial for >50 yrs; <50 yrs with RS 16–25 may benefit from chemo)', level=1) bullet(' MammaPrint (70-gene): genomically low-risk = safe to omit chemo even if clinically high-risk (MINDACT trial)', level=1) bullet(' Prosigna (PAM50), EndoPredict, Breast Cancer Index also validated', level=1) doc.add_page_break() # ============================================================ # 8. MANAGEMENT # ============================================================ heading1('8. MANAGEMENT OF BREAST CANCER') heading2('8.1 Principles') bullet('MULTIDISCIPLINARY TEAM (MDT): surgeon, medical oncologist, radiation oncologist, radiologist, pathologist, breast care nurse, genetic counsellor, reconstructive surgeon, psycho-oncologist') bullet('All new breast cancer cases discussed at weekly MDT before treatment') bullet('Consent includes discussion of reconstruction, fertility preservation (premenopausal), genetic testing') heading2('8.2 Surgical Management') heading3('Breast-Conserving Surgery (BCS) / Wide Local Excision (WLE)') bullet('Removes tumour with adequate margins — "no ink on tumour" = adequate; ≥2mm preferred for DCIS') bullet('EQUIVALENT SURVIVAL to mastectomy when combined with adjuvant whole-breast RT (NSABP B-06 landmark trial)') bullet('CONTRAINDICATIONS to BCS:') bullet(' Multiple tumours in different quadrants (multicentric disease)', level=1) bullet(' Large tumour : breast size ratio (poor cosmetic result)', level=1) bullet(' Cannot receive radiotherapy (e.g. previous chest RT, scleroderma, pregnancy — relative CI)', level=1) bullet(' Inflammatory breast cancer', level=1) bullet(' Persistent positive margins despite re-excision', level=1) bullet(' Patient preference for mastectomy', level=1) bullet('Oncoplastic BCS (Levels I & II): combines tumour excision with immediate volume displacement/replacement; reduces re-excision rates; enables wider excisions') heading3('Mastectomy Types') add_table( ['Procedure', 'What is Removed', 'Indication'], [ ['Total (simple) mastectomy', 'All breast tissue + NAC; pectoralis preserved', 'DCIS (large/multifocal), prophylactic, early cancer not suitable for BCS'], ['Modified Radical Mastectomy (MRM) — Patey\'s', 'Breast + NAC + axillary dissection (L I–II); pectoralis major preserved; minor excised', 'Standard for invasive cancer with axillary disease'], ['Skin-sparing mastectomy', 'Breast tissue + NAC; skin envelope preserved', 'Immediate reconstruction; oncologically equivalent'], ['Nipple-sparing mastectomy', 'Breast tissue only; NAC + skin envelope preserved', 'Prophylactic; select invasive/DCIS; inframammary fold incision'], ['Radical mastectomy (Halsted)', 'Breast + both pectorals + axillary dissection', 'Historical only — no longer standard'], ], col_widths=[1.9, 2.2, 2.5] ) heading3('Localization of Non-palpable Lesions') bullet('Wire-guided localization: traditional; placed day-of-surgery under imaging guidance; painful; scheduling limitations') bullet('ROLL (Radioguided Occult Lesion Localization): Tc-99m injected into lesion; gamma probe guides excision') bullet('Magseed / SAVI Scout (radar reflector): placed at time of biopsy (weeks before surgery); no day-of-surgery procedure; localized with handheld probe in OR') bullet('FIND (Fluoroscopic Intraoperative Neoplasm Detection): locates radiopaque biopsy clip with fluoroscopy; no separate procedure needed') bullet('All techniques: specimen radiograph after excision to confirm lesion retrieved') heading2('8.3 Axillary Surgery') heading3('Sentinel Lymph Node Dissection (SLND/SLNB)') bullet('STANDARD for clinically node-negative (cN0) patients (clinical exam + USS neg)') bullet('Dual technique (blue dye + Tc-99m) or ICG fluorescence') bullet('OSNA (One-Step Nucleic Acid Amplification): CK19 mRNA from lysed SLN; more sensitive than frozen section; gives quantitative result → immediate decision on ALND') bullet('If SLN negative: no further axillary surgery needed') bullet('If SLN positive: see ACOSOG Z0011 below') heading3('Axillary Lymph Node Dissection (ALND)') bullet('Removes Levels I and II axillary nodes (minimum 10 nodes for adequate staging)') bullet('Indications: cN1–3 (clinically positive axilla pre-op); SLN positive (selected patients, see Z0011)') bullet('Complications: lymphoedema (15–20%), seroma, wound infection, arm numbness (ICN nerve), shoulder stiffness, limited arm movement') bullet('ACOSOG Z0011 trial: 1–2 positive SLNs + BCS + whole-breast RT + systemic therapy → NO completion ALND needed; equivalent locoregional control and survival → PRACTICE-CHANGING') bullet('AMAROS trial: positive SLN → axillary RT equivalent to ALND with significantly less lymphoedema') bullet('Axillary Reverse Mapping (ARM): maps arm lymphatics during ALND; preserves them to reduce lymphoedema risk') heading2('8.4 Adjuvant Radiotherapy') heading3('After BCS (Whole-Breast Irradiation — WBI)') bullet('Standard: 40–50 Gy / 15–25 fractions over 3–5 weeks') bullet('Hypofractionated (preferred): 40 Gy / 15 fractions — equivalent to standard (START trials)') bullet('ULTRA-hypofractionation: 26 Gy / 5 fractions over 1 week (FAST-Forward trial — non-inferior)') bullet('Tumour bed boost (10–16 Gy): young patients (<40 yrs), close margins, grade 3, DCIS component') bullet('Accelerated Partial Breast Irradiation (APBI): treats tumour cavity only; options: IORT (20 Gy, TARGIT-A trial), interstitial brachytherapy, 3D conformal external beam; selected low-risk patients (≥50 yrs, T1, ER+, clear margins, no LVSI)') heading3('Post-Mastectomy Radiation Therapy (PMRT)') bullet('STANDARD indications: T3/T4 tumours; ≥4 positive nodes; positive margins') bullet('Consider for: 1–3 positive nodes with high-risk features (premenopausal, Grade 3, LVI)') bullet('Fields: chest wall + regional nodes (internal mammary + supraclavicular ± axilla)') bullet('Delays immediate reconstruction — use tissue expander + delayed exchange') heading2('8.5 Systemic Therapy') heading3('Neoadjuvant Chemotherapy (NACT) — Pre-operative') bullet('Indications: Locally advanced (Stage III+); Inflammatory breast cancer; Large tumour for BCS downsizing; HER2+ and TNBC (guides adjuvant treatment by pCR/residual disease)') bullet('Pathological Complete Response (pCR): no residual invasive cancer in breast + nodes → improved long-term survival (especially TNBC, HER2+)') bullet('Residual disease post-NACT = adverse prognostic sign → escalate adjuvant therapy') bullet('Standard regimens: AC × 4 → T × 4 (doxorubicin/cyclophosphamide → paclitaxel); or FEC-T (5-FU/epirubicin/cyclophosphamide → docetaxel); dose-dense every 2 weeks + G-CSF superior to every 3 weeks') heading3('Endocrine Therapy (ER-positive disease)') add_table( ['Agent', 'Class', 'Indication', 'Key Side Effects'], [ ['Tamoxifen', 'SERM', 'Premenopausal; ± postmenopausal 5–10 yrs', 'DVT/PE, endometrial cancer, hot flushes, cataracts'], ['Anastrozole / Letrozole', 'Non-steroidal AI', 'Postmenopausal (or premenopausal + OFS)', 'Arthralgia, osteoporosis, hot flushes'], ['Exemestane', 'Steroidal AI', 'Postmenopausal; can follow tamoxifen', 'Similar to non-steroidal AIs'], ['Goserelin / Leuprolide', 'LHRH agonist (OFS)', 'Premenopausal high-risk; combined with AI (TEXT/SOFT trials)', 'Menopausal symptoms, bone loss'], ['Fulvestrant', 'SERD (IM)', 'Metastatic ER+/HER2- post-AI failure', 'Injection site reactions'], ['Elacestrant', 'Oral SERD', 'ESR1-mutated metastatic ER+ (EMERALD trial)', 'Nausea, dyslipidaemia'], ], col_widths=[1.4, 1.3, 2.3, 1.6] ) heading3('HER2-Targeted Therapy') add_table( ['Agent', 'Mechanism', 'Setting', 'Key Trial'], [ ['Trastuzumab (Herceptin)', 'Anti-HER2 mAb (domain IV)', 'Adjuvant 1 year; neoadjuvant + chemo', 'HERA, NSABP B-31 — ↓recurrence ~50%'], ['Pertuzumab (Perjeta)', 'Anti-HER2 mAb (domain II — dimerisation inhibitor)', 'Neoadjuvant + trastuzumab + docetaxel; high-risk adjuvant', 'APHINITY — improved IDFS in node+ disease'], ['T-DM1 (Kadcyla)', 'ADC: trastuzumab + emtansine (microtubule inhibitor)', 'Residual HER2+ disease after NACT', 'KATHERINE — ↓recurrence vs. trastuzumab alone'], ['T-DXd (Enhertu)', 'ADC: trastuzumab + deruxtecan (topo-I inhibitor)', 'HER2-positive AND HER2-low metastatic (2nd line+)', 'DESTINY-Breast04 — major PFS/OS improvement in HER2-low'], ['Lapatinib (Tykerb)', 'TKI (HER1+HER2)', 'Metastatic HER2+ (CNS metastases)', 'Historical; replaced by newer agents'], ['Tucatinib', 'Selective HER2 TKI', 'Metastatic HER2+ with brain mets (with T-DM1 or trastuzumab)', 'HER2CLIMB trial'], ['Neratinib', 'Irreversible pan-HER TKI', 'Extended adjuvant after trastuzumab (ExteNET trial)', '↓distant recurrence in HR+/HER2+ subgroup'], ], col_widths=[1.3, 2.0, 1.5, 1.8] ) heading3('Triple-Negative Breast Cancer (TNBC) — Systemic Therapy') bullet('CHEMOTHERAPY: anthracycline (doxorubicin/epirubicin) + taxane backbone; add carboplatin if BRCA1/2 mutation') bullet('PEMBROLIZUMAB (PD-1 checkpoint inhibitor):') bullet(' KEYNOTE-522: neoadjuvant pembro + chemo → surgery → adjuvant pembro (1 yr); significant ↑pCR (64.8% vs 51.2%) and event-free survival', level=1) bullet(' KEYNOTE-355: metastatic TNBC, PD-L1 CPS ≥10; pembrolizumab + chemo → ↑PFS and OS', level=1) bullet('OLAPARIB (PARP inhibitor):') bullet(' For germline BRCA1/2-mutated, HER2-negative (TNBC or ER+) — adjuvant setting', level=1) bullet(' OlympiA trial: 1 year olaparib after (neo)adjuvant chemo → ↓distant metastases by 42%; ↑OS at 4-year follow-up', level=1) bullet(' OlympiAD: olaparib vs. chemotherapy in metastatic gBRCA-mutated HER2- breast cancer → superior PFS', level=1) bullet('CAPECITABINE: oral fluoropyrimidine; adjuvant for residual TNBC after NACT (CREATE-X trial)') bullet('SACITUZUMAB GOVITECAN (Trodelvy): TROP-2 targeted ADC; metastatic TNBC (ASCENT trial) — significant PFS and OS improvement over chemotherapy') heading3('CDK4/6 Inhibitors (ER+/HER2- disease)') bullet('Palbociclib (Ibrance), Ribociclib (Kisqali), Abemaciclib (Verzenio) — combined with AIs or fulvestrant') bullet('METASTATIC: standard first-line therapy for HR+/HER2- metastatic; MONALEESA-2, PALOMA-3, MONARCH-3 trials') bullet('Ribociclib (MONALEESA-3 & 7): FIRST CDK4/6 inhibitor to demonstrate OVERALL SURVIVAL benefit; especially in premenopausal metastatic HR+/HER2-') bullet('ABEMACICLIB ADJUVANT (monarchE trial): 2 years abemaciclib + endocrine therapy for high-risk ER+/HER2- early breast cancer (≥4 positive LN; OR 1–3 LN with grade 3, T3+, or Ki-67 ≥20%) → significant ↑IDFS and distant relapse-free survival') heading3('PI3K/AKT/mTOR Pathway Inhibitors') bullet('Alpelisib (Piqray): PI3K-alpha inhibitor; PIK3CA-mutated HR+/HER2- metastatic BC + fulvestrant (SOLAR-1 trial) → ↑PFS') bullet('Capivasertib: AKT inhibitor; PIK3CA/AKT1/PTEN-altered HR+/HER2- metastatic BC + fulvestrant (CAPItello-291 trial)') bullet('Everolimus: mTOR inhibitor; exemestane + everolimus for postmenopausal HR+/HER2- post-AI (BOLERO-2 trial)') heading3('Bone-Modifying Agents') bullet('Bisphosphonates (Zoledronic acid q6 months; Clodronate): reduce bone metastases; ↑OS in postmenopausal/ovarian-suppressed patients (EBCTCG meta-analysis)') bullet('Denosumab (RANK-L inhibitor): reduces skeletal-related events in bone metastases; also studied in adjuvant setting') doc.add_page_break() # ============================================================ # 9. DCIS MANAGEMENT # ============================================================ heading1('9. MANAGEMENT OF DCIS') bullet('Surgery: BCS preferred; CLEAR MARGINS ≥2mm; mastectomy for large/multifocal/inability to achieve margins') bullet('RT: whole-breast RT after BCS reduces ipsilateral recurrence (NSABP B-17 & B-24 trials); benefit greatest in high-grade/comedo DCIS; absolute benefit modest in low-risk DCIS (active surveillance studies ongoing)') bullet('Endocrine therapy:') bullet(' Tamoxifen (premenopausal/postmenopausal): reduces ipsilateral + contralateral breast cancer (NSABP B-24)', level=1) bullet(' Anastrozole (postmenopausal): NSABP B-35 → superior breast cancer-free survival vs. tamoxifen in <60 yrs', level=1) bullet(' Overall benefit: ~50% reduction in breast cancer recurrence with endocrine therapy', level=1) bullet('SLNB in DCIS:') bullet(' Recommended if mastectomy planned (pathology may reveal invasive component)', level=1) bullet(' Recommended for high-risk DCIS: grade 3, mass-forming, >2 cm', level=1) bullet('SentiNot trial: SPIO nanoparticle injection at time of DCIS surgery without upfront SLNB; delayed SLNB if invasive disease on final pathology; 78.7% of patients avoided SLNB entirely') bullet('Active surveillance/watchful waiting for low-risk DCIS: under investigation (COMET, LORD, LORIS trials) — NOT current standard') doc.add_page_break() # ============================================================ # 10. BREAST RECONSTRUCTION # ============================================================ heading1('10. BREAST RECONSTRUCTION') heading2('10.1 Timing') bullet('IMMEDIATE: at time of mastectomy; fewer operations; preserves skin envelope; improved cosmesis; preferred if NO PMRT expected') bullet('DELAYED: separate procedure; indicated when PMRT needed, advanced cancer, active smoking, uncontrolled DM, high BMI') bullet('Inflammatory breast cancer: CONTRAINDICATED for immediate reconstruction (needs PMRT urgently)') heading2('10.2 Types') heading3('Implant-Based Reconstruction') bullet('TWO-STAGE: tissue expander placed at mastectomy → gradual saline filling in clinic → exchange to permanent implant (6–12 wks; after RT if needed)') bullet('DIRECT-TO-IMPLANT (one-stage): permanent implant at mastectomy; ideal for nipple-sparing mastectomy; requires well-perfused skin flap') bullet('ACELLULAR DERMAL MATRIX (ADM): biological scaffold supports lower pole of implant; reduces animation deformity; enables pre-pectoral implant placement') bullet('PRE-PECTORAL implant: placed above pectoralis major; reduces animation deformity (muscle contraction causing implant movement); requires ADM support') heading3('Autologous Reconstruction') add_table( ['Flap', 'Type', 'Key Features', 'Donor Site Issues'], [ ['DIEP flap', 'Free flap (microsurgical)', 'Deep inferior epigastric perforator; GOLD STANDARD; preserves rectus muscle entirely; natural feel and appearance', 'Abdominal scar; requires microsurgical expertise; longer surgery'], ['TRAM flap', 'Pedicled or free', 'Transverse rectus abdominis musculocutaneous; reliable; sacrifices rectus muscle', 'Hernia/weakness risk; abdominal bulge'], ['Latissimus dorsi (LD)', 'Pedicled myocutaneous', 'Reliable; well-vascularised; combined with implant in most cases', 'Shoulder weakness (latissimus function), back scar, seroma'], ['SGAP flap', 'Free flap', 'Superior gluteal artery perforator; when abdomen unavailable', 'Gluteal scar; complex microsurgery'], ], col_widths=[1.2, 1.2, 2.5, 1.7] ) doc.add_page_break() # ============================================================ # 11. RECENT ADVANCES # ============================================================ heading1('11. RECENT ADVANCES (2020–2026)') heading2('11.1 Surgical Advances') bullet('Nipple-sparing mastectomy: expanded indications; oncologically safe with negative retroareolar margins; markedly improved cosmesis and body image') bullet('Oncoplastic BCS: reduces positive margins, re-excision rates, and cosmetic deformity; "Level I and II" techniques for varying excision volumes') bullet('OSNA intraoperative SLN assessment: higher sensitivity vs. frozen section; CK19 mRNA copy number quantifies tumour burden; same-session ALND decision') bullet('Wireless localisation (Magseed, SAVI Scout, RFID tags): placed weeks before surgery; no day-of-surgery localisation procedure; patient-friendly') bullet('Z0011 & AMAROS trials: eliminated routine ALND in selected SLN-positive patients; massively reduced lymphoedema burden') bullet('Targeted axillary dissection (TAD): removal of biopsy-clipped positive node + SLN after NACT; lower false-negative rate than SLNB alone') heading2('11.2 Novel Systemic Therapies') bullet('T-DXd / Trastuzumab Deruxtecan (Enhertu): PARADIGM SHIFT') bullet(' HER2-POSITIVE: superior PFS and OS in metastatic disease (DESTINY-Breast03 vs. T-DM1)', level=1) bullet(' HER2-LOW (IHC 1+ or 2+/FISH-): DESTINY-Breast04 — major PFS and OS improvement over chemotherapy in previously treated metastatic HR+ and TNBC HER2-low disease; HER2-low is now a DISTINCT TARGETABLE ENTITY, changing classification of ~50% of "HER2-negative" cancers', level=1) bullet('Pembrolizumab in TNBC (KEYNOTE-522): neoadjuvant immunotherapy + chemo → improved pCR (64.8% vs 51.2%) AND event-free survival at 3 years; FDA-approved for high-risk early TNBC') bullet('Olaparib adjuvant (OlympiA): 1-year olaparib for germline BRCA-mutated, HER2-negative high-risk early breast cancer; ↑DDFS and OS benefit at extended follow-up') bullet('Abemaciclib adjuvant (monarchE): CDK4/6 inhibitor added to endocrine therapy in HR+/HER2- high-risk early BC; significant and sustained reduction in invasive disease recurrence') bullet('Ribociclib overall survival (MONALEESA-3 & 7): first CDK4/6 inhibitor to demonstrate OS benefit; standard of care in metastatic HR+/HER2-') bullet('Elacestrant/Camizestrant (oral SERDs): ESR1-mutated endocrine-resistant ER+ metastatic BC; novel oral SERDs outperform fulvestrant in ESR1-mutated disease (EMERALD trial)') bullet('Sacituzumab govitecan: TROP-2 ADC; ASCENT trial → significant OS benefit in metastatic TNBC vs. chemo; TROPiCS-02 trial in HR+ metastatic disease') bullet('Capivasertib (AKT inhibitor, CAPItello-291): PI3K/AKT/PTEN-altered HR+/HER2- metastatic BC + fulvestrant → ↑PFS and OS') bullet('Inavolisib + palbociclib + fulvestrant: PI3K + CDK4/6 + endocrine triple combination for PIK3CA-mutated metastatic HR+/HER2-; INAVO120 trial') heading2('11.3 Radiation Advances') bullet('Ultra-hypofractionation (FAST-Forward trial): 26 Gy / 5 fractions in 1 week; non-inferior to 40 Gy/15 fractions for local recurrence at 5 years; adopted in many UK centres post-COVID') bullet('APBI/IORT (TARGIT-A trial): single-dose IORT (20 Gy) at time of BCS; non-inferior to WBI in selected low-risk patients (≥45 yrs, T1–T2 ER+, clear margins)') bullet('Proton beam therapy: reduced cardiac and pulmonary dose; important for left-sided, young patients, post-reconstruction; increasing availability') bullet('MR-guided radiotherapy (MR-Linac): real-time tumour tracking; reducing treatment margins; improving precision') heading2('11.4 Genomics and Precision Medicine') bullet('Oncotype DX (TAILORx trial): RS 11–25 in ER+/HER2-/N0 women >50 yrs → endocrine therapy alone sufficient; chemotherapy not beneficial') bullet('MammaPrint (MINDACT trial): genomically low-risk patients can safely omit chemotherapy even if clinically high-risk by traditional criteria; 46% of "high clinical risk" patients proved genomically low-risk') bullet('Liquid biopsy (ctDNA): emerging tool for:') bullet(' Early detection of metastatic relapse (months before clinical detection)', level=1) bullet(' Treatment monitoring (response/resistance)', level=1) bullet(' Detection of ESR1, PIK3CA, AKT1 resistance mutations to guide therapy switch', level=1) bullet('BRCA-like/HRD (Homologous Recombination Deficiency) testing: identifies BRCA-like tumours even without germline BRCA mutation → platinum/PARP inhibitor sensitivity') bullet('Multi-gene germline panel testing (NCCN indications): BRCA1/2, PALB2, CHEK2, ATM, CDH1, STK11, TP53 — guides preventive and therapeutic decisions') doc.add_page_break() # ============================================================ # 12. LANDMARK TRIALS # ============================================================ heading1('12. LANDMARK TRIALS — SUMMARY TABLE') add_table( ['Trial', 'Question', 'Key Finding', 'Impact'], [ ['NSABP B-06', 'BCS vs. mastectomy', 'BCS + RT = mastectomy in overall survival', 'Established BCS as standard for early breast cancer'], ['NSABP B-17', 'RT after BCS for DCIS', 'RT reduces ipsilateral recurrence by 50%', 'Standard: RT after BCS for DCIS'], ['NSABP B-24', 'Tamoxifen + RT for DCIS', 'Tamoxifen further reduces ipsilateral and contralateral recurrence in ER+ DCIS', 'Endocrine therapy standard for ER+ DCIS after BCS+RT'], ['ACOSOG Z0011', 'ALND vs. no ALND for 1–2 +ve SLN in BCS', 'No survival difference; no ALND needed', 'Eliminated routine ALND in 1–2 SLN+ BCS patients'], ['AMAROS', '+ve SLN: ALND vs. axillary RT', 'Equivalent locoregional control; less lymphoedema with RT', 'Axillary RT alternative to ALND in SLN+ patients'], ['TAILORx', 'Chemo vs. endocrine for RS 11–25', 'Chemo adds no benefit in women >50 yrs with RS 11–25 ER+/HER2-/N0', 'Spares ~70% of early ER+ patients from chemo'], ['MINDACT', 'MammaPrint in guiding chemo decision', 'Genomically low-risk can omit chemo (even if clinically high-risk)', 'Validated 70-gene assay in clinical decision-making'], ['KATHERINE', 'T-DM1 vs. trastuzumab for residual HER2+ post-NACT', 'T-DM1 → ↓recurrence by 50%', 'T-DM1 standard for residual HER2+ disease'], ['KEYNOTE-522', 'Pembrolizumab + NACT in high-risk TNBC', '↑pCR (64.8% vs 51.2%) and ↑event-free survival', 'Pembrolizumab standard of care in early high-risk TNBC'], ['OlympiA', 'Adjuvant olaparib in gBRCA+ HER2-', '↓distant metastasis by 42%; ↑OS', 'PARP inhibitor adjuvant standard for gBRCA+ high-risk'], ['monarchE', 'Adjuvant abemaciclib in high-risk HR+/HER2-', '↑invasive DFS and distant RFS sustained at 4 years', 'CDK4/6 inhibitor adjuvant for high-risk ER+ early BC'], ['DESTINY-Breast04', 'T-DXd in HER2-low metastatic BC', 'Major ↑PFS and OS vs. chemotherapy; HER2-low = new entity', 'Redefined HER2 spectrum; T-DXd standard for HER2-low'], ['FAST-Forward', '5 vs. 15 vs. 3-week RT after BCS', '26Gy/5fr = 40Gy/15fr for local recurrence at 5 years', 'Ultra-hypofractionation adopted as new standard'], ['MONALEESA-3/7', 'Ribociclib in HR+/HER2- metastatic', 'First CDK4/6 inhibitor to show OS benefit', 'Standard first-line therapy in HR+/HER2- metastatic'], ['TARGIT-A', 'IORT vs. whole-breast RT in low-risk BCS', 'IORT non-inferior for local recurrence in selected patients', 'APBI/IORT option for low-risk early breast cancer'], ], col_widths=[1.5, 1.7, 2.0, 1.4] ) # Save path = '/tmp/workspace/breast-surgery/Breast_Surgery_PG_Notes.docx' doc.save(path) print(f"Saved: {path}") PYEOF
Breast Surgery PG Notes
Word Document · DOCX
| Section | Content |
|---|---|
| 1 | Surgical Anatomy (relations, Cooper's ligaments, TDLU, blood supply, Batson's plexus, lymphatics, nerve supply) |
| 2 | Benign Pathologies (ANDI, fibrocystic, fibroadenoma, phyllodes, abscess, duct ectasia, papilloma, fat necrosis, gynaecomastia) |
| 3 | Malignant Pathologies (epidemiology, risk factors table, DCIS subtypes, ILC, IDC, special types, IBC, Paget's) |
| 4 | Histopathology (Nottingham grading, IHC panel, molecular subtypes table, IDC/ILC/DCIS microscopy) |
| 5 | Clinical Features (full examination technique, signs of advanced disease) |
| 6 | Triple Assessment (E1-5, BI-RADS 0-6 table, USS, MRI, FNAC C1-5, CNB B1-5, SLNB technique) |
| 7 | AJCC 8th Edition TNM (full T/N/M, stage groups with survival, staging workup, genomic assays) |
| 8 | Management (MDT, BCS vs. mastectomy, ALND vs. SLNB/Z0011, localization, RT, endocrine therapy, HER2 therapy table, TNBC, CDK4/6, PI3K/AKT, bone agents) |
| 9 | DCIS Management (surgery, RT, endocrine therapy, SentiNot trial) |
| 10 | Breast Reconstruction (implant-based, DIEP/TRAM/LD/SGAP autologous flaps) |
| 11 | Recent Advances (T-DXd/HER2-low, pembrolizumab/TNBC, olaparib, abemaciclib adjuvant, oral SERDs, FAST-Forward RT, liquid biopsy) |
| 12 | 15 Landmark Trials summary table |
Difference between dimpling, puckering, tethering
| Feature | Dimpling | Puckering | Tethering |
|---|---|---|---|
| Definition | A small, focal inward pit/depression in the skin | A gathered/folded puckered appearance of skin over a larger area | Skin drawn inward and fixed; loss of free mobility of skin |
| No. of Cooper's ligaments involved | Single ligament shortened | Several ligaments shortened | Many ligaments shrunken (more advanced) |
| Appearance | Single small indentation, like a dimple | Skin creased/crinkled over tumour - resembles puckered fabric | Skin taut, retracted, adherent to underlying tumour |
| Elicited | Often visible on inspection; accentuated by raising arms or skin pinch | Visible on inspection and accentuated by arm movements | Visible at rest; skin cannot be moved freely over the lump |
| Stage implication | Early sign; skin not directly invaded | Intermediate | More advanced local involvement; but not T4 unless full invasion |
| Vs. peau d'orange | Focal - due to ligament contraction | Focal-regional | Different from peau d'orange which is due to lymphatic blockage causing diffuse oedema |
"D-P-T: 1 ligament, Several, Many"
- Dimpling = 1 Cooper's ligament
- Puckering = Several Cooper's ligaments
- Tethering = Many Cooper's ligaments
Difference between T4a (chest wall invasion) vs. T4b (skin involvement)
"Tumour of any size with direct extension to the chest wall and/or to the skin (ulceration or macroscopic nodules). Invasion of the dermis alone does NOT qualify as T4."
"Extension to the chest wall; invasion or adherence to pectoralis muscle in the absence of invasion of chest wall structures does NOT qualify as T4a."
| Structure | T4a? |
|---|---|
| Ribs | YES |
| Intercostal muscles | YES |
| Serratus anterior | YES |
| Pectoralis major (invasion/adherence) | NO - NOT T4a |
| Pectoralis minor | NO - NOT T4a |
"Ulceration and/or ipsilateral macroscopic satellite nodules and/or oedema (including peau d'orange) of the skin — that does NOT meet the criteria for inflammatory carcinoma."
| Sign | Description | Notes |
|---|---|---|
| Ulceration | Full-thickness skin breakdown over the tumour | Must be direct tumour ulceration, not post-biopsy/trauma |
| Macroscopic satellite skin nodules | Visible discrete tumour nodules in skin of the same breast | Ipsilateral only; microscopic skin nodules alone are NOT sufficient |
| Skin oedema / peau d'orange | Lymphatic blockage → skin thickening + follicular pitting | Must involve the breast skin (ipsilateral); if >1/3 of breast = consider T4d |
| T | Definition |
|---|---|
| T4c | Both T4a AND T4b present simultaneously |
| T4d | Inflammatory carcinoma: peau d'orange + erythema involving >1/3 of breast surface ± a lump; caused by dermal lymphatic tumour emboli (not infection); diagnosed CLINICALLY |
| Feature | T4a | T4b |
|---|---|---|
| Structure involved | Chest wall (ribs, intercostals, serratus) | Skin of breast |
| Pectoralis muscle invasion | NOT T4a | Not relevant |
| Dermis invasion alone (histology) | Not applicable | NOT T4b |
| Qualifying signs | Deep immobility on chest wall | Ulceration, macroscopic satellite nodules, peau d'orange/oedema |
| Clinical test | Immobile on chest wall even with pectoralis relaxed | Visible skin breakdown, nodules, or oedema |
| Combined | T4c = T4a + T4b | |
| IBC rule | — | Peau d'orange >1/3 breast + erythema = T4d, NOT T4b |
Generate a quick reference pdf on breast cancer staging with decision algorithms Explain the major traps also.
mkdir -p /tmp/workspace/breast-staging && python3 -c "from reportlab.lib.pagesizes import A4; print('reportlab ok')"
cat > /tmp/workspace/breast-staging/build_pdf.py << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.units import mm, cm from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak, HRFlowable, KeepTogether) from reportlab.platypus.flowables import Flowable from reportlab.graphics.shapes import Drawing, Rect, String, Line, Arrow, Polygon from reportlab.graphics import renderPDF import math # ── colours ────────────────────────────────────────────────────────────────── NAVY = colors.HexColor('#1A356E') CRIMSON = colors.HexColor('#C0392B') FOREST = colors.HexColor('#1A6E4A') AMBER = colors.HexColor('#D35400') PURPLE = colors.HexColor('#6C3483') TEAL = colors.HexColor('#117A65') STEEL = colors.HexColor('#2E86C1') LGRAY = colors.HexColor('#F0F3F4') MGRAY = colors.HexColor('#D5D8DC') DGRAY = colors.HexColor('#566573') WHITE = colors.white BLACK = colors.black GOLD = colors.HexColor('#F1C40F') LTRED = colors.HexColor('#FADBD8') LTGREEN = colors.HexColor('#D5F5E3') LTBLUE = colors.HexColor('#D6EAF8') LTYELLOW = colors.HexColor('#FEF9E7') LTPURPLE = colors.HexColor('#EAD1FF') W, H = A4 # 595.27 x 841.89 pts # ── styles ─────────────────────────────────────────────────────────────────── def make_styles(): s = {} base = ParagraphStyle('base', fontName='Helvetica', fontSize=9, leading=13, textColor=BLACK) s['title'] = ParagraphStyle('title', fontName='Helvetica-Bold', fontSize=22, leading=28, textColor=WHITE, alignment=TA_CENTER) s['sub'] = ParagraphStyle('sub', fontName='Helvetica', fontSize=11, leading=16, textColor=WHITE, alignment=TA_CENTER) s['h1'] = ParagraphStyle('h1', fontName='Helvetica-Bold', fontSize=13, leading=18, textColor=WHITE, alignment=TA_CENTER) s['h2'] = ParagraphStyle('h2', fontName='Helvetica-Bold', fontSize=11, leading=15, textColor=NAVY) s['h2w'] = ParagraphStyle('h2w', fontName='Helvetica-Bold', fontSize=11, leading=15, textColor=WHITE, alignment=TA_CENTER) s['body'] = ParagraphStyle('body', fontName='Helvetica', fontSize=8.5, leading=13, textColor=BLACK) s['bodysm'] = ParagraphStyle('bodysm', fontName='Helvetica', fontSize=7.5, leading=11, textColor=BLACK) s['bold'] = ParagraphStyle('bold', fontName='Helvetica-Bold', fontSize=8.5, leading=13, textColor=BLACK) s['trap'] = ParagraphStyle('trap', fontName='Helvetica', fontSize=8.5, leading=13, textColor=CRIMSON) s['trapbold']= ParagraphStyle('trapbold',fontName='Helvetica-Bold', fontSize=9, leading=13, textColor=CRIMSON) s['ok'] = ParagraphStyle('ok', fontName='Helvetica-Bold', fontSize=8.5, leading=13, textColor=FOREST) s['center'] = ParagraphStyle('center', fontName='Helvetica', fontSize=8.5, leading=12, alignment=TA_CENTER) s['centerbold'] = ParagraphStyle('centerbold', fontName='Helvetica-Bold', fontSize=9, leading=13, alignment=TA_CENTER, textColor=NAVY) s['note'] = ParagraphStyle('note', fontName='Helvetica-Oblique', fontSize=7.5, leading=11, textColor=DGRAY) s['tblhdr'] = ParagraphStyle('tblhdr', fontName='Helvetica-Bold', fontSize=8, leading=11, textColor=WHITE, alignment=TA_CENTER) s['tblcell'] = ParagraphStyle('tblcell', fontName='Helvetica', fontSize=8, leading=11, textColor=BLACK) s['tblbold'] = ParagraphStyle('tblbold', fontName='Helvetica-Bold', fontSize=8, leading=11, textColor=BLACK) return s ST = make_styles() # ── helpers ─────────────────────────────────────────────────────────────────── def section_header(text, color=NAVY, text_color=WHITE): tbl = Table([[Paragraph(text, ST['h1'])]], colWidths=[W - 40*mm]) tbl.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), color), ('ROUNDEDCORNERS', [4, 4, 4, 4]), ('TOPPADDING', (0,0), (-1,-1), 6), ('BOTTOMPADDING', (0,0), (-1,-1), 6), ('LEFTPADDING', (0,0), (-1,-1), 10), ('RIGHTPADDING', (0,0), (-1,-1), 10), ])) return tbl def colored_cell(text, bg, fg=BLACK, bold=False, fontsize=8, align=TA_LEFT): fn = 'Helvetica-Bold' if bold else 'Helvetica' sty = ParagraphStyle('cc', fontName=fn, fontSize=fontsize, leading=fontsize+3, textColor=fg, alignment=align) return Paragraph(text, sty) def trap_box(num, title, wrong, right, note=''): hdr = [[colored_cell(f'⚠ TRAP {num}: {title}', LTRED, CRIMSON, bold=True, fontsize=9)]] tbl_hdr = Table(hdr, colWidths=[W-40*mm]) tbl_hdr.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), LTRED), ('BOX', (0,0), (-1,-1), 1.2, CRIMSON), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 8), ])) body_rows = [ [colored_cell('✗ WRONG:', WHITE, CRIMSON, bold=True), colored_cell(wrong, WHITE, CRIMSON)], [colored_cell('✓ CORRECT:', WHITE, FOREST, bold=True), colored_cell(right, WHITE, FOREST)], ] if note: body_rows.append([colored_cell('📌 NOTE:', WHITE, AMBER, bold=True), colored_cell(note, WHITE, AMBER)]) tbl_body = Table(body_rows, colWidths=[30*mm, W-40*mm-30*mm]) tbl_body.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), WHITE), ('BOX', (0,0), (-1,-1), 1.2, CRIMSON), ('LINEABOVE', (0,0), (-1,0), 0, WHITE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 8), ('VALIGN', (0,0), (-1,-1), 'TOP'), ])) return [tbl_hdr, tbl_body, Spacer(1, 4*mm)] # ══════════════════════════════════════════════════════════════════════════════ # BUILD DOCUMENT # ══════════════════════════════════════════════════════════════════════════════ path = '/tmp/workspace/breast-staging/Breast_Cancer_Staging_QR.pdf' doc = SimpleDocTemplate(path, pagesize=A4, leftMargin=20*mm, rightMargin=20*mm, topMargin=18*mm, bottomMargin=18*mm) story = [] # ───────────────────────────────────────────────────────────────────────────── # TITLE BLOCK # ───────────────────────────────────────────────────────────────────────────── title_data = [[ Paragraph('BREAST CANCER STAGING', ST['title']), ],[ Paragraph('AJCC 8th Edition · Quick Reference + Decision Algorithms + Exam Traps', ST['sub']), ]] title_tbl = Table(title_data, colWidths=[W-40*mm]) title_tbl.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), NAVY), ('ROUNDEDCORNERS', [6,6,6,6]), ('TOPPADDING', (0,0), (-1,-1), 8), ('BOTTOMPADDING', (0,0), (-1,-1), 8), ('LEFTPADDING', (0,0), (-1,-1), 12), ('RIGHTPADDING', (0,0), (-1,-1), 12), ])) story.append(title_tbl) story.append(Spacer(1, 5*mm)) # ───────────────────────────────────────────────────────────────────────────── # SECTION 1 — T STAGING # ───────────────────────────────────────────────────────────────────────────── story.append(section_header('T — PRIMARY TUMOUR STAGING', NAVY)) story.append(Spacer(1, 2*mm)) t_headers = [ colored_cell('T', NAVY, WHITE, bold=True, align=TA_CENTER), colored_cell('Size / Criteria', NAVY, WHITE, bold=True), colored_cell('Key Rule / Trap', NAVY, WHITE, bold=True), ] t_rows = [ [colored_cell('Tis\n(DCIS)', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('Ductal carcinoma in situ — cells within basement membrane\nTis (Paget) = Paget\'s of nipple NOT associated with underlying DCIS/IDC', LGRAY, BLACK), colored_cell('LCIS is NO LONGER Tis in AJCC 8th — classified as benign\nPaget\'s WITH underlying IDC/DCIS → staged by the IDC/DCIS size', LTYELLOW, AMBER, bold=False)], [colored_cell('T1mi', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('Microinvasion ≤ 1 mm', LGRAY, BLACK), colored_cell('Multiple foci of microinvasion → use LARGEST focus, NOT sum', LTYELLOW, AMBER)], [colored_cell('T1a', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('> 1 mm to ≤ 5 mm', LGRAY, BLACK), colored_cell('Round 1.1–1.9 mm → report as 2 mm (T1a)', LGRAY, DGRAY)], [colored_cell('T1b', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('> 5 mm to ≤ 10 mm', LGRAY, BLACK), colored_cell('', LGRAY, BLACK)], [colored_cell('T1c', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('> 10 mm to ≤ 20 mm', LGRAY, BLACK), colored_cell('', LGRAY, BLACK)], [colored_cell('T2', LTBLUE, STEEL, bold=True, align=TA_CENTER), colored_cell('> 20 mm to ≤ 50 mm', LTBLUE, BLACK), colored_cell('Clinical vs. pathologic size → use pathologic (takes precedence)', LTBLUE, DGRAY)], [colored_cell('T3', colors.HexColor('#FAD7A0'), AMBER, bold=True, align=TA_CENTER), colored_cell('> 50 mm', colors.HexColor('#FAD7A0'), BLACK), colored_cell('T3 = size only; NO skin/chest wall involvement', colors.HexColor('#FAD7A0'), AMBER)], [colored_cell('T4a', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('Extension to chest wall\n(ribs, intercostal muscles, serratus anterior)', LTRED, BLACK), colored_cell('⚠ Pectoralis muscle invasion/adherence = NOT T4a\nChest wall ≠ pectoralis', LTRED, CRIMSON, bold=True)], [colored_cell('T4b', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('Skin: ulceration AND/OR macroscopic satellite nodules\nAND/OR oedema (peau d\'orange) — NOT meeting IBC criteria', LTRED, BLACK), colored_cell('⚠ Dermis invasion on histology alone = NOT T4b\n⚠ Dimpling/tethering = NOT T4b\n⚠ Peau d\'orange > 1/3 breast + erythema = T4d (IBC), not T4b', LTRED, CRIMSON, bold=True)], [colored_cell('T4c', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('Both T4a AND T4b', LTRED, BLACK), colored_cell('T4c = T4a + T4b combined', LTRED, CRIMSON)], [colored_cell('T4d', colors.HexColor('#D2B4DE'), PURPLE, bold=True, align=TA_CENTER), colored_cell('Inflammatory carcinoma (IBC)\nPeau d\'orange + erythema > 1/3 of breast ± lump', colors.HexColor('#D2B4DE'), BLACK), colored_cell('Diagnosis is CLINICAL (not radiological or histological alone)\nDermal lymphatic emboli on biopsy — confirms but not required\nNACT first → MRM → RT; NO immediate reconstruction', colors.HexColor('#D2B4DE'), PURPLE, bold=True)], ] t_table_data = [t_headers] + t_rows t_table = Table(t_table_data, colWidths=[14*mm, 68*mm, 73*mm]) t_table.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), NAVY), ('GRID', (0,0), (-1,-1), 0.5, MGRAY), ('VALIGN', (0,0), (-1,-1), 'TOP'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ('ROWBACKGROUNDS', (0,1), (-1,-1), [LGRAY, WHITE]), ])) story.append(t_table) story.append(Spacer(1, 3*mm)) story.append(Paragraph('* Pathologic size takes precedence over clinical size. For mixed IDC + DCIS: T is based on IDC (invasive) component ONLY, not total tumour size.', ST['note'])) story.append(Spacer(1, 4*mm)) # ───────────────────────────────────────────────────────────────────────────── # T4 DECISION ALGORITHM (drawn as a flowchart table) # ───────────────────────────────────────────────────────────────────────────── story.append(section_header('T4 DECISION ALGORITHM — Is it T4?', CRIMSON)) story.append(Spacer(1, 2*mm)) algo_style = ParagraphStyle('alg', fontName='Helvetica', fontSize=8.5, leading=13) algo_bold = ParagraphStyle('algb', fontName='Helvetica-Bold', fontSize=8.5, leading=13) def box(text, bg, fg=BLACK, bold=False): fn = 'Helvetica-Bold' if bold else 'Helvetica' sty = ParagraphStyle('bx', fontName=fn, fontSize=8.5, leading=12, textColor=fg, alignment=TA_CENTER) t = Table([[Paragraph(text, sty)]], colWidths=[None]) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), bg), ('BOX', (0,0), (-1,-1), 1, fg), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ('RIGHTPADDING', (0,0), (-1,-1), 6), ])) return t # Flowchart as structured table q_col = 80*mm a_col = 30*mm r_col = W - 40*mm - q_col - a_col flow_data = [ # row 0 — header [colored_cell('QUESTION', NAVY, WHITE, bold=True, align=TA_CENTER), colored_cell('ANSWER', NAVY, WHITE, bold=True, align=TA_CENTER), colored_cell('RESULT', NAVY, WHITE, bold=True, align=TA_CENTER)], # row 1 [colored_cell('Tumour any size with direct extension to chest wall\nOR skin (ulceration/nodules)?', LGRAY, BLACK), colored_cell('NO', LGRAY, FOREST, bold=True, align=TA_CENTER), colored_cell('→ NOT T4\n (Could be T1/T2/T3 depending on size)', LGRAY, FOREST)], [colored_cell('', LGRAY, BLACK), colored_cell('YES ↓', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('', LGRAY, BLACK)], # row 3 [colored_cell('Does skin involvement = erythema + peau d\'orange\n> 1/3 of breast surface?', colors.HexColor('#EBD5F5'), PURPLE), colored_cell('YES', colors.HexColor('#EBD5F5'), PURPLE, bold=True, align=TA_CENTER), colored_cell('→ T4d (Inflammatory Carcinoma)\n Must also have clinical IBC picture', colors.HexColor('#EBD5F5'), PURPLE, bold=True)], [colored_cell('', colors.HexColor('#EBD5F5'), BLACK), colored_cell('NO ↓', colors.HexColor('#EBD5F5'), NAVY, bold=True, align=TA_CENTER), colored_cell('', colors.HexColor('#EBD5F5'), BLACK)], # row 5 [colored_cell('Is it ONLY dermis invasion on histology\n(no ulceration, no nodules, no oedema)?', LTYELLOW, AMBER), colored_cell('YES', LTYELLOW, AMBER, bold=True, align=TA_CENTER), colored_cell('→ NOT T4b\n Dermis invasion alone does NOT qualify\n Stage by tumour SIZE (T1/T2/T3)', LTYELLOW, AMBER, bold=True)], [colored_cell('', LTYELLOW, BLACK), colored_cell('NO ↓', LTYELLOW, NAVY, bold=True, align=TA_CENTER), colored_cell('', LTYELLOW, BLACK)], # row 7 [colored_cell('Is it skin involvement:\nulceration / macroscopic sat. nodules / peau d\'orange\n(NOT meeting IBC criteria)?', LTRED, CRIMSON), colored_cell('YES', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('→ T4b', LTRED, CRIMSON, bold=True)], [colored_cell('', LTRED, BLACK), colored_cell('NO ↓', LTRED, NAVY, bold=True, align=TA_CENTER), colored_cell('', LTRED, BLACK)], # row 9 [colored_cell('Is it chest wall invasion:\nribs / intercostal muscles / serratus anterior?\n(NOT just pectoralis)', LTRED, CRIMSON), colored_cell('YES', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('→ T4a', LTRED, CRIMSON, bold=True)], [colored_cell('', LTRED, BLACK), colored_cell('↕ BOTH?', LTRED, NAVY, bold=True, align=TA_CENTER), colored_cell('', LTRED, BLACK)], # row 11 [colored_cell('Both chest wall AND qualifying skin signs present?', LTRED, CRIMSON), colored_cell('YES', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('→ T4c (= T4a + T4b)', LTRED, CRIMSON, bold=True)], # row 12 — pectoralis trap [colored_cell('Tumour fixed to / invading PECTORALIS MUSCLE only?', LTYELLOW, AMBER), colored_cell('YES', LTYELLOW, AMBER, bold=True, align=TA_CENTER), colored_cell('→ NOT T4a!\n Pectoralis ≠ chest wall\n Stage by SIZE only (T1/T2/T3)\n Note deep fixity on examination', LTYELLOW, AMBER, bold=True)], ] flow_tbl = Table(flow_data, colWidths=[q_col, a_col, r_col]) flow_tbl.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), NAVY), ('GRID', (0,0), (-1,-1), 0.5, MGRAY), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ('RIGHTPADDING', (0,0), (-1,-1), 5), ])) story.append(flow_tbl) story.append(Spacer(1, 4*mm)) # ───────────────────────────────────────────────────────────────────────────── # PAGE 2 — N STAGING # ───────────────────────────────────────────────────────────────────────────── story.append(PageBreak()) story.append(section_header('N — REGIONAL LYMPH NODE STAGING', FOREST)) story.append(Spacer(1, 2*mm)) # Clinical N story.append(Paragraph('CLINICAL N (cN) — Based on physical exam + imaging', ST['h2'])) story.append(Spacer(1, 1*mm)) cn_data = [ [colored_cell('cN', FOREST, WHITE, bold=True, align=TA_CENTER), colored_cell('Clinical Criteria', FOREST, WHITE, bold=True), colored_cell('Key Points', FOREST, WHITE, bold=True)], [colored_cell('cN0', LTGREEN, FOREST, bold=True, align=TA_CENTER), colored_cell('No regional LN metastasis (imaging or clinical exam)', LTGREEN, BLACK), colored_cell('USS axilla mandatory; CNB any suspicious node (cortex >3mm, loss of hilum)', LTGREEN, DGRAY)], [colored_cell('cN1', LGRAY, FOREST, bold=True, align=TA_CENTER), colored_cell('Movable ipsilateral Level I/II axillary LN metastasis', LGRAY, BLACK), colored_cell('Mobile = can be separated from each other and structures', LGRAY, DGRAY)], [colored_cell('cN2a', LTYELLOW, AMBER, bold=True, align=TA_CENTER), colored_cell('Fixed/matted ipsilateral Level I/II axillary LN', LTYELLOW, BLACK), colored_cell('Fixed = cannot be moved; matted = fused nodes', LTYELLOW, AMBER)], [colored_cell('cN2b', LTYELLOW, AMBER, bold=True, align=TA_CENTER), colored_cell('Clinically detected ipsilateral internal mammary LN\nwithout axillary LN metastasis', LTYELLOW, BLACK), colored_cell('Clinically detected = by imaging or exam; NOT by SLN biopsy', LTYELLOW, AMBER)], [colored_cell('cN3a', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('Ipsilateral infraclavicular (Level III) LN metastasis', LTRED, BLACK), colored_cell('Level III = medial to pectoralis minor (apical nodes)', LTRED, CRIMSON)], [colored_cell('cN3b', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('Ipsilateral internal mammary LN + axillary LN metastasis', LTRED, BLACK), colored_cell('Both IM and axillary nodes involved = N3b', LTRED, CRIMSON)], [colored_cell('cN3c', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('Ipsilateral supraclavicular LN metastasis', LTRED, BLACK), colored_cell('⚠ Supraclavicular = N3c (NOT M1)', LTRED, CRIMSON, bold=True)], ] cn_tbl = Table(cn_data, colWidths=[16*mm, 82*mm, 57*mm]) cn_tbl.setStyle(TableStyle([ ('GRID', (0,0), (-1,-1), 0.5, MGRAY), ('VALIGN', (0,0), (-1,-1), 'TOP'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ])) story.append(cn_tbl) story.append(Spacer(1, 3*mm)) # Pathological N story.append(Paragraph('PATHOLOGICAL N (pN) — Based on surgical specimen / SLNB + ALND', ST['h2'])) story.append(Spacer(1, 1*mm)) pn_data = [ [colored_cell('pN', TEAL, WHITE, bold=True, align=TA_CENTER), colored_cell('Pathological Criteria', TEAL, WHITE, bold=True), colored_cell('Threshold / Key Rule', TEAL, WHITE, bold=True)], [colored_cell('pN0', LTGREEN, FOREST, bold=True, align=TA_CENTER), colored_cell('No regional LN metastasis\npN0(i+) = isolated tumour cells (ITCs)', LTGREEN, BLACK), colored_cell('ITCs: clusters ≤ 0.2 mm OR < 200 cells = pN0(i+)\nNOT clinically significant; NO treatment change', LTGREEN, FOREST)], [colored_cell('pN1mi', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('Micrometastasis', LGRAY, BLACK), colored_cell('> 0.2 mm BUT ≤ 2.0 mm\nOR > 200 cells in single cross-section', LGRAY, NAVY)], [colored_cell('pN1a', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('1–3 positive axillary LN\n(at least 1 > 2 mm)', LGRAY, BLACK), colored_cell('', LGRAY, BLACK)], [colored_cell('pN1b', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('Internal mammary LN with micrometastasis\nor macrometastasis by SLN biopsy (not clinically detected)', LGRAY, BLACK), colored_cell('Not clinically detected = found only on SLN biopsy\nClinically detected IM → pN2b', LGRAY, DGRAY)], [colored_cell('pN1c', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('1–3 axillary LN AND IM LN by SLN biopsy', LGRAY, BLACK), colored_cell('', LGRAY, BLACK)], [colored_cell('pN2a', LTYELLOW, AMBER, bold=True, align=TA_CENTER), colored_cell('4–9 positive axillary LN\n(at least 1 > 2 mm)', LTYELLOW, BLACK), colored_cell('Determines PMRT eligibility ≥ 4 nodes', LTYELLOW, AMBER)], [colored_cell('pN2b', LTYELLOW, AMBER, bold=True, align=TA_CENTER), colored_cell('Clinically detected ipsilateral IM LN\nwithout axillary LN metastasis', LTYELLOW, BLACK), colored_cell('Clinically detected = by imaging', LTYELLOW, AMBER)], [colored_cell('pN3a', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('≥ 10 positive axillary LN OR\ninfraclavicular (Level III) LN', LTRED, BLACK), colored_cell('Level III/infraclavicular = pN3a', LTRED, CRIMSON)], [colored_cell('pN3b', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('pN1a or pN2a WITH clinically detected IM LN, OR\n≥ 4 axillary LN WITH IM LN by SLN biopsy', LTRED, BLACK), colored_cell('', LTRED, CRIMSON)], [colored_cell('pN3c', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('Ipsilateral supraclavicular LN metastasis', LTRED, BLACK), colored_cell('⚠ Still N3c — NOT M1\nContralateral axillary = M1', LTRED, CRIMSON, bold=True)], ] pn_tbl = Table(pn_data, colWidths=[16*mm, 82*mm, 57*mm]) pn_tbl.setStyle(TableStyle([ ('GRID', (0,0), (-1,-1), 0.5, MGRAY), ('VALIGN', (0,0), (-1,-1), 'TOP'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ])) story.append(pn_tbl) story.append(Spacer(1, 3*mm)) # N decision algorithm story.append(section_header('N DECISION ALGORITHM — Axilla Assessment', TEAL)) story.append(Spacer(1, 2*mm)) n_algo_data = [ [colored_cell('STEP', TEAL, WHITE, bold=True, align=TA_CENTER), colored_cell('QUESTION', TEAL, WHITE, bold=True), colored_cell('YES → ACTION', TEAL, WHITE, bold=True), colored_cell('NO → ACTION', TEAL, WHITE, bold=True)], [colored_cell('1', LTGREEN, FOREST, bold=True, align=TA_CENTER), colored_cell('Clinically suspicious axilla?\n(exam or USS: cortex > 3mm, loss of hilum)', LTGREEN, BLACK), colored_cell('→ USS-guided CNB of node\nIf confirmed +ve: cN1–3\nPlan ALND or NACT → re-stage', LTGREEN, FOREST), colored_cell('→ Proceed to SLNB at surgery\n(dual technique)', LTGREEN, FOREST)], [colored_cell('2', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('SLNB performed — SLN positive?', LGRAY, BLACK), colored_cell('→ Apply Z0011 criteria:\nBCS + WBI + systemic Rx\n1–2 SLN+: OMIT ALND\n(ACOSOG Z0011)', LGRAY, NAVY), colored_cell('→ pN0 or pN1mi\nNo further axillary surgery\n(if pN1mi: discuss systemic therapy)', LGRAY, NAVY)], [colored_cell('3', LTYELLOW, AMBER, bold=True, align=TA_CENTER), colored_cell('SLN+ AND mastectomy planned\nOR > 2 SLN+ OR macromets?', LTYELLOW, BLACK), colored_cell('→ Complete ALND (Levels I + II)\nMinimum 10 nodes required', LTYELLOW, AMBER), colored_cell('→ Axillary RT as alternative\n(AMAROS trial: equivalent\nlocoregional control,\nless lymphoedema)', LTYELLOW, AMBER)], [colored_cell('4\n(post-\nNACT)', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('cN+ patient who received NACT:\nAxilla now clinically negative (ycN0)?', LTRED, BLACK), colored_cell('→ TAD preferred:\nSLNB + excision of\npre-NACT clipped node\n(false -ve rate < 10%)', LTRED, CRIMSON), colored_cell('→ ALND if:\nStill clinically node+\n(ycN1-3)', LTRED, CRIMSON)], ] n_algo_tbl = Table(n_algo_data, colWidths=[14*mm, 55*mm, 60*mm, 26*mm]) n_algo_tbl.setStyle(TableStyle([ ('GRID', (0,0), (-1,-1), 0.5, MGRAY), ('VALIGN', (0,0), (-1,-1), 'TOP'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ])) story.append(n_algo_tbl) story.append(Spacer(1, 3*mm)) story.append(Paragraph('TAD = Targeted Axillary Dissection (SLNB + removal of pre-NACT biopsy-clipped node) | ALND = Axillary Lymph Node Dissection (Levels I + II)', ST['note'])) # ───────────────────────────────────────────────────────────────────────────── # PAGE 3 — M STAGING + STAGE GROUPS # ───────────────────────────────────────────────────────────────────────────── story.append(PageBreak()) story.append(section_header('M — DISTANT METASTASIS', AMBER)) story.append(Spacer(1, 2*mm)) m_data = [ [colored_cell('M', AMBER, WHITE, bold=True, align=TA_CENTER), colored_cell('Criteria', AMBER, WHITE, bold=True), colored_cell('Notes', AMBER, WHITE, bold=True)], [colored_cell('M0', LTGREEN, FOREST, bold=True, align=TA_CENTER), colored_cell('No clinical or radiological evidence of distant metastasis', LTGREEN, BLACK), colored_cell('', LTGREEN, BLACK)], [colored_cell('M0(i+)', LTYELLOW, AMBER, bold=True, align=TA_CENTER), colored_cell('Circulating tumour cells (CTCs) or\ndisseminated tumour cells in bone marrow found\nbut no clinical/radiological distant metastasis', LTYELLOW, BLACK), colored_cell('Molecular/histological finding only\nNo change to clinical staging or management', LTYELLOW, AMBER)], [colored_cell('M1', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('Distant metastasis:\n• Any non-regional LN (including contralateral axilla, cervical)\n• Bone, lung, liver, brain, adrenal, skin beyond primary area', LTRED, BLACK), colored_cell('⚠ Contralateral axillary LN = M1\n⚠ Cervical LN = M1\nSupraclavicular = N3c (NOT M1)', LTRED, CRIMSON, bold=True)], ] m_tbl = Table(m_data, colWidths=[18*mm, 90*mm, 47*mm]) m_tbl.setStyle(TableStyle([ ('GRID', (0,0), (-1,-1), 0.5, MGRAY), ('VALIGN', (0,0), (-1,-1), 'TOP'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ])) story.append(m_tbl) story.append(Spacer(1, 4*mm)) # ANATOMIC STAGE GROUPS story.append(section_header('ANATOMIC STAGE GROUPS (AJCC 8th Edition)', NAVY)) story.append(Spacer(1, 2*mm)) sg_data = [ [colored_cell('Stage', NAVY, WHITE, bold=True, align=TA_CENTER), colored_cell('T', NAVY, WHITE, bold=True, align=TA_CENTER), colored_cell('N', NAVY, WHITE, bold=True, align=TA_CENTER), colored_cell('M', NAVY, WHITE, bold=True, align=TA_CENTER), colored_cell('5-yr Survival', NAVY, WHITE, bold=True, align=TA_CENTER), colored_cell('Management Implication', NAVY, WHITE, bold=True)], [colored_cell('0', LTGREEN, FOREST, bold=True, align=TA_CENTER), colored_cell('Tis', LTGREEN, BLACK, align=TA_CENTER), colored_cell('N0', LTGREEN, BLACK, align=TA_CENTER), colored_cell('M0', LTGREEN, BLACK, align=TA_CENTER), colored_cell('~100%', LTGREEN, FOREST, bold=True, align=TA_CENTER), colored_cell('BCS + RT ± endocrine; or mastectomy', LTGREEN, BLACK)], [colored_cell('IA', LTGREEN, FOREST, bold=True, align=TA_CENTER), colored_cell('T1', LTGREEN, BLACK, align=TA_CENTER), colored_cell('N0', LTGREEN, BLACK, align=TA_CENTER), colored_cell('M0', LTGREEN, BLACK, align=TA_CENTER), colored_cell('~99%', LTGREEN, FOREST, bold=True, align=TA_CENTER), colored_cell('BCS + RT or mastectomy; SLNB; adjuvant systemic', LTGREEN, BLACK)], [colored_cell('IB', LTGREEN, FOREST, bold=True, align=TA_CENTER), colored_cell('T0–T1', LTGREEN, BLACK, align=TA_CENTER), colored_cell('N1mi', LTGREEN, BLACK, align=TA_CENTER), colored_cell('M0', LTGREEN, BLACK, align=TA_CENTER), colored_cell('~99%', LTGREEN, FOREST, bold=True, align=TA_CENTER), colored_cell('As IA; micrometastasis: discuss systemic therapy', LTGREEN, BLACK)], [colored_cell('IIA', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('T0–T1\nor T2', LGRAY, BLACK, align=TA_CENTER), colored_cell('N1\nor N0', LGRAY, BLACK, align=TA_CENTER), colored_cell('M0', LGRAY, BLACK, align=TA_CENTER), colored_cell('~90%', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('BCS or mastectomy; SLNB or ALND; adjuvant Rx', LGRAY, BLACK)], [colored_cell('IIB', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('T2\nor T3', LGRAY, BLACK, align=TA_CENTER), colored_cell('N1\nor N0', LGRAY, BLACK, align=TA_CENTER), colored_cell('M0', LGRAY, BLACK, align=TA_CENTER), colored_cell('~80%', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('BCS (if feasible) or mastectomy; consider NACT', LGRAY, BLACK)], [colored_cell('IIIA', LTYELLOW, AMBER, bold=True, align=TA_CENTER), colored_cell('T0–T3\nor T3', LTYELLOW, BLACK, align=TA_CENTER), colored_cell('N2\nor N1', LTYELLOW, BLACK, align=TA_CENTER), colored_cell('M0', LTYELLOW, BLACK, align=TA_CENTER), colored_cell('~60–70%', LTYELLOW, AMBER, bold=True, align=TA_CENTER), colored_cell('NACT → surgery; ALND; PMRT; multidisciplinary', LTYELLOW, BLACK)], [colored_cell('IIIB', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('T4', LTRED, BLACK, align=TA_CENTER), colored_cell('N0–N2', LTRED, BLACK, align=TA_CENTER), colored_cell('M0', LTRED, BLACK, align=TA_CENTER), colored_cell('~50–60%', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('NACT → MRM → PMRT; no immediate reconstruction if T4d', LTRED, BLACK)], [colored_cell('IIIC', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('Any T', LTRED, BLACK, align=TA_CENTER), colored_cell('N3', LTRED, BLACK, align=TA_CENTER), colored_cell('M0', LTRED, BLACK, align=TA_CENTER), colored_cell('~40–50%', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('NACT → MRM → PMRT (chest wall + regional nodes)', LTRED, BLACK)], [colored_cell('IV', colors.HexColor('#D7BDE2'), PURPLE, bold=True, align=TA_CENTER), colored_cell('Any T', colors.HexColor('#D7BDE2'), BLACK, align=TA_CENTER), colored_cell('Any N', colors.HexColor('#D7BDE2'), BLACK, align=TA_CENTER), colored_cell('M1', colors.HexColor('#D7BDE2'), BLACK, align=TA_CENTER), colored_cell('~28%\n(5-yr)', colors.HexColor('#D7BDE2'), PURPLE, bold=True, align=TA_CENTER), colored_cell('Systemic therapy (endocrine, targeted, chemo, immuno);\npalliative surgery/RT for symptom control; MDT', colors.HexColor('#D7BDE2'), BLACK)], ] sg_tbl = Table(sg_data, colWidths=[13*mm, 16*mm, 14*mm, 12*mm, 18*mm, 82*mm]) sg_tbl.setStyle(TableStyle([ ('GRID', (0,0), (-1,-1), 0.5, MGRAY), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 4), ('RIGHTPADDING', (0,0), (-1,-1), 4), ])) story.append(sg_tbl) story.append(Spacer(1, 3*mm)) story.append(Paragraph('* Survival figures are approximate 5-year relative survival for anatomic stage groups (SEER data). Prognostic stage groups incorporating ER/PR/HER2/grade may differ significantly.', ST['note'])) # ───────────────────────────────────────────────────────────────────────────── # PAGE 4 — STAGING WORKUP ALGORITHM # ───────────────────────────────────────────────────────────────────────────── story.append(PageBreak()) story.append(section_header('STAGING WORKUP — DECISION ALGORITHM', NAVY)) story.append(Spacer(1, 2*mm)) wu_data = [ [colored_cell('Stage', NAVY, WHITE, bold=True, align=TA_CENTER), colored_cell('Mandatory Workup', NAVY, WHITE, bold=True), colored_cell('Additional Investigations', NAVY, WHITE, bold=True), colored_cell('Notes / Traps', NAVY, WHITE, bold=True)], [colored_cell('I–II\n(Early)', LTGREEN, FOREST, bold=True, align=TA_CENTER), colored_cell('• CNB: histology, grade, ER/PR/HER2/Ki-67\n• Bilateral mammography ± USS\n• Axillary USS ± CNB\n• Bloods: CBC, LFTs, calcium, ALP', LTGREEN, BLACK), colored_cell('• MRI breast (dense tissue, ILC,\n multifocality query)\n• Genomic assay if ER+/HER2-/\n node-negative (Oncotype DX)', LTGREEN, FOREST), colored_cell('⚠ NO routine CT/bone scan in\nasymptomatic Stage I–II\n(very low yield, unnecessary\nradiation + cost)', LTGREEN, CRIMSON, bold=True)], [colored_cell('III\n(Locally\nAdv.)', LTYELLOW, AMBER, bold=True, align=TA_CENTER), colored_cell('• All of above\n• CT chest / abdomen / pelvis\n• Bone scintigraphy (bone scan)\n OR PET-CT (preferred — single modality)', LTYELLOW, BLACK), colored_cell('• PET-CT: detects distant mets\n + equivocal findings\n• MRI brain if neuro symptoms\n or HER2+ / TNBC', LTYELLOW, AMBER), colored_cell('⚠ PET-CT superior to CT + bone\nscan for Stage III; avoids two\nseparate imaging tests', LTYELLOW, AMBER, bold=True)], [colored_cell('IV\n(Metastatic)', colors.HexColor('#D7BDE2'), PURPLE, bold=True, align=TA_CENTER), colored_cell('• CT chest/abdomen/pelvis\n• Bone scan OR PET-CT\n• Biopsy of metastatic site\n (re-test ER/PR/HER2 — receptor\n discordance occurs in ~20%)', colors.HexColor('#D7BDE2'), BLACK), colored_cell('• MRI brain if symptomatic\n• Liquid biopsy (ctDNA) for\n ESR1/PIK3CA mutations\n to guide targeted therapy', colors.HexColor('#D7BDE2'), PURPLE), colored_cell('⚠ ALWAYS biopsy metastatic site\nReceptor status may change\n(ER-→ER+; HER2 discordance)\n— changes treatment plan', colors.HexColor('#D7BDE2'), CRIMSON, bold=True)], [colored_cell('GENETIC\nTESTING', LTPURPLE, PURPLE, bold=True, align=TA_CENTER), colored_cell('NCCN indications for germline panel testing:\n• Breast cancer < 50 yrs\n• Triple-negative breast cancer (any age)\n• Male breast cancer\n• Multiple primary breast cancers\n• Ashkenazi Jewish heritage\n• Family history of breast < 50yrs, ovarian,\n pancreatic, or high-risk prostate cancer', LTPURPLE, BLACK), colored_cell('BRCA1/2, PALB2, CHEK2, ATM,\nCDH1 (lobular), STK11,\nTP53 (Li-Fraumeni)\n\nBRCA1: 60–80% lifetime BC risk\nBRCA2: 50–85% lifetime BC risk\nPALB2: ~35% lifetime BC risk', LTPURPLE, PURPLE), colored_cell('⚠ Genetic result changes:\n• Surgical planning\n (bilateral mastectomy)\n• Contralateral prophylaxis\n• Ovarian cancer prevention\n• Family cascade testing\n• PARP inhibitor eligibility', LTPURPLE, CRIMSON, bold=True)], ] wu_tbl = Table(wu_data, colWidths=[16*mm, 65*mm, 52*mm, 22*mm]) wu_tbl.setStyle(TableStyle([ ('GRID', (0,0), (-1,-1), 0.5, MGRAY), ('VALIGN', (0,0), (-1,-1), 'TOP'), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 5), ])) story.append(wu_tbl) story.append(Spacer(1, 3*mm)) # GENOMIC ASSAY decision algorithm story.append(Paragraph('GENOMIC ASSAY DECISION — When to Use Oncotype DX / MammaPrint?', ST['h2'])) story.append(Spacer(1, 1.5*mm)) ga_data = [ [colored_cell('Condition', TEAL, WHITE, bold=True), colored_cell('Assay', TEAL, WHITE, bold=True, align=TA_CENTER), colored_cell('Result', TEAL, WHITE, bold=True), colored_cell('Action', TEAL, WHITE, bold=True)], [colored_cell('ER+, HER2−, LN0\nInvasive BC\nPost-menopause OR age >50', LTGREEN, BLACK), colored_cell('Oncotype DX\n(21-gene RS)', LTGREEN, TEAL, bold=True, align=TA_CENTER), colored_cell('RS 0–25', LTGREEN, FOREST, bold=True), colored_cell('Endocrine therapy ONLY\n(TAILORx — chemo adds no benefit)', LTGREEN, FOREST)], [colored_cell('ER+, HER2−, LN0\nPre-menopause OR age <50', LTYELLOW, BLACK), colored_cell('Oncotype DX\n(21-gene RS)', LTYELLOW, AMBER, bold=True, align=TA_CENTER), colored_cell('RS 16–25', LTYELLOW, AMBER, bold=True), colored_cell('CONSIDER chemotherapy\n(moderate absolute benefit in <50 yrs, TAILORx)', LTYELLOW, AMBER)], [colored_cell('ER+, HER2−, LN0 or LN+\nAny menopausal status', LGRAY, BLACK), colored_cell('MammaPrint\n(70-gene)', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('Genomically\nLow Risk', LGRAY, FOREST, bold=True), colored_cell('Omit chemotherapy even if CLINICALLY high risk\n(MINDACT — ~1.5% survival difference at 5 yrs)', LGRAY, FOREST)], [colored_cell('ANY RS > 25 or\nGenomic high risk', LTRED, BLACK), colored_cell('Either assay', LTRED, CRIMSON, bold=True, align=TA_CENTER), colored_cell('High Risk', LTRED, CRIMSON, bold=True), colored_cell('Recommend adjuvant chemotherapy in addition to endocrine therapy', LTRED, CRIMSON)], ] ga_tbl = Table(ga_data, colWidths=[50*mm, 28*mm, 28*mm, 49*mm]) ga_tbl.setStyle(TableStyle([ ('GRID', (0,0), (-1,-1), 0.5, MGRAY), ('VALIGN', (0,0), (-1,-1), 'TOP'), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 5), ])) story.append(ga_tbl) # ───────────────────────────────────────────────────────────────────────────── # PAGE 5 — EXAM TRAPS # ───────────────────────────────────────────────────────────────────────────── story.append(PageBreak()) story.append(section_header('⚠ MAJOR EXAM TRAPS IN BREAST CANCER STAGING', CRIMSON)) story.append(Spacer(1, 2*mm)) traps = [ ('1', 'Pectoralis invasion = T4a?', '"The tumour invades pectoralis major, therefore T4a."', 'Pectoralis major and minor are NOT chest wall. T4a requires invasion of ribs, intercostal muscles, or serratus anterior. Pectoralis invasion alone → stage by TUMOUR SIZE only (T1/T2/T3).', 'This is the most common MCQ trap. Test clinically: tumour fixed to chest wall even with pectoralis relaxed = T4a; fixed only when pectoralis contracts = NOT T4a.'), ('2', 'Dermis invasion alone on histology = T4b?', '"Histology shows invasion of the dermis → T4b skin involvement."', 'AJCC 8th explicitly states: "invasion of the dermis alone does NOT qualify as T4." T4b requires MACROSCOPIC skin signs: ulceration, satellite nodules, or peau d\'orange/oedema visible clinically.', 'Microscopic dermis involvement on histology is relatively common and does NOT upstage. Only macroscopic changes count.'), ('3', 'Dimpling / tethering = T4b?', '"Patient has skin dimpling over the lump → T4b."', 'Dimpling and tethering are caused by Cooper\'s ligament contraction (desmoplastic shortening) — NOT direct skin invasion. They do NOT qualify as T4b. They reflect Cooper\'s ligament involvement only.', 'Dimpling = 1 Cooper\'s ligament; Puckering = several; Tethering = many. None of these = T4b.'), ('4', 'Peau d\'orange = T4b always?', '"Peau d\'orange is present → always T4b."', 'Peau d\'orange > 1/3 of breast + erythema = T4d (Inflammatory Breast Cancer). Peau d\'orange that does NOT meet IBC criteria (< 1/3 surface, no erythema) = T4b.', 'T4d (IBC) is a CLINICAL diagnosis. Dermal lymphatic emboli on biopsy confirm but are NOT required for diagnosis.'), ('5', 'Supraclavicular nodes = M1?', '"Patient has supraclavicular lymphadenopathy → Stage IV (M1)."', 'Ipsilateral supraclavicular lymph node metastasis = N3c (Stage IIIC), NOT M1. It is still potentially curative with chemoradiation.', 'Contralateral axillary nodes or cervical nodes = M1. This distinction is clinically critical — N3c is treated with curative intent; M1 is palliative intent.'), ('6', 'LCIS = Tis (pre-cancerous)?', '"LCIS is staged as Tis, same as DCIS."', 'AJCC 8th Edition 2018: LCIS has been REMOVED from TNM staging. It is now classified as a BENIGN entity. Only DCIS (and Paget\'s of the nipple) remain as Tis.', 'LCIS is a bilateral RISK MARKER (8–10× increased risk), not a precancer requiring excision margins. ADH is managed differently from DCIS.'), ('7', 'Paget\'s disease → always Tis?', '"Paget\'s disease of the nipple → always staged as Tis(Paget)."', 'Tis(Paget) applies ONLY when Paget\'s is NOT associated with underlying DCIS or invasive carcinoma. If underlying IDC/DCIS is present, stage by the SIZE and characteristics of the underlying tumour — not Tis(Paget).', '97% of Paget\'s cases have underlying DCIS or IDC. Always image and biopsy the underlying breast.'), ('8', 'Tumour size = total tumour size on imaging?', '"Imaging shows 35 mm total lesion (IDC 20 mm + DCIS 15 mm) → T2."', 'T staging uses INVASIVE component size ONLY. If IDC is 20 mm + DCIS 15 mm = T stage is based on 20 mm IDC = T1c. The DCIS component is NOT included in T measurement.', 'DCIS component is noted separately but does not change T stage unless it is pure DCIS (then Tis). Pathologic T takes precedence over clinical/imaging T.'), ('9', 'Internal mammary nodes = M1?', '"CT shows internal mammary lymph node → M1."', 'Internal mammary nodes are REGIONAL lymph nodes (N category). Clinically detected IM LN alone (without axillary) = N2b; with axillary = N3b. They are NOT M1.', 'Only NON-REGIONAL lymph nodes = M1. Regional nodes = axillary (I/II/III), internal mammary, and supraclavicular (ipsilateral). All others = M1.'), ('10', 'IBC → operate immediately?', '"Inflammatory breast cancer with T4d → proceed to mastectomy first."', 'IBC (T4d) is treated with NEOADJUVANT CHEMOTHERAPY FIRST, then Modified Radical Mastectomy, then post-mastectomy radiation. Immediate reconstruction is CONTRAINDICATED (delays PMRT).', 'IBC is a systemic disease at presentation. Surgery-first leads to worse outcomes. Skin biopsy (dermal lymphatic emboli) confirms but is not required for diagnosis.'), ('11', 'ALND mandatory for all SLN-positive patients?', '"Any positive sentinel lymph node → proceed to full axillary clearance (ALND)."', 'ACOSOG Z0011 (landmark trial): if BCS + whole-breast radiation + systemic therapy planned, patients with 1–2 positive SLNs do NOT need completion ALND. Equivalent locoregional control and survival.', 'Z0011 does NOT apply to: mastectomy patients, > 2 positive SLNs, gross extranodal extension, or if WBI not planned. AMAROS trial supports axillary RT as alternative to ALND in SLN+ patients.'), ('12', 'Prognostic stage = anatomic stage?', '"The anatomic stage group (T2 N1 M0 = Stage IIA) is the final stage."', 'AJCC 8th introduced two stage systems: Anatomic stage (TNM only) AND Prognostic stage (incorporates ER/PR/HER2/grade/genomic assays). Prognostic stage must be reported in the US. A T2N1 ER+ grade 1 tumour may downstage prognostically.', 'Anatomic stage is still used globally and is sufficient for most international exams. Be aware that "prognostic stage" exists as a concept in newer literature.'), ] for num, title, wrong, right, note in traps: story += trap_box(num, title, wrong, right, note) # ───────────────────────────────────────────────────────────────────────────── # PAGE 6 — MANAGEMENT DECISION ALGORITHM # ───────────────────────────────────────────────────────────────────────────── story.append(PageBreak()) story.append(section_header('TREATMENT DECISION ALGORITHM BY STAGE', STEEL)) story.append(Spacer(1, 2*mm)) tx_data = [ [colored_cell('Stage', STEEL, WHITE, bold=True, align=TA_CENTER), colored_cell('Surgery', STEEL, WHITE, bold=True), colored_cell('Axilla', STEEL, WHITE, bold=True), colored_cell('RT', STEEL, WHITE, bold=True), colored_cell('Systemic Therapy', STEEL, WHITE, bold=True)], [colored_cell('0\n(DCIS)', LTGREEN, FOREST, bold=True, align=TA_CENTER), colored_cell('BCS (margins ≥2mm) or mastectomy\n(if large, multifocal, or cannot achieve margins)', LTGREEN, BLACK), colored_cell('SLNB only if:\n• Mastectomy planned\n• High-risk DCIS (G3, mass-forming, >2cm)\n(SentiNot trial: SPIO approach)', LTGREEN, FOREST), colored_cell('WBI after BCS\n(NSABP B-17)\nTumour bed boost\nif high-grade', LTGREEN, BLACK), colored_cell('ER+: Tamoxifen OR Anastrozole (post-meno)\n(NSABP B-24, NSABP B-35)\nNo chemotherapy needed', LTGREEN, BLACK)], [colored_cell('I–II\n(Early)', LGRAY, NAVY, bold=True, align=TA_CENTER), colored_cell('BCS + RT = mastectomy (NSABP B-06)\nBCS if: unifocal, adequate breast size, RT feasible\nMastectomy if: multicentric, large tumour:breast ratio, CI to RT\nNipple/skin-sparing options for reconstruction', LGRAY, BLACK), colored_cell('cN0: SLNB\n1–2 SLN+, BCS+WBI+systemic:\n→ NO ALND (Z0011)\n>2 SLN+ or mastectomy:\n→ ALND or axillary RT (AMAROS)', LGRAY, NAVY), colored_cell('After BCS:\nWBI (40Gy/15f or 26Gy/5f)\n+ boost if high-risk\nAfter mastectomy:\nPMRT if T3/T4 or ≥4 LN+', LGRAY, BLACK), colored_cell('ER+: Endocrine therapy 5–10 years\nHER2+: Trastuzumab 1 year (± pertuzumab)\nHigh-risk ER+: Abemaciclib 2 yrs (monarchE)\ngBRCA+ HER2-: Olaparib 1 yr (OlympiA)\nChemo: based on grade, LN status, genomics', LGRAY, BLACK)], [colored_cell('III\n(Locally\nAdv.)', LTYELLOW, AMBER, bold=True, align=TA_CENTER), colored_cell('NACT first (AC-T or FEC-T)\nRe-stage after 4–6 cycles\nMRM (modified radical mastectomy)\nBCS if good downstaging response\nT4d (IBC): MRM only, NO reconstruction', LTYELLOW, BLACK), colored_cell('ALND (Levels I+II)\nPost-NACT: TAD if\nypN0 (TAD preferred\nover SLNB alone)', LTYELLOW, AMBER), colored_cell('PMRT mandatory:\nChest wall +\nregional nodes\n(IM + supraclavicular)', LTYELLOW, BLACK), colored_cell('HER2+: Trastuzumab + pertuzumab with NACT\nResidual HER2+ post-NACT: T-DM1 (KATHERINE)\nTNBC: add pembrolizumab to NACT (KEYNOTE-522)\ngBRCA+: add carboplatin to NACT; olaparib adjuvant\nResidual TNBC: capecitabine (CREATE-X)', LTYELLOW, BLACK)], [colored_cell('IV\n(Meta-\nstatic)', colors.HexColor('#D7BDE2'), PURPLE, bold=True, align=TA_CENTER), colored_cell('Palliative surgery only:\n• Brain metastasis (craniotomy)\n• Spinal cord compression\n• Pathological fracture fixation\n• Toilet mastectomy (bleeding/ulcerating primary)\nNo curative surgical intent', colors.HexColor('#D7BDE2'), BLACK), colored_cell('Not applicable\n(axillary surgery\nonly for palliation)', colors.HexColor('#D7BDE2'), PURPLE), colored_cell('Palliative RT:\n• Bone mets (pain)\n• Brain mets (WBRT or SRS)\n• Spinal cord\n• Skin ulceration', colors.HexColor('#D7BDE2'), BLACK), colored_cell('ER+/HER2-: AI + CDK4/6 inhibitor (1st line); ESR1-mutated: elacestrant/fulvestrant\nHER2+: trastuzumab + pertuzumab + taxane (1st line); T-DXd (2nd+ line)\nHER2-low: T-DXd (DESTINY-Breast04)\nTNBC: chemo ± atezolizumab/pembrolizumab ± sacituzumab govitecan\ngBRCA+: olaparib/talazoparib\nPIK3CA-mutated ER+: alpelisib + fulvestrant (SOLAR-1)', colors.HexColor('#D7BDE2'), BLACK)], ] tx_tbl = Table(tx_data, colWidths=[13*mm, 47*mm, 32*mm, 24*mm, 39*mm]) tx_tbl.setStyle(TableStyle([ ('GRID', (0,0), (-1,-1), 0.5, MGRAY), ('VALIGN', (0,0), (-1,-1), 'TOP'), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 4), ('RIGHTPADDING', (0,0), (-1,-1), 4), ])) story.append(tx_tbl) story.append(Spacer(1, 3*mm)) # ───────────────────────────────────────────────────────────────────────────── # PAGE 7 — QUICK REFERENCE CARD # ───────────────────────────────────────────────────────────────────────────── story.append(PageBreak()) story.append(section_header('QUICK REFERENCE SUMMARY CARD', NAVY)) story.append(Spacer(1, 2*mm)) # Two-column layout: left = T/N mnemonic; right = landmark trials left_items = [ ('T STAGING QUICK RECALL', NAVY, [ 'Tis = DCIS or Paget\'s (no underlying IDC/DCIS)', 'T1mi = ≤ 1mm | T1a = 1–5mm | T1b = 5–10mm | T1c = 10–20mm', 'T2 = 20–50mm | T3 = > 50mm', 'T4a = ribs/intercostals/serratus (NOT pectoralis)', 'T4b = ulceration/nodules/peau d\'orange (NOT dermis alone)', 'T4c = T4a + T4b | T4d = IBC (erythema >1/3 breast)', ]), ('N STAGING QUICK RECALL', FOREST, [ 'N0 = no nodes | N1mi = micromet (>0.2–≤2mm)', 'N1 = 1–3 axillary | N2 = 4–9 axillary or IM nodes', 'N3 = ≥10 axillary / Level III / IM+axillary / supraclavicular', 'Supraclavicular = N3c (NOT M1)', 'Contralateral axillary = M1', 'ITC (≤0.2mm) = pN0(i+) — no treatment change', ]), ('KEY DEFINITIONS', AMBER, [ 'Chest wall = ribs + intercostals + serratus anterior', 'Pectoralis major/minor ≠ chest wall (NOT T4a)', 'IBC = clinical diagnosis; >1/3 breast; T4d; NACT first', 'LCIS = benign risk marker; removed from TNM (AJCC 8th)', 'T size = invasive component only (NOT IDC + DCIS combined)', 'Pathologic T/N takes precedence over clinical T/N', ]), ] right_items = [ ('LANDMARK TRIALS', CRIMSON, [ 'NSABP B-06: BCS + RT = mastectomy (survival)', 'Z0011: 1–2 SLN+ → no ALND (BCS + WBI + systemic)', 'AMAROS: axillary RT = ALND in SLN+ (less lymphoedema)', 'NSABP B-17/B-24: RT + tamoxifen after BCS for DCIS', 'TAILORx: RS 0–25 → endocrine only (>50 yrs ER+/HER2-/N0)', 'MINDACT: genomic low-risk → omit chemo (even clinical HR)', 'KATHERINE: T-DM1 for residual HER2+ post-NACT', 'KEYNOTE-522: pembro + NACT in high-risk TNBC → ↑pCR+EFS', 'OlympiA: olaparib adjuvant gBRCA+ HER2- → ↓mets ↑OS', 'monarchE: abemaciclib adj. HR+/HER2- high-risk → ↑IDFS', 'DESTINY-B04: T-DXd in HER2-low → ↑PFS + OS', 'FAST-Forward: 26Gy/5f = 40Gy/15f (WBI after BCS)', 'MONALEESA-3/7: ribociclib → OS benefit HR+/HER2- met', ]), ('MOLECULAR SUBTYPES AT A GLANCE', TEAL, [ 'Luminal A: ER+ PR+ HER2− Ki67 low → best prognosis', 'Luminal B: ER+ HER2− high Ki67 OR HER2+', 'HER2: ER− PR− HER2+ → anti-HER2 + chemo', 'TNBC: ER− PR− HER2− → highest relapse risk; early', 'HER2-low: IHC 1+ or 2+/FISH− → targetable with T-DXd', ]), ] def make_summary_col(items): elems = [] for title, color, points in items: hdr = Table([[colored_cell(title, color, WHITE, bold=True, fontsize=8, align=TA_CENTER)]], colWidths=[None]) hdr.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), color), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ])) elems.append(hdr) for pt in points: sty = ParagraphStyle('pt', fontName='Helvetica', fontSize=7.5, leading=11, textColor=BLACK, leftIndent=6, spaceAfter=1) elems.append(Paragraph('• ' + pt, sty)) elems.append(Spacer(1, 3*mm)) return elems # Build as two-column table left_elems = make_summary_col(left_items) right_elems = make_summary_col(right_items) # Pad to equal length while len(left_elems) < len(right_elems): left_elems.append(Spacer(1, 1)) while len(right_elems) < len(left_elems): right_elems.append(Spacer(1, 1)) two_col_data = [[left_elems, right_elems]] two_col_tbl = Table(two_col_data, colWidths=[(W-40*mm)/2, (W-40*mm)/2]) two_col_tbl.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (0,-1), 0), ('RIGHTPADDING', (0,0), (0,-1), 4), ('LEFTPADDING', (1,0), (1,-1), 4), ('RIGHTPADDING', (1,0), (1,-1), 0), ('TOPPADDING', (0,0), (-1,-1), 0), ('BOTTOMPADDING', (0,0), (-1,-1), 0), ])) story.append(two_col_tbl) # Footer story.append(HRFlowable(width='100%', thickness=0.5, color=MGRAY)) story.append(Spacer(1, 2*mm)) story.append(Paragraph( 'Sources: AJCC Cancer Staging Manual 8th Edition | Sabiston Textbook of Surgery 21st ed. | Bailey & Love\'s Short Practice of Surgery 28th ed. | ' 'Fischer\'s Mastery of Surgery 8th ed. | Schwartz\'s Principles of Surgery 11th ed. | Mulholland & Greenfield\'s Surgery 7th ed. | ' 'PubMed landmark trials (2017–2026). Prepared for surgical postgraduate examination revision.', ST['note'])) # ══════════════════════════════════════════════════════════════════════════════ # BUILD PDF # ══════════════════════════════════════════════════════════════════════════════ doc.build(story) print(f"PDF saved: {path}") PYEOF python3 /tmp/workspace/breast-staging/build_pdf.py
sed -i 's/from reportlab.graphics.shapes import Drawing, Rect, String, Line, Arrow, Polygon/from reportlab.graphics.shapes import Drawing, Rect, String, Line, Polygon/' /tmp/workspace/breast-staging/build_pdf.py && python3 /tmp/workspace/breast-staging/build_pdf.py
Breast Cancer Staging QR
PDF Document · PDF