hi can you guide me to prepare for fmge exam January 7 th

Asking for Preferences
Searching the Web

FMGE January 2027 exam syllabus pattern subject wise weightage

Great - you have about 6 months (July 2026 to January 7, 2027), you're starting fresh, and you can put in 8+ hours a day. That's actually a very solid position. Here's your complete FMGE preparation roadmap:

FMGE January 7, 2027 - Complete Preparation Guide

Exam at a Glance

  • 300 MCQs | 300 minutes (5 hours) | Split into Part A & Part B (150 Qs each)
  • No negative marking - attempt every question
  • Passing mark: 150/300 (50%)
  • Computer-based test, English only

Subject-Wise Marks Distribution (Official Blueprint)

SubjectQuestions
Medicine33
General Surgery32
OBG30
PSM / Community Medicine30
Anatomy17
Physiology17
Biochemistry17
Pediatrics15
Ophthalmology15
ENT15
Pathology13
Microbiology13
Pharmacology13
Forensic Medicine10
Dermatology5
Psychiatry5
Anesthesia5
Orthopedics5
Radiodiagnosis5
Radiotherapy5
Key insight: Medicine + Surgery + OBG + PSM alone = 125 questions (42%) of the paper. These are your non-negotiable priority subjects.

6-Month Phase-Wise Study Plan

Phase 1: Foundation (July 1 - August 31 - 2 months)

Build conceptual clarity in high-yield preclinical + clinical basics.
Daily schedule (8+ hours):
  • Morning (4 hrs): New subject theory - video lectures (Dr. Bhatia / Marrow / PrepLadder)
  • Afternoon (2 hrs): MCQ practice (subject-specific - at least 50 Qs/day)
  • Evening (2 hrs): Revision of previous day's topic + notes making
Subject order to follow:
  1. Anatomy (17 Qs - do Upper Limb, Lower Limb, Neuroanatomy, embryology)
  2. Physiology (17 Qs - CVS, Respiratory, Renal, Neurophysiology)
  3. Biochemistry (17 Qs - enzymes, metabolism, vitamins, molecular biology)
  4. Pathology (13 Qs - general pathology, systemic pathology)
  5. Pharmacology (13 Qs - general pharmacology + high-yield drug classes)
  6. Microbiology (13 Qs - bacteriology, virology, parasitology)

Phase 2: Clinical Core (September 1 - October 31 - 2 months)

The big four clinical subjects that decide pass/fail.
Daily schedule:
  • Morning (4 hrs): Clinical subject theory + standard textbook/notes
  • Afternoon (3 hrs): MCQ bank solving (Marrow / DAMS / Across)
  • Evening (1.5 hrs): Revision + mistake analysis
Subject order:
  1. Medicine (33 Qs) - CVS, Respiratory, GI, Nephrology, Neurology, Endocrine, Rheumatology, Infectious diseases
  2. OBG (30 Qs) - Obstetrics (Normal + Abnormal), Gynecology, family planning, recent guidelines
  3. PSM / Community Medicine (30 Qs) - Epidemiology, Biostatistics, National Health Programs, vaccines, nutrition
  4. Surgery (32 Qs) - GI surgery, Thyroid, Breast, Vascular, Trauma, Urology basics
  5. Pediatrics (15 Qs) - Growth/Development, Neonatology, Respiratory, GI, Vaccines
  6. Ophthalmology (15 Qs) - Glaucoma, Retina, Cornea, Squint, Uveitis
  7. ENT (15 Qs) - Ear anatomy/diseases, Sinusitis, Larynx, Deafness

Phase 3: Revision + Minor Subjects (November 1 - December 15 - 1.5 months)

First 3 weeks (Nov 1-21): Minor subjects
  • Forensic Medicine (10 Qs)
  • Dermatology (5 Qs)
  • Psychiatry (5 Qs)
  • Anesthesia (5 Qs)
  • Ortho (5 Qs)
  • Radiodiagnosis (5 Qs)
  • Radiotherapy (5 Qs)
Next 3 weeks (Nov 22 - Dec 15): First Grand Revision
  • Revise ALL subjects systematically using short notes
  • Solve previous year question (PYQ) papers - last 10 years minimum
  • 100 MCQs per day mandatory

Phase 4: Grand Test Series + Final Revision (December 16 - January 6)

  • Full-length mock tests daily (DAMS / Marrow / PrepLadder grand tests)
  • Analyze every wrong answer - understand WHY you got it wrong
  • Revise only from your short notes - no new topics
  • Target: 150+ in every mock before exam day
  • Sleep 7-8 hours from Dec 25 onwards - rest is part of preparation

Best Resources for Each Subject

SubjectRecommended Book/Source
AnatomyBD Chaurasia (key chapters) + Across
PhysiologyGanong / AK Jain Rapid Review
BiochemistryVasudevan + PrepLadder notes
PathologyHarsh Mohan or Robins Review
PharmacologyKD Tripathi key drug tables
MicrobiologyAnanthnarayan or Rachna Chaurasia
MedicineHarrison's Review MCQ / API Medicine
SurgeryBailey & Love MCQ / SRB Surgery
OBGDutta Obstetrics + Shaw's Gynecology
PSMPark's Textbook of PSM (essential)
PediatricsOP Ghai / Meharban Singh
FMTReddy's FMT
For MCQ practice: Marrow, PrepLadder, DAMS, or Across (pick ONE platform and stick to it)

Weekly Targets

WeekTarget
Each week in Phase 1 & 2Complete 1 subject theory + 300 MCQs solved
Each week in Phase 3700+ MCQs solved, 2 subjects fully revised
Each week in Phase 42 full mock tests, analyze 100% of mistakes

Key Tips for FMGE Success

  1. PYQs are gold - solve last 10 years' papers topic-wise. FMGE repeats questions frequently.
  2. No negative marking - never leave a question blank. Even a guess gives you a 25% chance.
  3. Diagrams and images - FMGE asks image-based questions (X-rays, histology, clinical photos). Practice image recognition.
  4. PSM and OBG - these 60 questions are highly scorable and formula/fact-based. Don't neglect them.
  5. Short notes - make one-page summaries for each subject as you go. You'll use these in the final month.
  6. Test yourself weekly - don't just read. Solve MCQs after every topic, not at the end.

Milestones to Track Your Progress

  • End of Phase 1 (Aug 31): Comfortable with all preclinical subjects, 2000+ MCQs solved
  • End of Phase 2 (Oct 31): All clinical subjects covered, 5000+ MCQs solved
  • End of Phase 3 (Dec 15): All subjects revised once, PYQs done, mock test scores crossing 130+
  • Exam week: Mock scores consistently above 150, short notes revision only
You have a strong 6-month window and 8+ hours a day - that is more than enough to clear FMGE comfortably if you stay consistent. The biggest differentiator is daily MCQ practice and regular revision - theory reading alone won't work.
Would you like me to break down any specific subject in more detail, or create a day-by-day schedule for a specific month?

iam prepping from august and doin cerebellum

Reading File
Finding Sources
Finding Sources
Reading File
Reading File
Finding Sources
Reading File
Finding Sources
Loading Image
Finding Sources

e

i meant cerebellum app iam using to study and prepping from august

Got it! You're using the Cerebellum app and starting prep from August - that gives you about 5 months (Aug 1 to Jan 7). That's a solid timeline.
Here's how to make the best use of Cerebellum for FMGE:

FMGE Prep with Cerebellum App - 5 Month Plan

About Cerebellum for FMGE

Cerebellum is well-suited for FMGE because it focuses on:
  • High-yield MCQ banks with explanations
  • Spaced repetition (so you retain what you study)
  • Subject-wise and topic-wise filtering
  • Previous year question (PYQ) practice

Month-by-Month Plan (Aug - Jan)

Month 1 - August: Preclinical Subjects

Daily: 8+ hrs | Target: 80-100 Qs/day on Cerebellum
WeekSubjectCerebellum Focus
Week 1AnatomyNeuroanatomy, Upper & Lower Limb, Embryology
Week 2PhysiologyCVS, Respiratory, Renal, Neuro
Week 3BiochemistryMetabolism, Enzymes, Vitamins, Mol. Bio
Week 4PharmacologyGeneral pharmacology + high-yield drug classes
  • Use Cerebellum's topic-wise mode first (not random)
  • After finishing each topic, switch to subject-wise timed test

Month 2 - September: Para-clinical + Minor Clinical

Daily: 100 Qs/day
WeekSubject
Week 1Pathology (General + Systemic)
Week 2Microbiology (Bacteriology, Virology, Parasitology)
Week 3Forensic Medicine + Dermatology + Psychiatry
Week 4Ophthalmology (15 Qs in exam - don't underestimate)

Month 3 - October: Big 4 Clinical Subjects (Most Important Month)

Daily: 120 Qs/day | These 4 subjects = 125/300 questions
WeekSubjectKey Areas
Week 1Medicine (33 Qs)CVS, Respiratory, Nephrology, Neurology, Endocrine
Week 2Surgery (32 Qs)GI, Thyroid, Breast, Trauma, Urology
Week 3OBG (30 Qs)Normal/Abnormal Obstetrics, Gynecology, Contraception
Week 4PSM (30 Qs)Epidemiology, Biostatistics, National Programs, Vaccines
  • PSM tip: Cerebellum's PSM section is excellent - do every single question in it. PSM is fully scorable.

Month 4 - November: ENT + Pediatrics + Grand Revision Round 1

WeekTask
Week 1ENT (15 Qs) + Pediatrics (15 Qs) + Ortho/Anaes/Radio (20 Qs)
Week 2-4First full revision of ALL subjects on Cerebellum
  • Use Cerebellum's "Incorrect Questions" filter - revise only what you got wrong
  • Use spaced repetition reminders - don't skip them
  • Target: 150+ Qs/day in revision mode

Month 5 - December to Jan 6: Mock Tests + Final Revision

This month decides your result
WeekTask
Week 1-2 (Dec 1-14)Full-length 300-question mock tests daily or every other day
Week 3 (Dec 15-21)Analyze mistakes, revise weak subjects
Week 4 (Dec 22-31)Short notes revision only, light Qs
Jan 1-6Very light revision, sleep well, no new topics

Tips for Using Cerebellum Effectively

  1. Don't just read explanations - mark difficult Qs for re-attempt in 3 days
  2. Use the PYQ filter - FMGE repeats questions, PYQs are gold
  3. Timed tests matter - 300 Qs in 300 minutes = 1 min/question. Practice speed
  4. Track your subject-wise score in the app - anything below 60% needs extra attention
  5. Do at least 5,000-6,000 total questions before exam day - volume matters in FMGE

Subject Priority (by exam weight)

PrioritySubjectsQs in Exam
🔴 Must aceMedicine, Surgery, OBG, PSM125
🟠 High yieldAnatomy, Physiology, Biochem, ENT, Ophtho, Peds96
🟡 Don't skipPatho, Micro, Pharma, FMT49
🟢 BonusDerma, Psych, Ortho, Anaes, Radio, RT30

Starting in August with 5 months and 8+ hours/day using Cerebellum is a very realistic plan to clear FMGE. Stick to the schedule, keep daily MCQ targets, and do NOT skip revision months.
Want me to break down any specific subject's high-yield topics for FMGE?

Generate a daily study schedule template for August-September

Reading File
Running Command

ls /home/daytona/workspace/ 2>/dev/null && echo "EXISTS" || mkdir -p /home/daytona/workspace/fmge-schedule && echo "CREATED"

Writing File

~/fmge-schedule/create_schedule.js

const {
  Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell,
  AlignmentType, HeadingLevel, BorderStyle, WidthType, ShadingType,
  VerticalAlign, PageNumber, Header, Footer, PageBreak
} = require('docx');
const fs = require('fs');

// Color palette
const COLOR_DARK_BLUE = "1A3A5C";
const COLOR_MED_BLUE  = "2E6DA4";
const COLOR_LIGHT_BLUE = "D6E8F7";
const COLOR_ORANGE    = "E07B39";
const COLOR_LIGHT_ORANGE = "FDEBD0";
const COLOR_GREEN     = "27AE60";
const COLOR_LIGHT_GREEN = "D5F5E3";
const COLOR_RED       = "C0392B";
const COLOR_LIGHT_RED = "FADBD8";
const COLOR_YELLOW    = "F0C050";
const COLOR_LIGHT_YELLOW = "FEF9E7";
const COLOR_GRAY      = "5D6D7E";
const COLOR_LIGHT_GRAY = "EAF0F6";
const COLOR_WHITE     = "FFFFFF";
const COLOR_PURPLE    = "7D3C98";
const COLOR_LIGHT_PURPLE = "E8DAEF";

function heading1(text) {
  return new Paragraph({
    children: [new TextRun({ text, bold: true, size: 32, color: COLOR_WHITE, font: "Calibri" })],
    heading: HeadingLevel.HEADING_1,
    alignment: AlignmentType.CENTER,
    shading: { type: ShadingType.SOLID, fill: COLOR_DARK_BLUE },
    spacing: { before: 200, after: 200 },
  });
}

function heading2(text, color = COLOR_MED_BLUE) {
  return new Paragraph({
    children: [new TextRun({ text, bold: true, size: 26, color: COLOR_WHITE, font: "Calibri" })],
    heading: HeadingLevel.HEADING_2,
    alignment: AlignmentType.LEFT,
    shading: { type: ShadingType.SOLID, fill: color },
    spacing: { before: 200, after: 100 },
    indent: { left: 0 },
  });
}

function subheading(text, color = COLOR_LIGHT_BLUE) {
  return new Paragraph({
    children: [new TextRun({ text, bold: true, size: 22, color: COLOR_DARK_BLUE, font: "Calibri" })],
    alignment: AlignmentType.LEFT,
    shading: { type: ShadingType.SOLID, fill: color },
    spacing: { before: 120, after: 80 },
  });
}

function bodyPara(text, bold = false, color = "000000") {
  return new Paragraph({
    children: [new TextRun({ text, bold, size: 20, color, font: "Calibri" })],
    spacing: { before: 60, after: 60 },
    indent: { left: 200 },
  });
}

function bullet(text, bold = false) {
  return new Paragraph({
    children: [new TextRun({ text: `• ${text}`, bold, size: 20, font: "Calibri", color: "222222" })],
    spacing: { before: 40, after: 40 },
    indent: { left: 400 },
  });
}

function spacer() {
  return new Paragraph({ children: [new TextRun("")], spacing: { before: 80, after: 80 } });
}

function makeTableCell(text, { fill = COLOR_WHITE, bold = false, color = "000000", align = AlignmentType.LEFT, width = null } = {}) {
  const cell = new TableCell({
    children: [new Paragraph({
      children: [new TextRun({ text, bold, size: 19, font: "Calibri", color })],
      alignment: align,
      spacing: { before: 60, after: 60 },
    })],
    shading: { type: ShadingType.SOLID, fill },
    verticalAlign: VerticalAlign.CENTER,
    margins: { top: 80, bottom: 80, left: 120, right: 120 },
    ...(width ? { width: { size: width, type: WidthType.DXA } } : {}),
  });
  return cell;
}

function scheduleTable(rows) {
  const headerRow = new TableRow({
    children: [
      makeTableCell("TIME", { fill: COLOR_DARK_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 1500 }),
      makeTableCell("ACTIVITY", { fill: COLOR_DARK_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 3500 }),
      makeTableCell("DETAILS / CEREBELLUM TASK", { fill: COLOR_DARK_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 4000 }),
      makeTableCell("DURATION", { fill: COLOR_DARK_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 1200 }),
    ],
    tableHeader: true,
  });

  const dataRows = rows.map((r, i) => new TableRow({
    children: [
      makeTableCell(r[0], { fill: i % 2 === 0 ? COLOR_LIGHT_GRAY : COLOR_WHITE, align: AlignmentType.CENTER }),
      makeTableCell(r[1], { fill: r[3] || (i % 2 === 0 ? COLOR_LIGHT_GRAY : COLOR_WHITE), bold: r[4] || false }),
      makeTableCell(r[2], { fill: i % 2 === 0 ? COLOR_LIGHT_GRAY : COLOR_WHITE }),
      makeTableCell(r[5] || "", { fill: i % 2 === 0 ? COLOR_LIGHT_GRAY : COLOR_WHITE, align: AlignmentType.CENTER }),
    ],
  }));

  return new Table({
    rows: [headerRow, ...dataRows],
    width: { size: 100, type: WidthType.PERCENTAGE },
    borders: {
      top:    { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
      bottom: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
      left:   { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
      right:  { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
      insideH:{ style: BorderStyle.SINGLE, size: 2, color: "AACCE0" },
      insideV:{ style: BorderStyle.SINGLE, size: 2, color: "AACCE0" },
    },
  });
}

function weekTable(weeks) {
  const headerRow = new TableRow({
    children: [
      makeTableCell("WEEK", { fill: COLOR_ORANGE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 1200 }),
      makeTableCell("SUBJECT", { fill: COLOR_ORANGE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 2200 }),
      makeTableCell("TOPICS TO COVER", { fill: COLOR_ORANGE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 4500 }),
      makeTableCell("CEREBELLUM MCQs", { fill: COLOR_ORANGE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 2300 }),
    ],
    tableHeader: true,
  });

  const dataRows = weeks.map((r, i) => new TableRow({
    children: [
      makeTableCell(r[0], { fill: COLOR_LIGHT_ORANGE, bold: true, align: AlignmentType.CENTER, color: COLOR_RED }),
      makeTableCell(r[1], { fill: i % 2 === 0 ? COLOR_LIGHT_ORANGE : COLOR_WHITE, bold: true, color: COLOR_DARK_BLUE }),
      makeTableCell(r[2], { fill: i % 2 === 0 ? COLOR_LIGHT_ORANGE : COLOR_WHITE }),
      makeTableCell(r[3], { fill: i % 2 === 0 ? COLOR_LIGHT_ORANGE : COLOR_WHITE, align: AlignmentType.CENTER }),
    ],
  }));

  return new Table({
    rows: [headerRow, ...dataRows],
    width: { size: 100, type: WidthType.PERCENTAGE },
    borders: {
      top:    { style: BorderStyle.SINGLE, size: 4, color: COLOR_ORANGE },
      bottom: { style: BorderStyle.SINGLE, size: 4, color: COLOR_ORANGE },
      left:   { style: BorderStyle.SINGLE, size: 4, color: COLOR_ORANGE },
      right:  { style: BorderStyle.SINGLE, size: 4, color: COLOR_ORANGE },
      insideH:{ style: BorderStyle.SINGLE, size: 2, color: "F5CBA7" },
      insideV:{ style: BorderStyle.SINGLE, size: 2, color: "F5CBA7" },
    },
  });
}

function tipsTable(tips, fillColor = COLOR_LIGHT_GREEN) {
  return new Table({
    rows: tips.map((t, i) => new TableRow({
      children: [
        makeTableCell(`${i + 1}`, { fill: COLOR_GREEN, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 600 }),
        makeTableCell(t, { fill: i % 2 === 0 ? fillColor : COLOR_WHITE }),
      ],
    })),
    width: { size: 100, type: WidthType.PERCENTAGE },
    borders: {
      top:    { style: BorderStyle.SINGLE, size: 4, color: COLOR_GREEN },
      bottom: { style: BorderStyle.SINGLE, size: 4, color: COLOR_GREEN },
      left:   { style: BorderStyle.SINGLE, size: 4, color: COLOR_GREEN },
      right:  { style: BorderStyle.SINGLE, size: 4, color: COLOR_GREEN },
      insideH:{ style: BorderStyle.SINGLE, size: 2, color: "A9DFBF" },
      insideV:{ style: BorderStyle.SINGLE, size: 2, color: "A9DFBF" },
    },
  });
}

// ─── DAILY SCHEDULE ROWS ──────────────────────────────────────────────────────
// [time, activity, details, fillColor, bold, duration]
const dailyRows = [
  ["5:00 – 5:30 AM",  "Wake Up & Morning Routine",   "Freshen up, light stretching or walk, hydrate",              COLOR_LIGHT_YELLOW, false, "30 min"],
  ["5:30 – 6:00 AM",  "Quick Revision (Flashcards)",  "Review yesterday's Cerebellum incorrect Qs / key points",   COLOR_LIGHT_YELLOW, false, "30 min"],
  ["6:00 – 8:30 AM",  "🧠 STUDY SESSION 1",           "New topic theory – video lecture or standard textbook",      COLOR_LIGHT_BLUE,   true,  "2.5 hrs"],
  ["8:30 – 9:00 AM",  "Breakfast + Short Break",       "Eat well, step outside briefly, rest eyes",                 COLOR_LIGHT_YELLOW, false, "30 min"],
  ["9:00 – 11:30 AM", "🧠 STUDY SESSION 2",           "Continue new topic OR start next sub-topic from same subject", COLOR_LIGHT_BLUE, true,  "2.5 hrs"],
  ["11:30 AM – 12:30 PM", "📝 MCQ Practice (Cerebellum)", "Topic-wise MCQs on Cerebellum – aim 60–80 Qs, timed mode", COLOR_LIGHT_PURPLE, true, "1 hr"],
  ["12:30 – 1:30 PM", "Lunch + Rest",                 "Eat lunch, short 20–30 min nap if needed",                  COLOR_LIGHT_YELLOW, false, "1 hr"],
  ["1:30 – 4:00 PM",  "🧠 STUDY SESSION 3",           "New topic or revision of morning topic with notes",         COLOR_LIGHT_BLUE,   true,  "2.5 hrs"],
  ["4:00 – 4:30 PM",  "Tea Break + Relaxation",        "Walk, light snack, avoid screens for 30 min",               COLOR_LIGHT_YELLOW, false, "30 min"],
  ["4:30 – 6:30 PM",  "📝 MCQ Practice (Cerebellum)", "Subject-wise random Qs – aim 50–60 Qs, read ALL explanations", COLOR_LIGHT_PURPLE, true, "2 hrs"],
  ["6:30 – 7:00 PM",  "Mistake Analysis",              "Go through wrong answers, note key facts in personal notes", COLOR_LIGHT_RED,   false, "30 min"],
  ["7:00 – 8:00 PM",  "Dinner + Free Time",            "Relax, do not study during dinner",                         COLOR_LIGHT_YELLOW, false, "1 hr"],
  ["8:00 – 9:30 PM",  "🧠 STUDY SESSION 4 (Revision)", "Revise TODAY's topic – read your notes, do rapid recall",  COLOR_LIGHT_GREEN,  true,  "1.5 hrs"],
  ["9:30 – 10:00 PM", "Daily Summary + Planning",      "Write 5 key points learned today, plan tomorrow's topics",  COLOR_LIGHT_YELLOW, false, "30 min"],
  ["10:00 – 10:30 PM","Light Reading / Wind Down",     "Optional: skim high-yield tables or mnemonics only",        COLOR_LIGHT_GRAY,   false, "30 min"],
  ["10:30 PM",        "Sleep",                         "7 hours minimum – memory consolidation happens during sleep", COLOR_LIGHT_YELLOW, false, "—"],
];

// ─── SUNDAY SCHEDULE ROWS ─────────────────────────────────────────────────────
const sundayRows = [
  ["7:00 – 8:00 AM",  "Wake Up + Light Morning",      "Relax start, light breakfast, review weekly targets",        COLOR_LIGHT_YELLOW, false, "1 hr"],
  ["8:00 – 10:00 AM", "📝 Weekly Mock Test",          "150-Q timed test on Cerebellum covering current week's subjects", COLOR_LIGHT_PURPLE, true, "2 hrs"],
  ["10:00 – 11:00 AM","Mock Analysis",                 "Go through every wrong answer, note down patterns",          COLOR_LIGHT_RED,    false, "1 hr"],
  ["11:00 AM – 1:00 PM","Weak Topic Revision",        "Pick the 2 lowest-scoring topics from mock and revise them", COLOR_LIGHT_BLUE,   true,  "2 hrs"],
  ["1:00 – 3:00 PM",  "Lunch + Afternoon Rest",       "Full break – rest and recharge for the week",                COLOR_LIGHT_YELLOW, false, "2 hrs"],
  ["3:00 – 5:00 PM",  "Previous Year Questions",      "Solve PYQs from the week's subject on Cerebellum",           COLOR_LIGHT_GREEN,  true,  "2 hrs"],
  ["5:00 – 6:00 PM",  "Notes Consolidation",          "Update short notes with new points from the week",           COLOR_LIGHT_GRAY,   false, "1 hr"],
  ["6:00 PM onwards", "Family / Personal Time",       "Fully switch off – rest is essential for retention",         COLOR_LIGHT_YELLOW, false, "—"],
];

// ─── AUGUST WEEK PLAN ─────────────────────────────────────────────────────────
const augustWeeks = [
  ["Week 1\n(Aug 1–7)",   "Anatomy",      "Upper Limb (bones, muscles, nerves, vessels), Lower Limb basics, Surface Anatomy",                              "80–100 Qs"],
  ["Week 2\n(Aug 8–14)",  "Anatomy",      "Head & Neck, Neuroanatomy (cranial nerves, tracts), Embryology (high-yield: heart, gut, neural tube)",           "80–100 Qs"],
  ["Week 3\n(Aug 15–21)", "Physiology",   "CVS (cardiac cycle, BP regulation, ECG), Respiratory (mechanics, control of breathing, hypoxia)",               "80–100 Qs"],
  ["Week 4\n(Aug 22–28)", "Physiology",   "Renal (GFR, tubular functions, acid-base), Neurophysiology (synaptic transmission, reflexes, special senses)",  "80–100 Qs"],
  ["Week 5\n(Aug 29–31)", "Biochemistry", "Enzymes, carbohydrate metabolism, TCA cycle (3 day jumpstart)",                                                  "50–60 Qs"],
];

// ─── SEPTEMBER WEEK PLAN ──────────────────────────────────────────────────────
const septemberWeeks = [
  ["Week 1\n(Sep 1–7)",   "Biochemistry", "Lipid metabolism, protein metabolism, vitamins (fat & water soluble), minerals, clinical biochemistry",          "80–100 Qs"],
  ["Week 2\n(Sep 8–14)",  "Pharmacology", "General pharmacology, ANS drugs, CVS drugs (anti-hypertensives, anti-anginals, anti-arrhythmics)",               "80–100 Qs"],
  ["Week 3\n(Sep 15–21)", "Pharmacology", "CNS drugs, antimicrobials, anti-cancer, autacoids, endocrine pharmacology",                                       "80–100 Qs"],
  ["Week 4\n(Sep 22–28)", "Microbiology", "General bacteriology, Gram +ve/-ve bacteria (Staph, Strep, E.coli, Salmonella, Mycobacteria, Clostridia)",        "80–100 Qs"],
  ["Week 5\n(Sep 29–30)", "Microbiology", "Virology (HIV, Herpes, Hepatitis, Influenza), Parasitology (Plasmodium, Entamoeba, Wuchereria)",                  "50–60 Qs"],
];

// ─── WEEKLY TARGETS TABLE ─────────────────────────────────────────────────────
const weeklyTargets = [
  ["Mon – Sat", "Theory + MCQs",    "Complete 1 topic/day, 80–100 Qs/day on Cerebellum",   "480–600 Qs/week"],
  ["Sunday",    "Revision + Mock",  "Full week revision + 150 Q mock test + PYQs",          "150–200 Qs"],
  ["Monthly",   "Total MCQs",       "All weeks combined",                                    "~2500–3200 Qs"],
  ["Monthly",   "Subjects Done",    "Aug: Anatomy + Physiology + Biochem start",             "3 subjects"],
  ["Monthly",   "Subjects Done",    "Sep: Biochem complete + Pharmacology + Microbiology",   "3 subjects"],
];

// ─── CEREBELLUM TIPS ──────────────────────────────────────────────────────────
const cerebellumTips = [
  "Always use TOPIC-WISE mode first when learning a new subject – don't jump to random mode until you've covered 70% of the subject.",
  "After solving any MCQ, read the FULL explanation even if you got it right – nuances in wrong options are examinable.",
  "Use the INCORRECT QUESTIONS filter every Sunday – this is your personal weak-topic detector.",
  "Enable SPACED REPETITION reminders – Cerebellum's algorithm shows cards just before you forget them. Never skip these.",
  "Solve PYQ mode at least once per subject before moving on – FMGE repeats questions across years.",
  "Track your subject-wise ACCURACY % – anything below 60% needs an immediate extra revision session.",
  "Use TIMED MODE for MCQs at least 3 times per week – FMGE allows 1 min/question, speed matters.",
  "Do NOT solve MCQs passively (just clicking answers). After every 10 Qs, recall what concept was tested.",
];

// ─── MNEMONIC / HIGH-YIELD NOTE ───────────────────────────────────────────────
const highYield = [
  ["Anatomy",      "Brachial plexus roots, carpal tunnel structures, cranial nerve nuclei, embryological derivatives"],
  ["Physiology",   "Frank-Starling law, Henderson-Hasselbalch, GFR formula, lung volumes (values), JGA"],
  ["Biochemistry", "Enzyme deficiency diseases (PKU, galactosemia, etc.), vitamin deficiency symptoms, metabolic pathways"],
  ["Pharmacology", "Drug of choice lists, receptor types per drug class, side effect profiles, contraindications"],
  ["Microbiology", "Gram stain results, special media, virulence factors, lab diagnosis of each organism"],
];

function highYieldTable(rows) {
  const header = new TableRow({
    children: [
      makeTableCell("SUBJECT", { fill: COLOR_PURPLE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 2000 }),
      makeTableCell("MUST-KNOW HIGH-YIELD AREAS", { fill: COLOR_PURPLE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 8200 }),
    ],
    tableHeader: true,
  });
  const dataRows = rows.map((r, i) => new TableRow({
    children: [
      makeTableCell(r[0], { fill: COLOR_LIGHT_PURPLE, bold: true, color: COLOR_PURPLE, align: AlignmentType.CENTER }),
      makeTableCell(r[1], { fill: i % 2 === 0 ? COLOR_LIGHT_PURPLE : COLOR_WHITE }),
    ],
  }));
  return new Table({
    rows: [header, ...dataRows],
    width: { size: 100, type: WidthType.PERCENTAGE },
    borders: {
      top:    { style: BorderStyle.SINGLE, size: 4, color: COLOR_PURPLE },
      bottom: { style: BorderStyle.SINGLE, size: 4, color: COLOR_PURPLE },
      left:   { style: BorderStyle.SINGLE, size: 4, color: COLOR_PURPLE },
      right:  { style: BorderStyle.SINGLE, size: 4, color: COLOR_PURPLE },
      insideH:{ style: BorderStyle.SINGLE, size: 2, color: "D2B4DE" },
      insideV:{ style: BorderStyle.SINGLE, size: 2, color: "D2B4DE" },
    },
  });
}

function weeklyTargetsTable(rows) {
  const header = new TableRow({
    children: [
      makeTableCell("PERIOD", { fill: COLOR_MED_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 1500 }),
      makeTableCell("FOCUS", { fill: COLOR_MED_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 2000 }),
      makeTableCell("DETAILS", { fill: COLOR_MED_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 4500 }),
      makeTableCell("MCQ TARGET", { fill: COLOR_MED_BLUE, bold: true, color: COLOR_WHITE, align: AlignmentType.CENTER, width: 2200 }),
    ],
    tableHeader: true,
  });
  const dataRows = rows.map((r, i) => new TableRow({
    children: [
      makeTableCell(r[0], { fill: COLOR_LIGHT_BLUE, bold: true, align: AlignmentType.CENTER, color: COLOR_DARK_BLUE }),
      makeTableCell(r[1], { fill: i % 2 === 0 ? COLOR_LIGHT_BLUE : COLOR_WHITE }),
      makeTableCell(r[2], { fill: i % 2 === 0 ? COLOR_LIGHT_BLUE : COLOR_WHITE }),
      makeTableCell(r[3], { fill: COLOR_LIGHT_GREEN, bold: true, align: AlignmentType.CENTER, color: COLOR_GREEN }),
    ],
  }));
  return new Table({
    rows: [header, ...dataRows],
    width: { size: 100, type: WidthType.PERCENTAGE },
    borders: {
      top:    { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
      bottom: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
      left:   { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
      right:  { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE },
      insideH:{ style: BorderStyle.SINGLE, size: 2, color: "AACCE0" },
      insideV:{ style: BorderStyle.SINGLE, size: 2, color: "AACCE0" },
    },
  });
}

// ─── BUILD DOCUMENT ───────────────────────────────────────────────────────────
const doc = new Document({
  styles: {
    default: {
      document: {
        run: { font: "Calibri", size: 20 },
      },
    },
  },
  sections: [{
    properties: {
      page: {
        margin: { top: 720, bottom: 720, left: 900, right: 900 },
      },
    },
    headers: {
      default: new Header({
        children: [new Paragraph({
          children: [new TextRun({ text: "FMGE PREPARATION SCHEDULE  |  August – September 2026  |  Cerebellum App", size: 16, color: COLOR_GRAY, font: "Calibri" })],
          alignment: AlignmentType.CENTER,
          border: { bottom: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE } },
        })],
      }),
    },
    footers: {
      default: new Footer({
        children: [new Paragraph({
          children: [new TextRun({ text: "FMGE Jan 2027  |  Target: 150+/300  |  Keep going, you've got this!", size: 16, color: COLOR_GRAY, font: "Calibri" })],
          alignment: AlignmentType.CENTER,
          border: { top: { style: BorderStyle.SINGLE, size: 4, color: COLOR_MED_BLUE } },
        })],
      }),
    },
    children: [
      // ── TITLE ──
      new Paragraph({
        children: [new TextRun({ text: "FMGE PREPARATION SCHEDULE", bold: true, size: 44, color: COLOR_WHITE, font: "Calibri" })],
        alignment: AlignmentType.CENTER,
        shading: { type: ShadingType.SOLID, fill: COLOR_DARK_BLUE },
        spacing: { before: 0, after: 0 },
      }),
      new Paragraph({
        children: [new TextRun({ text: "August – September 2026  |  Cerebellum App  |  FMGE Jan 7, 2027", bold: true, size: 24, color: COLOR_LIGHT_BLUE, font: "Calibri" })],
        alignment: AlignmentType.CENTER,
        shading: { type: ShadingType.SOLID, fill: COLOR_DARK_BLUE },
        spacing: { before: 0, after: 300 },
      }),

      // ── OVERVIEW BOX ──
      new Paragraph({
        children: [new TextRun({ text: "📌  PHASE 1 OVERVIEW: PRECLINICAL FOUNDATION", bold: true, size: 24, color: COLOR_DARK_BLUE, font: "Calibri" })],
        shading: { type: ShadingType.SOLID, fill: COLOR_LIGHT_YELLOW },
        spacing: { before: 200, after: 80 },
        indent: { left: 200 },
      }),
      bodyPara("Subjects covered: Anatomy  •  Physiology  •  Biochemistry  •  Pharmacology  •  Microbiology", true),
      bodyPara("Daily study hours: 8–9 hours  |  MCQ target: 80–100 per day  |  Total MCQs in 2 months: ~5,000+"),
      bodyPara("Tool: Cerebellum App (topic-wise MCQs + PYQs + spaced repetition + incorrect Qs filter)"),
      spacer(),

      // ── SECTION 1: DAILY SCHEDULE (WEEKDAY) ──
      heading2("📅  DAILY STUDY SCHEDULE (Monday to Saturday)"),
      spacer(),
      scheduleTable(dailyRows),
      spacer(),
      new Paragraph({
        children: [new TextRun({ text: "Total Active Study: ~8.5 hours/day  |  MCQs: 110–140 per day", bold: true, size: 20, color: COLOR_GREEN, font: "Calibri" })],
        shading: { type: ShadingType.SOLID, fill: COLOR_LIGHT_GREEN },
        alignment: AlignmentType.CENTER,
        spacing: { before: 100, after: 200 },
      }),

      // ── SECTION 2: SUNDAY SCHEDULE ──
      heading2("☀️  SUNDAY SCHEDULE (Weekly Review Day)", COLOR_ORANGE),
      spacer(),
      scheduleTable(sundayRows),
      spacer(),

      // ── PAGE BREAK ──
      new Paragraph({ children: [new PageBreak()] }),

      // ── SECTION 3: AUGUST WEEK PLAN ──
      heading2("📘  AUGUST WEEK-BY-WEEK PLAN  (Anatomy → Physiology → Biochemistry start)"),
      spacer(),
      weekTable(augustWeeks),
      spacer(),

      // ── SECTION 4: SEPTEMBER WEEK PLAN ──
      heading2("📗  SEPTEMBER WEEK-BY-WEEK PLAN  (Biochemistry → Pharmacology → Microbiology)", COLOR_GREEN),
      spacer(),
      weekTable(septemberWeeks),
      spacer(),

      // ── SECTION 5: WEEKLY + MONTHLY TARGETS ──
      heading2("🎯  WEEKLY & MONTHLY MCQ TARGETS", COLOR_MED_BLUE),
      spacer(),
      weeklyTargetsTable(weeklyTargets),
      spacer(),

      // ── PAGE BREAK ──
      new Paragraph({ children: [new PageBreak()] }),

      // ── SECTION 6: HIGH YIELD AREAS ──
      heading2("⭐  HIGH-YIELD AREAS PER SUBJECT (FMGE Focus)", COLOR_PURPLE),
      spacer(),
      highYieldTable(highYield),
      spacer(),

      // ── SECTION 7: CEREBELLUM TIPS ──
      heading2("📱  TIPS FOR USING CEREBELLUM APP EFFECTIVELY", COLOR_GREEN),
      spacer(),
      tipsTable(cerebellumTips),
      spacer(),

      // ── SECTION 8: MONTHLY MILESTONES ──
      heading2("🏁  END-OF-MONTH MILESTONES TO CHECK", COLOR_ORANGE),
      spacer(),
      subheading("August 31 – Targets"),
      bullet("Anatomy: All major sections complete, Cerebellum accuracy > 60%"),
      bullet("Physiology: CVS, Respiratory, Renal, Neuro complete, accuracy > 60%"),
      bullet("Biochemistry: First 2 weeks started (enzymes + carbs)"),
      bullet("Total MCQs solved: 2,500 – 3,000"),
      bullet("PYQs done: Anatomy + Physiology PYQ sets"),
      bullet("Sunday mocks: 4 mocks completed, score improving week by week"),
      spacer(),
      subheading("September 30 – Targets"),
      bullet("Biochemistry: Fully complete, accuracy > 60%"),
      bullet("Pharmacology: All major drug classes done, accuracy > 60%"),
      bullet("Microbiology: Bacteriology + Virology + Parasitology complete"),
      bullet("Total MCQs solved (cumulative 2 months): 5,000 – 6,000"),
      bullet("PYQs done: All 5 subjects' PYQ sets"),
      bullet("Sunday mocks: 8 mocks completed, score trending above 120/300"),
      spacer(),

      // ── CLOSING MOTIVATION ──
      new Paragraph({
        children: [new TextRun({ text: "\"Discipline over motivation. Show up every single day.  FMGE Jan 7, 2027 – you've got this!\"", bold: true, size: 22, color: COLOR_WHITE, font: "Calibri", italics: true })],
        alignment: AlignmentType.CENTER,
        shading: { type: ShadingType.SOLID, fill: COLOR_DARK_BLUE },
        spacing: { before: 200, after: 200 },
      }),
    ],
  }],
});

Packer.toBuffer(doc).then(buffer => {
  fs.writeFileSync("/home/daytona/workspace/fmge-schedule/FMGE_Study_Schedule_Aug_Sep.docx", buffer);
  console.log("SUCCESS: File written.");
}).catch(err => {
  console.error("ERROR:", err);
  process.exit(1);
});
Running Command

cd /home/daytona/workspace/fmge-schedule && node create_schedule.js 2>&1

Running Command

python3 /home/daytona/skills/docx/scripts/office/validate.py /home/daytona/workspace/fmge-schedule/FMGE_Study_Schedule_Aug_Sep.docx 2>&1

Running Command

ls -lh /home/daytona/workspace/fmge-schedule/FMGE_Study_Schedule_Aug_Sep.docx && python3 -c "import zipfile; z=zipfile.ZipFile('/home/daytona/workspace/fmge-schedule/FMGE_Study_Schedule_Aug_Sep.docx'); print('Valid ZIP, files:', z.namelist()[:6])"

Your schedule document is ready! Download it here:

FMGE Study Schedule Aug Sep

Word Document · DOCX


Here's what's inside the document:

What's Included

SectionContent
Daily Schedule (Mon-Sat)Hour-by-hour timetable from 5 AM to 10:30 PM with 8.5 hrs active study
Sunday ScheduleWeekly mock test + revision + PYQ day
August Week-by-Week PlanAnatomy (Wk 1-2) → Physiology (Wk 3-4) → Biochemistry start (Wk 5)
September Week-by-Week PlanBiochemistry complete → Pharmacology → Microbiology
MCQ TargetsDaily, weekly, and monthly targets (2,500+ Aug / 5,000+ cumulative)
High-Yield AreasPer-subject FMGE focus topics
Cerebellum App Tips8 specific tips to maximize the app
End-of-Month MilestonesCheckpoints for Aug 31 and Sep 30

Key Daily Targets Built Into the Schedule

  • 5:30 AM - Morning flashcard revision (Cerebellum incorrect Qs)
  • 6:00–11:30 AM - Two theory study sessions (5 hrs)
  • 11:30 AM - First MCQ block on Cerebellum (60-80 Qs)
  • 1:30–4:00 PM - Third study/revision session
  • 4:30–6:30 PM - Second MCQ block (50-60 Qs)
  • 6:30 PM - Mistake analysis
  • 8:00–9:30 PM - Same-day topic revision
  • Total: ~110-140 MCQs/day
Want me to create a similar schedule for October-November (the clinical subjects phase) as well?

Create a daily schedule template for October-November (clinical subjects)

the downloaded document is showing error

Running Command

cd /home/daytona/workspace/fmge-schedule && python3 -c " import zipfile, xml.etree.ElementTree as ET z = zipfile.ZipFile('FMGE_Study_Schedule_Aug_Sep.docx') xml = z.read('word/document.xml') try: ET.fromstring(xml) print('XML is valid') except ET.ParseError as e: print('XML ERROR:', e) "

Running Command

cd /home/daytona/workspace/fmge-schedule && python3 -c " import zipfile z = zipfile.ZipFile('FMGE_Study_Schedule_Aug_Sep.docx') print('Files in docx:', z.namelist()) # Check relationships rels = z.read('word/_rels/document.xml.rels').decode() print('RELS:', rels[:500]) "

Running Command

python3 -c "import docx; print('python-docx OK', docx.__version__)"

Running Command

pip install --user python-docx -q && python3 -c "import docx; print('OK', docx.__version__)"

Writing File

~/fmge-schedule/build_schedule.py

from docx import Document
from docx.shared import Pt, RGBColor, Inches, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_ALIGN_VERTICAL
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import copy

doc = Document()

# ── Page margins ──────────────────────────────────────────────────────────────
for section in doc.sections:
    section.top_margin    = Cm(1.5)
    section.bottom_margin = Cm(1.5)
    section.left_margin   = Cm(1.8)
    section.right_margin  = Cm(1.8)

# ── Helpers ───────────────────────────────────────────────────────────────────
def hex_to_rgb(h):
    h = h.lstrip('#')
    return tuple(int(h[i:i+2], 16) for i in (0, 2, 4))

def set_cell_bg(cell, hex_color):
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    shd = OxmlElement('w:shd')
    shd.set(qn('w:val'), 'clear')
    shd.set(qn('w:color'), 'auto')
    shd.set(qn('w:fill'), hex_color.lstrip('#'))
    tcPr.append(shd)

def set_cell_borders(cell, color="AACCE0"):
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    tcBorders = OxmlElement('w:tcBorders')
    for side in ['top', 'left', 'bottom', 'right']:
        border = OxmlElement(f'w:{side}')
        border.set(qn('w:val'), 'single')
        border.set(qn('w:sz'), '4')
        border.set(qn('w:space'), '0')
        border.set(qn('w:color'), color.lstrip('#'))
        tcBorders.append(border)
    tcPr.append(tcBorders)

def cell_text(cell, text, bold=False, font_size=9, color="000000", align=WD_ALIGN_PARAGRAPH.LEFT):
    cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
    p = cell.paragraphs[0]
    p.alignment = align
    run = p.add_run(text)
    run.bold = bold
    run.font.size = Pt(font_size)
    r, g, b = hex_to_rgb(color)
    run.font.color.rgb = RGBColor(r, g, b)
    # cell padding
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    mar = OxmlElement('w:tcMar')
    for side in ['top', 'bottom', 'left', 'right']:
        m = OxmlElement(f'w:{side}')
        m.set(qn('w:w'), '80')
        m.set(qn('w:type'), 'dxa')
        mar.append(m)
    tcPr.append(mar)

def add_title_para(doc, text, sub=""):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    pPr = p._p.get_or_add_pPr()
    shd = OxmlElement('w:shd')
    shd.set(qn('w:val'), 'clear')
    shd.set(qn('w:color'), 'auto')
    shd.set(qn('w:fill'), '1A3A5C')
    pPr.append(shd)
    spacing = OxmlElement('w:spacing')
    spacing.set(qn('w:before'), '120')
    spacing.set(qn('w:after'), '120')
    pPr.append(spacing)
    run = p.add_run(text)
    run.bold = True
    run.font.size = Pt(20)
    run.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
    if sub:
        p2 = doc.add_paragraph()
        p2.alignment = WD_ALIGN_PARAGRAPH.CENTER
        pPr2 = p2._p.get_or_add_pPr()
        shd2 = OxmlElement('w:shd')
        shd2.set(qn('w:val'), 'clear')
        shd2.set(qn('w:color'), 'auto')
        shd2.set(qn('w:fill'), '1A3A5C')
        pPr2.append(shd2)
        r2 = p2.add_run(sub)
        r2.font.size = Pt(11)
        r2.font.color.rgb = RGBColor(0xD6, 0xE8, 0xF7)

def add_section_heading(doc, text, fill="2E6DA4", text_color="FFFFFF"):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.LEFT
    pPr = p._p.get_or_add_pPr()
    shd = OxmlElement('w:shd')
    shd.set(qn('w:val'), 'clear')
    shd.set(qn('w:color'), 'auto')
    shd.set(qn('w:fill'), fill.lstrip('#'))
    pPr.append(shd)
    sp = OxmlElement('w:spacing')
    sp.set(qn('w:before'), '160')
    sp.set(qn('w:after'), '80')
    pPr.append(sp)
    run = p.add_run(f"  {text}")
    run.bold = True
    run.font.size = Pt(12)
    r, g, b = hex_to_rgb(text_color)
    run.font.color.rgb = RGBColor(r, g, b)

def add_body(doc, text, bold=False, indent=True):
    p = doc.add_paragraph()
    if indent:
        pf = p.paragraph_format
        pf.left_indent = Inches(0.25)
    run = p.add_run(text)
    run.bold = bold
    run.font.size = Pt(9.5)
    sp = OxmlElement('w:spacing')
    sp.set(qn('w:before'), '40')
    sp.set(qn('w:after'), '40')
    p._p.get_or_add_pPr().append(sp)

def add_bullet(doc, text):
    p = doc.add_paragraph(style='List Bullet')
    run = p.add_run(text)
    run.font.size = Pt(9.5)

def add_spacer(doc):
    p = doc.add_paragraph()
    sp = OxmlElement('w:spacing')
    sp.set(qn('w:before'), '40')
    sp.set(qn('w:after'), '40')
    p._p.get_or_add_pPr().append(sp)

def add_colored_para(doc, text, fill="D6E8F7", text_color="1A3A5C", bold=True, size=9.5):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    pPr = p._p.get_or_add_pPr()
    shd = OxmlElement('w:shd')
    shd.set(qn('w:val'), 'clear')
    shd.set(qn('w:color'), 'auto')
    shd.set(qn('w:fill'), fill.lstrip('#'))
    pPr.append(shd)
    run = p.add_run(text)
    run.bold = bold
    run.font.size = Pt(size)
    r, g, b = hex_to_rgb(text_color)
    run.font.color.rgb = RGBColor(r, g, b)

# ── Schedule table builder ─────────────────────────────────────────────────────
def add_schedule_table(doc, rows):
    """rows: [time, activity, details, duration, row_color]"""
    headers = ["TIME", "ACTIVITY", "DETAILS / CEREBELLUM TASK", "DURATION"]
    widths  = [Inches(1.2), Inches(2.0), Inches(3.5), Inches(0.9)]
    tbl = doc.add_table(rows=1, cols=4)
    tbl.style = 'Table Grid'
    hdr = tbl.rows[0]
    for i, (h, w) in enumerate(zip(headers, widths)):
        cell = hdr.cells[i]
        cell.width = w
        set_cell_bg(cell, '1A3A5C')
        set_cell_borders(cell, '2E6DA4')
        cell_text(cell, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)

    for row in rows:
        tr = tbl.add_row()
        bg = row[4] if len(row) > 4 else 'FFFFFF'
        data = [row[0], row[1], row[2], row[3]]
        aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT,
                  WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
        bolds  = [False, True if '🧠' in row[1] or '📝' in row[1] else False, False, False]
        for i, (d, a, b) in enumerate(zip(data, aligns, bolds)):
            cell = tr.cells[i]
            set_cell_bg(cell, bg)
            set_cell_borders(cell, 'AACCE0')
            cell_text(cell, d, bold=b, font_size=8.5, color='111111', align=a)

# ── Week plan table builder ────────────────────────────────────────────────────
def add_week_table(doc, rows, accent='E07B39'):
    """rows: [week, subject, topics, mcq_target]"""
    headers = ["WEEK", "SUBJECT", "KEY TOPICS TO COVER", "CEREBELLUM MCQs"]
    widths  = [Inches(1.0), Inches(1.4), Inches(4.2), Inches(1.0)]
    tbl = doc.add_table(rows=1, cols=4)
    tbl.style = 'Table Grid'
    hdr = tbl.rows[0]
    for i, (h, w) in enumerate(zip(headers, widths)):
        cell = hdr.cells[i]
        cell.width = w
        set_cell_bg(cell, accent)
        set_cell_borders(cell, accent)
        cell_text(cell, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)

    for idx, row in enumerate(rows):
        tr = tbl.add_row()
        alt = 'FEF9E7' if idx % 2 == 0 else 'FFFFFF'
        for i, d in enumerate(row):
            cell = tr.cells[i]
            set_cell_bg(cell, alt)
            set_cell_borders(cell, 'F5CBA7')
            aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT,
                      WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
            bolds  = [True, True, False, True]
            colors = ['C0392B', '1A3A5C', '111111', '27AE60']
            cell_text(cell, d, bold=bolds[i], font_size=8.5,
                      color=colors[i], align=aligns[i])

# ── Tips table ─────────────────────────────────────────────────────────────────
def add_tips_table(doc, tips, accent='27AE60'):
    tbl = doc.add_table(rows=0, cols=2)
    tbl.style = 'Table Grid'
    for idx, tip in enumerate(tips):
        tr = tbl.add_row()
        alt = 'D5F5E3' if idx % 2 == 0 else 'FFFFFF'
        # number cell
        c0 = tr.cells[0]
        c0.width = Inches(0.4)
        set_cell_bg(c0, accent)
        set_cell_borders(c0, accent)
        cell_text(c0, str(idx + 1), bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
        # tip cell
        c1 = tr.cells[1]
        set_cell_bg(c1, alt)
        set_cell_borders(c1, 'A9DFBF')
        cell_text(c1, tip, font_size=8.5, color='111111')

# ── High yield table ────────────────────────────────────────────────────────────
def add_hy_table(doc, rows, accent='7D3C98'):
    headers = ["SUBJECT", "MUST-KNOW HIGH-YIELD AREAS"]
    widths  = [Inches(1.4), Inches(6.2)]
    tbl = doc.add_table(rows=1, cols=2)
    tbl.style = 'Table Grid'
    hdr = tbl.rows[0]
    for i, (h, w) in enumerate(zip(headers, widths)):
        cell = hdr.cells[i]
        cell.width = w
        set_cell_bg(cell, accent)
        set_cell_borders(cell, accent)
        cell_text(cell, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
    for idx, row in enumerate(rows):
        tr = tbl.add_row()
        alt = 'E8DAEF' if idx % 2 == 0 else 'FFFFFF'
        for i, d in enumerate(row):
            cell = tr.cells[i]
            set_cell_bg(cell, alt)
            set_cell_borders(cell, 'D2B4DE')
            bolds  = [True, False]
            colors = ['7D3C98', '111111']
            aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT]
            cell_text(cell, d, bold=bolds[i], font_size=8.5, color=colors[i], align=aligns[i])

# ── Milestone table ─────────────────────────────────────────────────────────────
def add_milestone_table(doc, rows, accent='2E6DA4'):
    tbl = doc.add_table(rows=0, cols=3)
    tbl.style = 'Table Grid'
    # header
    hr = tbl.add_row()
    for i, h in enumerate(["CHECKPOINT", "TARGET", "STATUS"]):
        c = hr.cells[i]
        set_cell_bg(c, accent)
        set_cell_borders(c, accent)
        cell_text(c, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
    for idx, row in enumerate(rows):
        tr = tbl.add_row()
        alt = 'EAF0F6' if idx % 2 == 0 else 'FFFFFF'
        for i, d in enumerate(row):
            cell = tr.cells[i]
            set_cell_bg(cell, alt)
            set_cell_borders(cell, 'AACCE0')
            aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
            bolds  = [True, False, False]
            cell_text(cell, d, bold=bolds[i], font_size=8.5, color='111111', align=aligns[i])

# ══════════════════════════════════════════════════════════════════════════════
# CONTENT
# ══════════════════════════════════════════════════════════════════════════════

# ── TITLE ──────────────────────────────────────────────────────────────────────
add_title_para(doc,
    "FMGE PREPARATION SCHEDULE  |  AUGUST – SEPTEMBER 2026",
    "Cerebellum App  •  Phase 1: Preclinical Foundation  •  FMGE Jan 7, 2027")
add_spacer(doc)

# ── OVERVIEW ───────────────────────────────────────────────────────────────────
add_colored_para(doc,
    "PHASE 1 OVERVIEW: Preclinical Foundation (Aug–Sep)",
    fill='FEF9E7', text_color='1A3A5C', bold=True, size=10.5)
add_body(doc, "Subjects: Anatomy  |  Physiology  |  Biochemistry  |  Pharmacology  |  Microbiology", bold=True)
add_body(doc, "Daily study hours: 8–9 hrs  |  MCQ target: 80–120/day  |  Total MCQs in 2 months: ~5,000+")
add_body(doc, "Tool: Cerebellum App — use topic-wise mode, PYQs, spaced repetition & incorrect Qs filter")
add_spacer(doc)

# ── DAILY SCHEDULE (MON–SAT) ───────────────────────────────────────────────────
add_section_heading(doc, "DAILY STUDY SCHEDULE  —  Monday to Saturday", fill='2E6DA4')
add_spacer(doc)

daily_rows = [
    #  time                  activity                        details                                                          dur         color
    ["5:00 – 5:30 AM",  "Wake Up & Morning Routine",   "Freshen up, light stretch or walk, hydrate well",              "30 min",  "FEF9E7"],
    ["5:30 – 6:00 AM",  "Flashcard Revision",          "Review Cerebellum incorrect Qs from yesterday",                "30 min",  "FEF9E7"],
    ["6:00 – 8:30 AM",  "🧠 STUDY SESSION 1",          "New topic theory — video lecture or standard textbook notes",  "2.5 hrs", "D6E8F7"],
    ["8:30 – 9:00 AM",  "Breakfast + Break",           "Eat well, rest eyes, step outside briefly",                    "30 min",  "FEF9E7"],
    ["9:00 – 11:30 AM", "🧠 STUDY SESSION 2",          "Continue topic OR move to next sub-topic, make brief notes",   "2.5 hrs", "D6E8F7"],
    ["11:30AM–12:30PM", "📝 MCQ Block 1 (Cerebellum)", "Topic-wise Qs, timed mode, target 60–80 Qs",                  "1 hr",    "E8DAEF"],
    ["12:30 – 1:30 PM", "Lunch + Rest",                "Full break — short 20 min nap if needed, no study",            "1 hr",    "FEF9E7"],
    ["1:30 – 4:00 PM",  "🧠 STUDY SESSION 3",          "New topic or notes revision from morning session",             "2.5 hrs", "D6E8F7"],
    ["4:00 – 4:30 PM",  "Tea Break",                   "Walk, light snack, avoid screens for 30 min",                  "30 min",  "FEF9E7"],
    ["4:30 – 6:30 PM",  "📝 MCQ Block 2 (Cerebellum)", "Subject-wise random Qs — 50–60 Qs, read ALL explanations",    "2 hrs",   "E8DAEF"],
    ["6:30 – 7:00 PM",  "Mistake Analysis",            "Review wrong answers, note key facts in personal notes",       "30 min",  "FADBD8"],
    ["7:00 – 8:00 PM",  "Dinner + Free Time",          "Completely relax — no study during dinner",                    "1 hr",    "FEF9E7"],
    ["8:00 – 9:30 PM",  "🧠 STUDY SESSION 4 (Revision)","Revise TODAY's topic — use your notes, do rapid recall",     "1.5 hrs", "D5F5E3"],
    ["9:30 – 10:00 PM", "Daily Summary + Planning",    "Write 5 key points learned today, plan tomorrow's topics",     "30 min",  "FEF9E7"],
    ["10:00 – 10:30 PM","Light Reading (Optional)",    "High-yield tables or mnemonics only — no new topics",          "30 min",  "EAF0F6"],
    ["10:30 PM",        "SLEEP",                       "7 hours minimum — memory consolidation happens during sleep",  "—",       "FEF9E7"],
]
add_schedule_table(doc, daily_rows)
add_spacer(doc)
add_colored_para(doc,
    "Total Active Study: ~8.5 hours/day  |  Daily MCQ Target: 110–140 Qs",
    fill='D5F5E3', text_color='1E8449', bold=True, size=9.5)
add_spacer(doc)

# ── SUNDAY SCHEDULE ─────────────────────────────────────────────────────────────
add_section_heading(doc, "SUNDAY SCHEDULE  —  Weekly Review Day", fill='E07B39')
add_spacer(doc)

sunday_rows = [
    ["7:00 – 8:00 AM",  "Wake Up + Light Morning",      "Relax start, light breakfast, review weekly study targets",       "1 hr",    "FEF9E7"],
    ["8:00 – 10:00 AM", "📝 Weekly Mock Test",          "150-Q timed test on Cerebellum — current week's subjects",       "2 hrs",   "E8DAEF"],
    ["10:00 – 11:00 AM","Mock Analysis",                 "Go through every wrong answer, identify weak patterns",           "1 hr",    "FADBD8"],
    ["11:00AM – 1:00PM","Weak Topic Revision",           "Pick 2 lowest-scoring topics from mock, revise thoroughly",      "2 hrs",   "D6E8F7"],
    ["1:00 – 3:00 PM",  "Lunch + Afternoon Rest",       "Full break — rest and recharge for the coming week",              "2 hrs",   "FEF9E7"],
    ["3:00 – 5:00 PM",  "Previous Year Questions",      "Solve PYQs from this week's subject on Cerebellum",              "2 hrs",   "D5F5E3"],
    ["5:00 – 6:00 PM",  "Notes Consolidation",          "Update short notes with new points discovered this week",        "1 hr",    "EAF0F6"],
    ["6:00 PM onwards", "Family / Personal Time",       "Fully switch off — rest is essential for long-term retention",    "—",       "FEF9E7"],
]
add_schedule_table(doc, sunday_rows)
add_spacer(doc)

# ── PAGE BREAK ─────────────────────────────────────────────────────────────────
doc.add_page_break()

# ── AUGUST WEEK PLAN ───────────────────────────────────────────────────────────
add_section_heading(doc, "AUGUST WEEK-BY-WEEK PLAN  —  Anatomy → Physiology → Biochemistry Start", fill='2E6DA4')
add_spacer(doc)

aug_weeks = [
    ["Week 1\nAug 1–7",   "Anatomy",      "Upper Limb (bones, muscles, nerves, vessels, spaces), Lower Limb (hip, knee, arches), Surface Anatomy",               "80–100 Qs"],
    ["Week 2\nAug 8–14",  "Anatomy",      "Head & Neck (cranial nerves, triangles, spaces), Neuroanatomy (tracts, basal ganglia), Embryology (heart, gut, NTD)",  "80–100 Qs"],
    ["Week 3\nAug 15–21", "Physiology",   "CVS (cardiac cycle, Frank-Starling, ECG, BP regulation), Respiratory (volumes, compliance, control of breathing)",     "80–100 Qs"],
    ["Week 4\nAug 22–28", "Physiology",   "Renal (GFR, tubular functions, acid-base, JGA), Neurophysiology (synaptic transmission, reflexes, special senses)",    "80–100 Qs"],
    ["Week 5\nAug 29–31", "Biochemistry", "Enzymes (kinetics, inhibition), Carbohydrate metabolism (glycolysis, gluconeogenesis, TCA cycle, glycogen)",            "50–60 Qs"],
]
add_week_table(doc, aug_weeks, accent='2E6DA4')
add_spacer(doc)

# ── SEPTEMBER WEEK PLAN ────────────────────────────────────────────────────────
add_section_heading(doc, "SEPTEMBER WEEK-BY-WEEK PLAN  —  Biochemistry → Pharmacology → Microbiology", fill='27AE60')
add_spacer(doc)

sep_weeks = [
    ["Week 1\nSep 1–7",   "Biochemistry", "Lipid metabolism (fatty acids, ketone bodies, lipoproteins), Protein metabolism (urea cycle, transamination), Vitamins (fat & water soluble), Minerals", "80–100 Qs"],
    ["Week 2\nSep 8–14",  "Pharmacology", "General pharmacology (pharmacokinetics, pharmacodynamics), ANS drugs, CVS drugs (anti-hypertensives, anti-anginals, anti-arrhythmics, heart failure)",      "80–100 Qs"],
    ["Week 3\nSep 15–21", "Pharmacology", "CNS drugs (sedatives, antidepressants, antiepileptics, antipsychotics), Antimicrobials (penicillins, cephalosporins, aminoglycosides, fluoroquinolones)",   "80–100 Qs"],
    ["Week 4\nSep 22–28", "Microbiology", "General bacteriology (Gram stain, culture media), Gram +ve/-ve cocci & bacilli (Staph, Strep, E.coli, Salmonella, Mycobacterium, Clostridia)",             "80–100 Qs"],
    ["Week 5\nSep 29–30", "Microbiology", "Virology (HIV, Herpes, Hepatitis B & C, Influenza, Dengue), Parasitology (Plasmodium, Entamoeba, Wuchereria, Leishmania)",                                  "50–60 Qs"],
]
add_week_table(doc, sep_weeks, accent='27AE60')
add_spacer(doc)

# ── WEEKLY / MONTHLY TARGETS ────────────────────────────────────────────────────
add_section_heading(doc, "WEEKLY & MONTHLY MCQ TARGETS", fill='2E6DA4')
add_spacer(doc)

target_rows = [
    ["Mon – Sat",  "Theory + MCQs",     "1 topic/day, 80–120 Qs/day on Cerebellum",              "480–720 Qs/week"],
    ["Sunday",     "Revision + Mock",   "Full week revision + 150 Q mock test + PYQs",            "150–200 Qs"],
    ["August",     "Monthly Total",     "Anatomy + Physiology complete + Biochem started",         "~2,500–3,000 Qs"],
    ["September",  "Monthly Total",     "Biochem complete + Pharmacology + Microbiology complete", "~2,500–3,000 Qs"],
    ["Cumulative", "Aug + Sep Total",   "All 5 preclinical subjects covered",                     "~5,000–6,000 Qs"],
]

tbl = doc.add_table(rows=1, cols=4)
tbl.style = 'Table Grid'
for i, h in enumerate(["PERIOD", "FOCUS", "DETAILS", "MCQ TARGET"]):
    c = tbl.rows[0].cells[i]
    set_cell_bg(c, '2E6DA4')
    set_cell_borders(c, '2E6DA4')
    cell_text(c, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
for idx, row in enumerate(target_rows):
    tr = tbl.add_row()
    alt = 'EAF0F6' if idx % 2 == 0 else 'FFFFFF'
    for i, d in enumerate(row):
        cell = tr.cells[i]
        bolds  = [True, False, False, True]
        colors = ['1A3A5C', '111111', '111111', '27AE60']
        aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
        bg = 'D5F5E3' if i == 3 else alt
        set_cell_bg(cell, bg)
        set_cell_borders(cell, 'AACCE0')
        cell_text(cell, d, bold=bolds[i], font_size=8.5, color=colors[i], align=aligns[i])
add_spacer(doc)

# ── PAGE BREAK ─────────────────────────────────────────────────────────────────
doc.add_page_break()

# ── HIGH YIELD AREAS ───────────────────────────────────────────────────────────
add_section_heading(doc, "HIGH-YIELD AREAS PER SUBJECT  (FMGE Focus)", fill='7D3C98')
add_spacer(doc)

hy_rows = [
    ["Anatomy\n(17 Qs)",      "Brachial plexus roots & injuries, carpal tunnel structures, cranial nerve nuclei & lesions, embryological derivatives (pharyngeal arches, heart, gut rotation), thoracic outlet, femoral triangle"],
    ["Physiology\n(17 Qs)",   "Frank-Starling law, JVP waveforms, Henderson-Hasselbalch equation, lung volumes & capacities (values), O2 dissociation curve shifts, GFR formula, tubular max, JGA function"],
    ["Biochemistry\n(17 Qs)", "Enzyme deficiency diseases (PKU, galactosemia, Gaucher, MCAD), vitamin deficiency symptoms & sources, metabolic pathway regulation, Km & Vmax concepts, lipoprotein types & clinical correlations"],
    ["Pharmacology\n(13 Qs)", "Drug of choice lists, receptor types per drug class, side effect profiles (e.g., ototoxicity, nephrotoxicity), contraindications, first-pass effect drugs, zero-order kinetics drugs"],
    ["Microbiology\n(13 Qs)", "Gram stain results & special stains (ZN, India ink, Giemsa), special culture media, virulence factors, serological tests (Widal, VDRL, Paul-Bunnell), anti-microbial resistance mechanisms"],
]
add_hy_table(doc, hy_rows)
add_spacer(doc)

# ── CEREBELLUM APP TIPS ──────────────────────────────────────────────────────
add_section_heading(doc, "TIPS FOR USING CEREBELLUM APP EFFECTIVELY", fill='27AE60')
add_spacer(doc)

tips = [
    "Use TOPIC-WISE mode first when learning a new subject — don't switch to random mode until you've covered 70% of the subject.",
    "After solving any MCQ, read the FULL explanation even if you got it right — nuances in wrong options are commonly re-tested.",
    "Use the INCORRECT QUESTIONS filter every Sunday — this is your personal weak-topic detector. Re-solve them until accuracy > 70%.",
    "Enable SPACED REPETITION reminders — the algorithm shows cards just before you forget them. Never skip these notifications.",
    "Solve PYQ mode at least once per subject before moving on — FMGE frequently repeats questions across years.",
    "Track your subject-wise ACCURACY % — anything below 60% needs an immediate extra revision session the same day.",
    "Use TIMED MODE at least 3x per week — FMGE allows 1 min/question (300 Qs in 300 min). Speed is a real factor.",
    "After every 10 Qs, pause and recall: what concept was just tested? Passive clicking without reflection wastes your time.",
]
add_tips_table(doc, tips)
add_spacer(doc)

# ── MILESTONES ─────────────────────────────────────────────────────────────────
add_section_heading(doc, "END-OF-MONTH MILESTONES  —  Check These on Aug 31 & Sep 30", fill='E07B39')
add_spacer(doc)

add_colored_para(doc, "August 31 Targets", fill='FDEBD0', text_color='C0392B', bold=True, size=10)
milestone_aug = [
    ["Anatomy",      "All major sections done, Cerebellum accuracy > 60%",       "[ ]"],
    ["Physiology",   "CVS, Respiratory, Renal, Neuro complete, accuracy > 60%",  "[ ]"],
    ["Biochemistry", "Enzymes + Carbohydrate metabolism started",                 "[ ]"],
    ["MCQs",         "Total 2,500–3,000 MCQs solved across subjects",             "[ ]"],
    ["PYQs",         "Anatomy + Physiology PYQ sets completed",                   "[ ]"],
    ["Mock Tests",   "4 Sunday mocks done, scores improving each week",           "[ ]"],
]
add_milestone_table(doc, milestone_aug, accent='E07B39')
add_spacer(doc)

add_colored_para(doc, "September 30 Targets", fill='D5F5E3', text_color='1E8449', bold=True, size=10)
milestone_sep = [
    ["Biochemistry", "Fully complete, accuracy > 60%",                            "[ ]"],
    ["Pharmacology", "All major drug classes done, accuracy > 60%",               "[ ]"],
    ["Microbiology", "Bacteriology + Virology + Parasitology complete",           "[ ]"],
    ["MCQs",         "Cumulative total (Aug+Sep): 5,000–6,000 MCQs solved",       "[ ]"],
    ["PYQs",         "All 5 subjects' PYQ sets completed",                        "[ ]"],
    ["Mock Tests",   "8 Sunday mocks done, score trending above 120/300",         "[ ]"],
]
add_milestone_table(doc, milestone_sep, accent='27AE60')
add_spacer(doc)

# ── CLOSING ─────────────────────────────────────────────────────────────────────
add_title_para(doc,
    '"Discipline over motivation. Show up every single day."',
    "FMGE Jan 7, 2027  —  Target: 150+/300  —  You've got this!")

# ── SAVE ───────────────────────────────────────────────────────────────────────
out = "/home/daytona/workspace/fmge-schedule/FMGE_Schedule_Aug_Sep_2026.docx"
doc.save(out)
print(f"SUCCESS: {out}")
Running Command

cd /home/daytona/workspace/fmge-schedule && python3 build_schedule.py 2>&1

Running Command

# Test save to a simple path first python3 -c " from docx import Document doc = Document() doc.add_paragraph('Test') doc.save('/tmp/test.docx') import shutil; shutil.copy('/tmp/test.docx', '/home/daytona/workspace/fmge-schedule/test.docx') print('OK') " 2>&1

Running Command

# Check permissions and try saving directly to workspace ls -la /home/daytona/workspace/fmge-schedule/ && echo "---" && python3 -c " from docx import Document doc = Document() doc.add_paragraph('Test') import io, os buf = io.BytesIO() doc.save(buf) buf.seek(0) with open('/home/daytona/workspace/fmge-schedule/test_out.docx', 'wb') as f: f.write(buf.read()) print('saved OK, size:', os.path.getsize('/home/daytona/workspace/fmge-schedule/test_out.docx')) " 2>&1

Editing File

~/fmge-schedule/build_schedule.py

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/fmge-schedule/build_schedule.py'
Running Command

cd /home/daytona/workspace/fmge-schedule && python3 build_schedule.py 2>&1

Running Command

python3 -c " import zipfile, xml.etree.ElementTree as ET z = zipfile.ZipFile('/home/daytona/workspace/fmge-schedule/FMGE_Schedule_Aug_Sep_2026.docx') xml = z.read('word/document.xml') ET.fromstring(xml) print('XML valid. Files:', len(z.namelist())) "

Writing File

~/fmge-schedule/build_oct_nov.py

from docx import Document
from docx.shared import Pt, RGBColor, Inches, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_ALIGN_VERTICAL
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import io, os

doc = Document()

for section in doc.sections:
    section.top_margin    = Cm(1.5)
    section.bottom_margin = Cm(1.5)
    section.left_margin   = Cm(1.8)
    section.right_margin  = Cm(1.8)

def hex_to_rgb(h):
    h = h.lstrip('#')
    return tuple(int(h[i:i+2], 16) for i in (0, 2, 4))

def set_cell_bg(cell, hex_color):
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    shd = OxmlElement('w:shd')
    shd.set(qn('w:val'), 'clear')
    shd.set(qn('w:color'), 'auto')
    shd.set(qn('w:fill'), hex_color.lstrip('#'))
    tcPr.append(shd)

def set_cell_borders(cell, color="AACCE0"):
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    tcBorders = OxmlElement('w:tcBorders')
    for side in ['top', 'left', 'bottom', 'right']:
        border = OxmlElement(f'w:{side}')
        border.set(qn('w:val'), 'single')
        border.set(qn('w:sz'), '4')
        border.set(qn('w:space'), '0')
        border.set(qn('w:color'), color.lstrip('#'))
        tcBorders.append(border)
    tcPr.append(tcBorders)

def cell_text(cell, text, bold=False, font_size=9, color="000000", align=WD_ALIGN_PARAGRAPH.LEFT):
    cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
    p = cell.paragraphs[0]
    p.alignment = align
    run = p.add_run(text)
    run.bold = bold
    run.font.size = Pt(font_size)
    r, g, b = hex_to_rgb(color)
    run.font.color.rgb = RGBColor(r, g, b)
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    mar = OxmlElement('w:tcMar')
    for side in ['top', 'bottom', 'left', 'right']:
        m = OxmlElement(f'w:{side}')
        m.set(qn('w:w'), '80')
        m.set(qn('w:type'), 'dxa')
        mar.append(m)
    tcPr.append(mar)

def add_title_para(doc, text, sub=""):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    pPr = p._p.get_or_add_pPr()
    shd = OxmlElement('w:shd')
    shd.set(qn('w:val'), 'clear'); shd.set(qn('w:color'), 'auto'); shd.set(qn('w:fill'), '1A3A5C')
    pPr.append(shd)
    sp = OxmlElement('w:spacing'); sp.set(qn('w:before'), '120'); sp.set(qn('w:after'), '120')
    pPr.append(sp)
    run = p.add_run(text)
    run.bold = True; run.font.size = Pt(20); run.font.color.rgb = RGBColor(0xFF,0xFF,0xFF)
    if sub:
        p2 = doc.add_paragraph()
        p2.alignment = WD_ALIGN_PARAGRAPH.CENTER
        pPr2 = p2._p.get_or_add_pPr()
        shd2 = OxmlElement('w:shd')
        shd2.set(qn('w:val'), 'clear'); shd2.set(qn('w:color'), 'auto'); shd2.set(qn('w:fill'), '1A3A5C')
        pPr2.append(shd2)
        r2 = p2.add_run(sub)
        r2.font.size = Pt(11); r2.font.color.rgb = RGBColor(0xD6,0xE8,0xF7)

def add_section_heading(doc, text, fill="2E6DA4", text_color="FFFFFF"):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.LEFT
    pPr = p._p.get_or_add_pPr()
    shd = OxmlElement('w:shd')
    shd.set(qn('w:val'), 'clear'); shd.set(qn('w:color'), 'auto'); shd.set(qn('w:fill'), fill.lstrip('#'))
    pPr.append(shd)
    sp = OxmlElement('w:spacing'); sp.set(qn('w:before'), '160'); sp.set(qn('w:after'), '80')
    pPr.append(sp)
    run = p.add_run(f"  {text}")
    run.bold = True; run.font.size = Pt(12)
    r, g, b = hex_to_rgb(text_color)
    run.font.color.rgb = RGBColor(r, g, b)

def add_body(doc, text, bold=False, indent=True):
    p = doc.add_paragraph()
    if indent: p.paragraph_format.left_indent = Inches(0.25)
    run = p.add_run(text)
    run.bold = bold; run.font.size = Pt(9.5)
    sp = OxmlElement('w:spacing'); sp.set(qn('w:before'), '40'); sp.set(qn('w:after'), '40')
    p._p.get_or_add_pPr().append(sp)

def add_spacer(doc):
    p = doc.add_paragraph()
    sp = OxmlElement('w:spacing'); sp.set(qn('w:before'), '40'); sp.set(qn('w:after'), '40')
    p._p.get_or_add_pPr().append(sp)

def add_colored_para(doc, text, fill="D6E8F7", text_color="1A3A5C", bold=True, size=9.5):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    pPr = p._p.get_or_add_pPr()
    shd = OxmlElement('w:shd')
    shd.set(qn('w:val'), 'clear'); shd.set(qn('w:color'), 'auto'); shd.set(qn('w:fill'), fill.lstrip('#'))
    pPr.append(shd)
    run = p.add_run(text)
    run.bold = bold; run.font.size = Pt(size)
    r, g, b = hex_to_rgb(text_color)
    run.font.color.rgb = RGBColor(r, g, b)

def add_schedule_table(doc, rows):
    headers = ["TIME", "ACTIVITY", "DETAILS / CEREBELLUM TASK", "DURATION"]
    widths  = [Inches(1.2), Inches(2.0), Inches(3.5), Inches(0.9)]
    tbl = doc.add_table(rows=1, cols=4)
    tbl.style = 'Table Grid'
    for i, (h, w) in enumerate(zip(headers, widths)):
        cell = tbl.rows[0].cells[i]
        cell.width = w
        set_cell_bg(cell, '1A3A5C'); set_cell_borders(cell, '2E6DA4')
        cell_text(cell, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
    for row in rows:
        tr = tbl.add_row()
        bg = row[4] if len(row) > 4 else 'FFFFFF'
        data = [row[0], row[1], row[2], row[3]]
        aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
        bolds  = [False, True if any(e in row[1] for e in ['🧠','📝','🔴','📋']) else False, False, False]
        for i, (d, a, b) in enumerate(zip(data, aligns, bolds)):
            cell = tr.cells[i]
            set_cell_bg(cell, bg); set_cell_borders(cell, 'AACCE0')
            cell_text(cell, d, bold=b, font_size=8.5, color='111111', align=a)

def add_week_table(doc, rows, accent='C0392B'):
    headers = ["WEEK", "SUBJECT\n(FMGE Qs)", "KEY TOPICS TO COVER", "CEREBELLUM\nMCQs/Day"]
    widths  = [Inches(0.9), Inches(1.3), Inches(4.4), Inches(1.0)]
    tbl = doc.add_table(rows=1, cols=4)
    tbl.style = 'Table Grid'
    for i, (h, w) in enumerate(zip(headers, widths)):
        cell = tbl.rows[0].cells[i]
        cell.width = w
        set_cell_bg(cell, accent); set_cell_borders(cell, accent)
        cell_text(cell, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
    for idx, row in enumerate(rows):
        tr = tbl.add_row()
        alt = 'FADBD8' if idx % 2 == 0 else 'FFFFFF'
        for i, d in enumerate(row):
            cell = tr.cells[i]
            set_cell_bg(cell, alt); set_cell_borders(cell, 'F5B7B1')
            aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
            bolds  = [True, True, False, True]
            colors = ['C0392B', '1A3A5C', '111111', '27AE60']
            cell_text(cell, d, bold=bolds[i], font_size=8.5, color=colors[i], align=aligns[i])

def add_tips_table(doc, tips, accent='27AE60'):
    tbl = doc.add_table(rows=0, cols=2)
    tbl.style = 'Table Grid'
    for idx, tip in enumerate(tips):
        tr = tbl.add_row()
        alt = 'D5F5E3' if idx % 2 == 0 else 'FFFFFF'
        c0 = tr.cells[0]; c0.width = Inches(0.4)
        set_cell_bg(c0, accent); set_cell_borders(c0, accent)
        cell_text(c0, str(idx + 1), bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
        c1 = tr.cells[1]
        set_cell_bg(c1, alt); set_cell_borders(c1, 'A9DFBF')
        cell_text(c1, tip, font_size=8.5, color='111111')

def add_milestone_table(doc, rows, accent='C0392B'):
    tbl = doc.add_table(rows=1, cols=3)
    tbl.style = 'Table Grid'
    for i, h in enumerate(["CHECKPOINT", "TARGET", "DONE?"]):
        c = tbl.rows[0].cells[i]
        set_cell_bg(c, accent); set_cell_borders(c, accent)
        cell_text(c, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
    for idx, row in enumerate(rows):
        tr = tbl.add_row()
        alt = 'FADBD8' if idx % 2 == 0 else 'FFFFFF'
        for i, d in enumerate(row):
            cell = tr.cells[i]
            set_cell_bg(cell, alt); set_cell_borders(cell, 'F5B7B1')
            aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT, WD_ALIGN_PARAGRAPH.CENTER]
            bolds  = [True, False, False]
            cell_text(cell, d, bold=bolds[i], font_size=8.5, color='111111', align=aligns[i])

def add_hy_table(doc, rows, accent='7D3C98'):
    tbl = doc.add_table(rows=1, cols=2)
    tbl.style = 'Table Grid'
    for i, h in enumerate(["SUBJECT", "MUST-KNOW HIGH-YIELD AREAS FOR FMGE"]):
        c = tbl.rows[0].cells[i]
        set_cell_bg(c, accent); set_cell_borders(c, accent)
        cell_text(c, h, bold=True, font_size=9, color='FFFFFF', align=WD_ALIGN_PARAGRAPH.CENTER)
    for idx, row in enumerate(rows):
        tr = tbl.add_row()
        alt = 'E8DAEF' if idx % 2 == 0 else 'FFFFFF'
        for i, d in enumerate(row):
            cell = tr.cells[i]
            set_cell_bg(cell, alt); set_cell_borders(cell, 'D2B4DE')
            bolds  = [True, False]
            colors = ['7D3C98', '111111']
            aligns = [WD_ALIGN_PARAGRAPH.CENTER, WD_ALIGN_PARAGRAPH.LEFT]
            cell_text(cell, d, bold=bolds[i], font_size=8.5, color=colors[i], align=aligns[i])

# ══════════════════════════════════════════════════════════════════════════════
# CONTENT
# ══════════════════════════════════════════════════════════════════════════════

add_title_para(doc,
    "FMGE PREPARATION SCHEDULE  |  OCTOBER – NOVEMBER 2026",
    "Cerebellum App  •  Phase 2: Clinical Subjects  •  FMGE Jan 7, 2027")
add_spacer(doc)

add_colored_para(doc,
    "PHASE 2 OVERVIEW: The Big Clinical Subjects — This Phase Decides Your Result",
    fill='FADBD8', text_color='C0392B', bold=True, size=10.5)
add_body(doc, "Subjects: Medicine (33 Qs)  |  Surgery (32 Qs)  |  OBG (30 Qs)  |  PSM (30 Qs)  |  Pediatrics (15 Qs)  |  ENT (15 Qs)  |  Ophthalmology (15 Qs)", bold=True)
add_body(doc, "Combined = 170 questions = 57% of the entire FMGE paper. Mastering these = guaranteed pass.")
add_body(doc, "Daily study hours: 8–9 hrs  |  MCQ target: 120–150/day  |  Total MCQs in 2 months: ~7,000+")
add_body(doc, "Strategy shift: Clinical subjects need CASE-BASED thinking, not just memorization. Understand the LOGIC.")
add_spacer(doc)

# ── DAILY SCHEDULE MON-SAT ─────────────────────────────────────────────────────
add_section_heading(doc, "DAILY STUDY SCHEDULE  —  Monday to Saturday (Clinical Phase)", fill='C0392B')
add_spacer(doc)

daily_rows = [
    ["5:00 – 5:30 AM",  "Wake Up & Morning Routine",    "Freshen up, light stretch, hydrate — get mentally ready",        "30 min",  "FEF9E7"],
    ["5:30 – 6:00 AM",  "Previous Day Rapid Recall",    "Cover your short notes from yesterday — 10 min recall drill",    "30 min",  "FEF9E7"],
    ["6:00 – 8:00 AM",  "🧠 STUDY SESSION 1 (Theory)",  "New clinical topic — video lecture (Marrow/PrepLadder) + notes", "2 hrs",   "D6E8F7"],
    ["8:00 – 8:30 AM",  "Breakfast + Break",            "Eat, rest eyes, short outdoor walk if possible",                 "30 min",  "FEF9E7"],
    ["8:30 – 10:30 AM", "🧠 STUDY SESSION 2 (Theory)",  "Continue topic — focus on clinical features + investigations",   "2 hrs",   "D6E8F7"],
    ["10:30–11:30 AM",  "📝 MCQ Block 1 (Cerebellum)",  "Topic-wise clinical Qs — 60–80 Qs, timed mode",                 "1 hr",    "E8DAEF"],
    ["11:30AM–12:00PM", "Mistake Analysis (Block 1)",   "Review every wrong answer immediately — write key fact down",    "30 min",  "FADBD8"],
    ["12:00 – 1:00 PM", "Lunch + Rest",                 "Full break — rest mind, 20 min nap if needed",                   "1 hr",    "FEF9E7"],
    ["1:00 – 3:00 PM",  "🧠 STUDY SESSION 3 (Theory)",  "New sub-topic OR treatment/management section of current topic", "2 hrs",   "D6E8F7"],
    ["3:00 – 3:30 PM",  "Tea Break",                    "Walk, light snack — no screens",                                 "30 min",  "FEF9E7"],
    ["3:30 – 5:00 PM",  "📝 MCQ Block 2 (Cerebellum)",  "Subject-wise random + image-based Qs — 60–70 Qs",               "1.5 hrs", "E8DAEF"],
    ["5:00 – 5:30 PM",  "Mistake Analysis (Block 2)",   "Review wrong Qs — update notes with missed points",              "30 min",  "FADBD8"],
    ["5:30 – 7:00 PM",  "🔴 PYQ Practice (Cerebellum)", "Solve previous year Qs from today's topic/subject",              "1.5 hrs", "FEF3CD"],
    ["7:00 – 8:00 PM",  "Dinner + Free Time",           "Completely relax — no study during dinner",                      "1 hr",    "FEF9E7"],
    ["8:00 – 9:00 PM",  "📋 REVISION SESSION",          "Re-read today's short notes + key tables + drug of choice lists","1 hr",    "D5F5E3"],
    ["9:00 – 9:30 PM",  "Daily Summary + Planning",     "Write 5 key clinical facts, plan tomorrow's topic",              "30 min",  "FEF9E7"],
    ["9:30 – 10:00 PM", "Light Revision (Optional)",    "High-yield tables, mnemonics, recent guideline updates only",    "30 min",  "EAF0F6"],
    ["10:00 PM",        "SLEEP",                        "7 hours minimum — non-negotiable for clinical retention",         "—",       "FEF9E7"],
]
add_schedule_table(doc, daily_rows)
add_spacer(doc)
add_colored_para(doc,
    "Total Active Study: ~8.5 hours/day  |  Daily MCQ Target: 120–150 Qs  |  Daily PYQs: 30–40 Qs",
    fill='D5F5E3', text_color='1E8449', bold=True, size=9.5)
add_spacer(doc)

# ── SUNDAY ─────────────────────────────────────────────────────────────────────
add_section_heading(doc, "SUNDAY SCHEDULE  —  Weekly Review + Full Mock Day", fill='E07B39')
add_spacer(doc)

sunday_rows = [
    ["7:00 – 8:00 AM",  "Wake Up + Light Morning",       "Review this week's short notes summary (15 min only)",           "1 hr",    "FEF9E7"],
    ["8:00 – 10:30 AM", "📝 Full Mock Test",             "300-Q or 150-Q timed mock on Cerebellum — full exam simulation", "2.5 hrs", "E8DAEF"],
    ["10:30AM–12:00PM", "Mock Analysis + Weak Spotting", "Go through EVERY wrong answer — identify subject-wise weak areas","1.5 hrs", "FADBD8"],
    ["12:00 – 1:00 PM", "Lunch + Rest",                  "Full break",                                                     "1 hr",    "FEF9E7"],
    ["1:00 – 3:00 PM",  "Weak Topic Deep Dive",          "Pick the 2 lowest-scoring subjects from mock — revise concepts", "2 hrs",   "D6E8F7"],
    ["3:00 – 5:00 PM",  "📝 PYQ Marathon",               "Solve PYQs from any 2 subjects covered this week",               "2 hrs",   "D5F5E3"],
    ["5:00 – 6:00 PM",  "Notes Update",                  "Add new points to short notes from mock and PYQ analysis",       "1 hr",    "EAF0F6"],
    ["6:00 PM onwards", "Family / Personal Time",        "Completely switch off — recovery is part of the strategy",       "—",       "FEF9E7"],
]
add_schedule_table(doc, sunday_rows)
add_spacer(doc)

# ── PAGE BREAK ─────────────────────────────────────────────────────────────────
doc.add_page_break()

# ── OCTOBER WEEK PLAN ──────────────────────────────────────────────────────────
add_section_heading(doc, "OCTOBER WEEK-BY-WEEK PLAN  —  Medicine → Surgery → OBG → PSM", fill='C0392B')
add_spacer(doc)

oct_weeks = [
    ["Week 1\nOct 1–7",
     "Medicine\n(33 Qs)",
     "CVS: IHD, heart failure, hypertension, valvular diseases, ECG interpretation, arrhythmias\nRespiratory: Pneumonia, TB, COPD, asthma, pleural effusion, lung cancer",
     "100–120 Qs"],
    ["Week 2\nOct 8–14",
     "Medicine\n(33 Qs)",
     "Nephrology: AKI, CKD, nephrotic/nephritic syndromes, RTA\nNeurology: Stroke, meningitis, Parkinson's, epilepsy, dementia\nEndocrine: Diabetes, thyroid disorders, adrenal diseases, pituitary",
     "100–120 Qs"],
    ["Week 3\nOct 15–21",
     "Medicine\n(33 Qs)",
     "GI: GERD, peptic ulcer, IBD, liver cirrhosis, hepatitis, pancreatitis\nRheumatology: RA, SLE, gout, ankylosing spondylitis\nHaematology: Anaemias, leukaemias, coagulation disorders",
     "100–120 Qs"],
    ["Week 4\nOct 22–28",
     "Surgery\n(32 Qs)",
     "GI Surgery: Appendicitis, cholecystitis, intestinal obstruction, hernia, colorectal Ca\nThyroid & Breast: Goiter, thyroid Ca, breast Ca, mastitis, fibroadenoma\nVascular: DVT, varicose veins, peripheral arterial disease",
     "100–120 Qs"],
    ["Week 5\nOct 29–31",
     "Surgery\n(32 Qs)",
     "Urology: BPH, renal calculi, bladder Ca, urethral stricture\nTrauma & Surgical Principles: ATLS, wound healing, burns, blood transfusion, sterilisation\nAnaesthesia basics: Pre-op assessment, local anaesthesia, complications",
     "60–80 Qs"],
]
add_week_table(doc, oct_weeks, accent='C0392B')
add_spacer(doc)

# ── NOVEMBER WEEK PLAN ─────────────────────────────────────────────────────────
add_section_heading(doc, "NOVEMBER WEEK-BY-WEEK PLAN  —  OBG → PSM → Pediatrics → ENT → Ophthalmology", fill='7D3C98')
add_spacer(doc)

nov_weeks = [
    ["Week 1\nNov 1–7",
     "OBG\n(30 Qs)",
     "Normal Obstetrics: ANC, fetal development, normal labour (stages), puerperium\nAbnormal Obstetrics: PIH/pre-eclampsia, APH (placenta previa, abruption), PPH, preterm labour, PROM",
     "100–120 Qs"],
    ["Week 2\nNov 8–14",
     "OBG\n(30 Qs)",
     "Gynecology: Menstrual disorders (PCOS, fibroids, endometriosis), cervical Ca, ovarian tumours\nContraception: OCP, IUDs, sterilisation, emergency contraception\nInfertility: Causes, investigations, treatment options",
     "100–120 Qs"],
    ["Week 3\nNov 15–21",
     "PSM\n(30 Qs)",
     "Epidemiology: Study designs, measures of disease frequency (incidence, prevalence), bias, association vs causation\nBiostatistics: Mean/SD/SEM, sensitivity/specificity, p-value, confidence intervals, screening tests\nNational Health Programs: RCH, NVBDCP, NTEP, NPCDCS, immunisation schedule, NHM",
     "100–120 Qs"],
    ["Week 4\nNov 22–28",
     "PSM cont. +\nPediatrics (15 Qs)",
     "PSM: Nutrition (PEM, vitamins, food fortification), environment health (water, air, waste), vital statistics\nPediatrics: Growth & development milestones, neonatology (birth asphyxia, jaundice, NEC), vaccine schedule\nPediatric diseases: Respiratory (pneumonia, asthma), GI (diarrhoea, intussusception), nephrotic syndrome",
     "100–120 Qs"],
    ["Week 5\nNov 29–30",
     "ENT (15 Qs) +\nOphthalmology (15 Qs)",
     "ENT: CSOM (types, complications), otosclerosis, SNHL, sinusitis, laryngeal Ca, epistaxis management\nOphthalmology: Glaucoma (types, drugs), cataract, retinal detachment, uveitis, squint, corneal ulcer, trachoma",
     "60–80 Qs"],
]
add_week_table(doc, nov_weeks, accent='7D3C98')
add_spacer(doc)

# ── PAGE BREAK ─────────────────────────────────────────────────────────────────
doc.add_page_break()

# ── HIGH YIELD AREAS ───────────────────────────────────────────────────────────
add_section_heading(doc, "HIGH-YIELD AREAS PER CLINICAL SUBJECT  (FMGE Pattern)", fill='7D3C98')
add_spacer(doc)

hy_rows = [
    ["Medicine\n(33 Qs)",
     "Drug of choice lists (must memorise), ECG patterns (MI, arrhythmias, blocks), Jones criteria for RF, SLE criteria, diabetic complications & management, thyroid function tests interpretation, nephrotic vs nephritic syndrome differences"],
    ["Surgery\n(32 Qs)",
     "Hernia types & contents, Courvoisier's law, Murphy's sign, staging of cancers (TNM), wound healing phases, types of shock, blood transfusion reactions, pre-op/post-op complications, sterilisation methods"],
    ["OBG\n(30 Qs)",
     "Bishops score, partogram interpretation, APGAR scoring, Obstetric conjugate vs True conjugate, placenta previa grading, Sheffield table (gestational age landmarks), contraceptive failure rates, PCOS criteria, Bethesda system for Pap smear"],
    ["PSM\n(30 Qs)",
     "Sensitivity vs Specificity (formulas), vaccine cold chain & storage temperatures, National Health Program targets & goals, notifiable diseases, attributable risk vs relative risk, case fatality rate vs mortality rate, ASHA role"],
    ["Pediatrics\n(15 Qs)",
     "Developmental milestones (motor, language, social) at key ages, vaccination schedule (India), WHO classification of PEM, fluid management in diarrhoea (ORS), neonatal jaundice thresholds, paediatric dose calculations"],
    ["ENT\n(15 Qs)",
     "Safe vs unsafe CSOM (key differences), cholesteatoma features, Rinne & Weber test interpretation, otosclerosis (Schwartze sign), Trotter's triad, Killian's dehiscence, voice disorders (laryngeal pathologies)"],
    ["Ophthalmology\n(15 Qs)",
     "Glaucoma types (open vs closed angle, drugs used), RAPD (afferent pupillary defect), Kayser-Fleischer ring, trachoma stages (WHO), retinoblastoma (leukocoria), corneal ulcer management, squint types (convergent vs divergent)"],
]
add_hy_table(doc, hy_rows)
add_spacer(doc)

# ── CLINICAL STRATEGY TIPS ──────────────────────────────────────────────────────
add_section_heading(doc, "CLINICAL PHASE STRATEGY — How to Approach These Subjects", fill='C0392B')
add_spacer(doc)

tips = [
    "MEDICINE: Build a 'Drug of Choice' master list as you go — FMGE loves asking first-line treatment. Add to it every day.",
    "SURGERY: For each condition, remember the TRIAD: Presentation → Investigation of choice → Treatment. This covers 90% of Qs.",
    "OBG: Obstetrics and Gynecology have the most formula-based and value-based questions in FMGE. Memorise all normal values, Bishop score, APGAR, and timelines.",
    "PSM: Biostatistics formulas MUST be at your fingertips. 2x2 tables for sensitivity/specificity. National program data is directly asked — revise yearly.",
    "Use CEREBELLUM image-based Qs heavily for Ophthalmology and ENT — FMGE includes clinical images (fundus photos, ear drums, throat, X-rays).",
    "For each disease, practice answering: 'What is the MOST LIKELY diagnosis?' and 'What is the NEXT BEST STEP?' — these are the 2 most common FMGE question formats.",
    "Pediatrics vaccine schedule is DIRECTLY asked in FMGE — know the IAP immunisation schedule cold (age, route, dose, interval).",
    "FMGE repeats clinical scenario questions from previous papers. After each subject, do at least 2 years' PYQs from that subject on Cerebellum.",
]
add_tips_table(doc, tips, accent='C0392B')
add_spacer(doc)

# ── MILESTONES ─────────────────────────────────────────────────────────────────
add_section_heading(doc, "END-OF-MONTH MILESTONES  —  Check on Oct 31 & Nov 30", fill='E07B39')
add_spacer(doc)

add_colored_para(doc, "October 31 Targets", fill='FADBD8', text_color='C0392B', bold=True, size=10)
milestone_oct = [
    ["Medicine",     "All 3 weeks done (CVS, Respiratory, Nephro, Neuro, Endo, GI, Rheum, Haem), accuracy > 60%", "[ ]"],
    ["Surgery",      "GI, Thyroid, Breast, Vascular, Urology, Trauma complete, accuracy > 60%",                   "[ ]"],
    ["PYQs",         "Medicine + Surgery PYQ sets completed on Cerebellum",                                        "[ ]"],
    ["MCQs",         "Total cumulative (all subjects): ~10,000+ MCQs solved",                                      "[ ]"],
    ["Mock Tests",   "4 Sunday mocks done, score trending above 140/300",                                          "[ ]"],
    ["Drug List",    "Personal 'Drug of Choice' master list updated for Medicine + Surgery",                        "[ ]"],
]
add_milestone_table(doc, milestone_oct, accent='C0392B')
add_spacer(doc)

add_colored_para(doc, "November 30 Targets", fill='E8DAEF', text_color='7D3C98', bold=True, size=10)
milestone_nov = [
    ["OBG",          "Obstetrics + Gynecology + Contraception fully complete, accuracy > 60%",                     "[ ]"],
    ["PSM",          "Epidemiology, Biostatistics, NHPs, Nutrition complete — formulas memorised",                  "[ ]"],
    ["Pediatrics",   "Growth milestones, vaccine schedule, common diseases complete",                               "[ ]"],
    ["ENT + Ophtho", "Both complete, image-based Qs practiced, accuracy > 60%",                                    "[ ]"],
    ["MCQs",         "Cumulative total (all subjects to date): ~17,000+ MCQs solved",                               "[ ]"],
    ["Mock Tests",   "8 Sunday mocks done since Aug — latest score consistently above 150/300",                    "[ ]"],
    ["Revision",     "First GRAND REVISION of all subjects started in last week of November",                      "[ ]"],
]
add_milestone_table(doc, milestone_nov, accent='7D3C98')
add_spacer(doc)

# ── WHAT'S NEXT ────────────────────────────────────────────────────────────────
add_section_heading(doc, "WHAT COMES NEXT  —  December to January 6 (Final Sprint)", fill='2E6DA4')
add_spacer(doc)
add_body(doc, "December 1–15:  Complete minor subjects (FMT, Derma, Psychiatry, Ortho, Anaes, Radio — 35 Qs total)", bold=True)
add_body(doc, "December 16–31: Grand Revision of ALL subjects. Full 300-Q mock tests daily. Target 160+ per mock.")
add_body(doc, "January 1–6:    Short notes only. No new topics. Sleep 8 hrs/night. Light revision from personal notes.")
add_body(doc, "January 7:      EXAM DAY — Attempt ALL 300 questions (no negative marking). Trust your preparation.")
add_spacer(doc)

# ── CLOSING ─────────────────────────────────────────────────────────────────────
add_title_para(doc,
    '"The clinical subjects are the battle. Win them, and FMGE is yours."',
    "FMGE Jan 7, 2027  |  Target: 150+/300  |  Phase 2: Own the clinicals!")

# ── SAVE ───────────────────────────────────────────────────────────────────────
out = "/home/daytona/workspace/fmge-schedule/FMGE_Schedule_Oct_Nov_2026.docx"
buf = io.BytesIO()
doc.save(buf)
buf.seek(0)
with open(out, 'wb') as f:
    f.write(buf.read())
print(f"SUCCESS: {out}  ({os.path.getsize(out):,} bytes)")
Running Command

cd /home/daytona/workspace/fmge-schedule && python3 build_oct_nov.py 2>&1

Running Command

python3 -c " import zipfile, xml.etree.ElementTree as ET z = zipfile.ZipFile('/home/daytona/workspace/fmge-schedule/FMGE_Schedule_Oct_Nov_2026.docx') xml = z.read('word/document.xml') ET.fromstring(xml) print('XML valid. Files:', len(z.namelist())) # Also verify Aug-Sep fixed file z2 = zipfile.ZipFile('/home/daytona/workspace/fmge-schedule/FMGE_Schedule_Aug_Sep_2026.docx') xml2 = z2.read('word/document.xml') ET.fromstring(xml2) print('Aug-Sep also valid. Files:', len(z2.namelist())) "

Both documents are ready and validated. Download them here:
Fixed Aug-Sep schedule (rebuilt with no errors):

FMGE Schedule Aug Sep 2026

Word Document · DOCX

New Oct-Nov Clinical Schedule:

FMGE Schedule Oct Nov 2026

Word Document · DOCX


What's in the Oct-Nov document:

SectionDetails
Phase 2 OverviewWhy this phase decides your result (170 Qs = 57% of paper)
Daily Schedule (Mon-Sat)8.5 hrs/day with 2 MCQ blocks + dedicated PYQ time + mistake analysis
Sunday ScheduleFull 300-Q mock + deep weak-topic revision
October Week PlanWeek 1-3: Medicine (CVS, Resp, Nephro, Neuro, Endo, GI, Rheum) + Week 4-5: Surgery
November Week PlanWeek 1-2: OBG + Week 3-4: PSM + Pediatrics + Week 5: ENT + Ophthalmology
High-Yield AreasSubject-wise FMGE-specific must-know points for all 7 subjects
Clinical Strategy Tips8 tips specific to clinical subject MCQ approach
Oct 31 + Nov 30 MilestonesChecklist to self-assess progress
December-January PreviewBrief roadmap for the final sprint phase

Key change vs Aug-Sep schedule:

The Oct-Nov schedule has a dedicated PYQ block (5:30–7:00 PM) added daily because clinical subjects have heavy PYQ repetition in FMGE, and a separate mistake analysis block after each MCQ session for deeper learning.
This is a shared conversation. Sign in to Orris to start your own chat.