{"id":209,"date":"2026-03-31T10:56:26","date_gmt":"2026-03-31T10:56:26","guid":{"rendered":"https:\/\/medlearn.imperial.ac.uk\/innovation\/projects\/timetabling-compliance-checker\/"},"modified":"2026-04-09T16:47:18","modified_gmt":"2026-04-09T16:47:18","slug":"timetabling-compliance-checker","status":"publish","type":"page","link":"https:\/\/medlearn.imperial.ac.uk\/innovation\/projects\/timetabling-compliance-checker\/","title":{"rendered":"Timetabling Compliance Checker"},"content":{"rendered":"<p><!-- BANNER --><br \/>\n<svg viewBox=\"0 0 1400 460\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:100%;display:block;border-radius:10px;margin-bottom:32px;\">\n  <defs><linearGradient id=\"ttbg\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"><stop offset=\"0%\" style=\"stop-color:#0d2b3e;stop-opacity:1\"\/><stop offset=\"55%\" style=\"stop-color:#1a4a5e;stop-opacity:1\"\/><stop offset=\"100%\" style=\"stop-color:#0d4a3a;stop-opacity:1\"\/><\/linearGradient><\/defs>\n  <rect width=\"1400\" height=\"460\" fill=\"url(#ttbg)\" rx=\"10\"\/>\n  <line x1=\"900\" y1=\"80\"  x2=\"1380\" y2=\"80\"  stroke=\"#ffffff\" stroke-opacity=\"0.06\" stroke-width=\"1\"\/>\n  <line x1=\"900\" y1=\"130\" x2=\"1380\" y2=\"130\" stroke=\"#ffffff\" stroke-opacity=\"0.06\" stroke-width=\"1\"\/>\n  <line x1=\"900\" y1=\"180\" x2=\"1380\" y2=\"180\" stroke=\"#ffffff\" stroke-opacity=\"0.06\" stroke-width=\"1\"\/>\n  <line x1=\"900\" y1=\"230\" x2=\"1380\" y2=\"230\" stroke=\"#ffffff\" stroke-opacity=\"0.06\" stroke-width=\"1\"\/>\n  <line x1=\"900\" y1=\"280\" x2=\"1380\" y2=\"280\" stroke=\"#ffffff\" stroke-opacity=\"0.06\" stroke-width=\"1\"\/>\n  <line x1=\"900\" y1=\"330\" x2=\"1380\" y2=\"330\" stroke=\"#ffffff\" stroke-opacity=\"0.06\" stroke-width=\"1\"\/>\n  <line x1=\"900\"  y1=\"80\" x2=\"900\"  y2=\"380\" stroke=\"#ffffff\" stroke-opacity=\"0.06\" stroke-width=\"1\"\/>\n  <line x1=\"1020\" y1=\"80\" x2=\"1020\" y2=\"380\" stroke=\"#ffffff\" stroke-opacity=\"0.06\" stroke-width=\"1\"\/>\n  <line x1=\"1160\" y1=\"80\" x2=\"1160\" y2=\"380\" stroke=\"#ffffff\" stroke-opacity=\"0.06\" stroke-width=\"1\"\/>\n  <line x1=\"1280\" y1=\"80\" x2=\"1280\" y2=\"380\" stroke=\"#ffffff\" stroke-opacity=\"0.06\" stroke-width=\"1\"\/>\n  <rect x=\"901\" y=\"131\" width=\"478\" height=\"48\" fill=\"#e74c3c\" fill-opacity=\"0.12\" rx=\"2\"\/>\n  <rect x=\"901\" y=\"231\" width=\"478\" height=\"48\" fill=\"#e74c3c\" fill-opacity=\"0.10\" rx=\"2\"\/>\n  <rect x=\"901\" y=\"281\" width=\"478\" height=\"48\" fill=\"#f39c12\" fill-opacity=\"0.10\" rx=\"2\"\/>\n  <text x=\"920\" y=\"112\" font-family=\"monospace\" font-size=\"13\" fill=\"#ffffff\" fill-opacity=\"0.35\">RULE<\/text>\n  <text x=\"1040\" y=\"112\" font-family=\"monospace\" font-size=\"13\" fill=\"#ffffff\" fill-opacity=\"0.35\">TYPE<\/text>\n  <text x=\"1180\" y=\"112\" font-family=\"monospace\" font-size=\"13\" fill=\"#ffffff\" fill-opacity=\"0.35\">STATUS<\/text>\n  <text x=\"920\" y=\"162\" font-family=\"monospace\" font-size=\"12\" fill=\"#ff6b6b\" fill-opacity=\"0.7\">Room clash<\/text>\n  <text x=\"1040\" y=\"162\" font-family=\"monospace\" font-size=\"12\" fill=\"#ff6b6b\" fill-opacity=\"0.7\">Hard<\/text>\n  <text x=\"1180\" y=\"162\" font-family=\"monospace\" font-size=\"12\" fill=\"#ff6b6b\" fill-opacity=\"0.7\">&#x2715; Flag<\/text>\n  <text x=\"920\" y=\"262\" font-family=\"monospace\" font-size=\"12\" fill=\"#ffd166\" fill-opacity=\"0.6\">Module clash<\/text>\n  <text x=\"1040\" y=\"262\" font-family=\"monospace\" font-size=\"12\" fill=\"#ffd166\" fill-opacity=\"0.6\">Soft<\/text>\n  <text x=\"1180\" y=\"262\" font-family=\"monospace\" font-size=\"12\" fill=\"#ffd166\" fill-opacity=\"0.6\">&#x26a0; Review<\/text>\n  <text x=\"920\" y=\"312\" font-family=\"monospace\" font-size=\"12\" fill=\"#ffd166\" fill-opacity=\"0.55\">Day pattern<\/text>\n  <text x=\"1040\" y=\"312\" font-family=\"monospace\" font-size=\"12\" fill=\"#ffd166\" fill-opacity=\"0.55\">Soft<\/text>\n  <text x=\"1180\" y=\"312\" font-family=\"monospace\" font-size=\"12\" fill=\"#ffd166\" fill-opacity=\"0.55\">&#x26a0; Review<\/text>\n  <text x=\"72\" y=\"140\" font-family=\"Georgia,serif\" font-size=\"54\" fill=\"#ffffff\" font-weight=\"700\">Timetabling<\/text>\n  <text x=\"72\" y=\"205\" font-family=\"Georgia,serif\" font-size=\"54\" fill=\"#4dd0a0\">Compliance Checker<\/text>\n  <text x=\"74\" y=\"265\" font-family=\"Arial,sans-serif\" font-size=\"22\" fill=\"#ffffff\" fill-opacity=\"0.72\">CELCAT ingestion &#xb7; 12+ rules &#xb7; Exception reporting &#xb7; Roll-forward diffing<\/text>\n  <rect x=\"72\" y=\"300\" width=\"290\" height=\"48\" rx=\"8\" fill=\"#1abc9c\" fill-opacity=\"0.18\" stroke=\"#1abc9c\" stroke-opacity=\"0.4\" stroke-width=\"1\"\/>\n  <text x=\"217\" y=\"329\" font-family=\"Arial,sans-serif\" font-size=\"15\" fill=\"#4dd0a0\" font-weight=\"700\" text-anchor=\"middle\">&#x25cf; Live POC &#x2014; Actively testing<\/text>\n<\/svg><!-- METADATA TABLE --><\/p>\n<table style=\"width:100%;border-collapse:collapse;margin-bottom:36px;font-size:15px;\">\n<tbody>\n<tr style=\"border-bottom:1px solid #e5e7eb;\">\n<td style=\"padding:12px 16px;font-weight:700;color:#003E74;width:160px;white-space:nowrap;\">Status<\/td>\n<td style=\"padding:12px 16px;\"><span style=\"background:#d1fae5;color:#065f46;padding:3px 10px;border-radius:20px;font-size:13px;font-weight:600;\">Live POC &#x2014; Active testing<\/span><\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;background:#f9fafb;\">\n<td style=\"padding:12px 16px;font-weight:700;color:#003E74;\">Developer<\/td>\n<td style=\"padding:12px 16px;color:#1f2937;\">Adrian Cowell &#x2014; Innovation Lead, Faculty of Medicine<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;\">\n<td style=\"padding:12px 16px;font-weight:700;color:#003E74;\">Timetabling team<\/td>\n<td style=\"padding:12px 16px;color:#1f2937;\">\n        Michele Foot (Timetabling Team Lead) &#xb7;<br \/>\n        James Moss (Principal Teaching Fellow) &#xb7;<br \/>\n        Allyson Chan (Timetabling Officer, Phase 2 &amp; 3) &#xb7;<br \/>\n        Sarah S Johnson (Timetabling Officer, Phase 1) &#xb7;<br \/>\n        Ludmilla Holmes (Timetabling Officer, Postgraduate) &#xb7;<br \/>\n        Robson R Dos Santos (Timetabling &amp; Room Booking Manager)\n      <\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;background:#f9fafb;\">\n<td style=\"padding:12px 16px;font-weight:700;color:#003E74;\">Tech stack<\/td>\n<td style=\"padding:12px 16px;color:#1f2937;\">Next.js 14 &#xb7; React &#xb7; TypeScript &#xb7; Tailwind CSS &#xb7; Vercel &#xb7; GitHub<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;\">\n<td style=\"padding:12px 16px;font-weight:700;color:#003E74;\">Data source<\/td>\n<td style=\"padding:12px 16px;color:#1f2937;\">CELCAT (flat CSV, Power BI extract, CT_EVENT hierarchical format)<\/td>\n<\/tr>\n<tr style=\"background:#f9fafb;\">\n<td style=\"padding:12px 16px;font-weight:700;color:#003E74;\">Campuses<\/td>\n<td style=\"padding:12px 16px;color:#1f2937;\">Charing Cross &#xb7; Hammersmith &#xb7; South Kensington &#xb7; White City &#xb7; St Mary&#x2019;s<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><!-- PROBLEM --><\/p>\n<h2 style=\"font-family:Georgia,serif;font-size:26px;color:#003E74;margin:0 0 14px;padding-bottom:8px;border-bottom:2px solid #e5e7eb;\">The Problem<\/h2>\n<p style=\"font-size:15px;line-height:1.85;color:#374151;margin-bottom:14px;\">The Faculty of Medicine&#x2019;s timetabling team manages thousands of teaching events across five London campuses using CELCAT. Checking that bookings comply with institutional scheduling policies &#x2014; lunch breaks, maximum consecutive teaching hours, room double-bookings, staff travel time, teaching day boundaries &#x2014; was a manual, time-consuming process with no centralised way to flag violations or track decisions.<\/p>\n<p style=\"font-size:15px;line-height:1.85;color:#374151;margin-bottom:36px;\">As scheduling complexity grows across the MBBS programme and allied courses, the team needed a tool that could apply and audit these rules automatically, producing actionable findings without requiring developer involvement to configure or adjust.<\/p>\n<p><!-- WHAT IT DOES --><\/p>\n<h2 style=\"font-family:Georgia,serif;font-size:26px;color:#003E74;margin:0 0 14px;padding-bottom:8px;border-bottom:2px solid #e5e7eb;\">What It Does<\/h2>\n<p style=\"font-size:15px;line-height:1.85;color:#374151;margin-bottom:20px;\">The Timetabling Compliance Checker ingests CELCAT exports, applies a configurable rule engine, and produces downloadable exception reports &#x2014; enabling the timetabling team to identify, triage, and resolve scheduling issues at scale.<\/p>\n<div style=\"display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:36px;\">\n<div style=\"background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;padding:16px;\">\n<p style=\"margin:0 0 5px;font-size:12px;font-weight:700;color:#065f46;text-transform:uppercase;letter-spacing:.5px;\">Three import formats<\/p>\n<p style=\"margin:0;font-size:14px;line-height:1.6;color:#374151;\">Flat CSV, Power BI extract, and hierarchical CT_EVENT &#x2014; with automatic schema detection.<\/p>\n<\/p><\/div>\n<div style=\"background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;padding:16px;\">\n<p style=\"margin:0 0 5px;font-size:12px;font-weight:700;color:#065f46;text-transform:uppercase;letter-spacing:.5px;\">12+ configurable rules<\/p>\n<p style=\"margin:0;font-size:14px;line-height:1.6;color:#374151;\">Covering room clashes, staff overlaps, travel buffers, duration limits, lunch breaks, consecutive teaching, and more.<\/p>\n<\/p><\/div>\n<div style=\"background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;padding:16px;\">\n<p style=\"margin:0 0 5px;font-size:12px;font-weight:700;color:#065f46;text-transform:uppercase;letter-spacing:.5px;\">Hard &amp; soft findings<\/p>\n<p style=\"margin:0;font-size:14px;line-height:1.6;color:#374151;\">Hard findings (e.g. room double-booking) require action. Soft findings carry confidence scores and resolution recommendations.<\/p>\n<\/p><\/div>\n<div style=\"background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;padding:16px;\">\n<p style=\"margin:0 0 5px;font-size:12px;font-weight:700;color:#065f46;text-transform:uppercase;letter-spacing:.5px;\">Roll-forward comparison<\/p>\n<p style=\"margin:0;font-size:14px;line-height:1.6;color:#374151;\">Compares before\/after timetable versions to surface new sessions, missing sessions, drift, and new violations introduced between planning cycles.<\/p>\n<\/p><\/div>\n<div style=\"background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;padding:16px;\">\n<p style=\"margin:0 0 5px;font-size:12px;font-weight:700;color:#065f46;text-transform:uppercase;letter-spacing:.5px;\">Week-to-date expansion<\/p>\n<p style=\"margin:0;font-size:14px;line-height:1.6;color:#374151;\">Converts CELCAT week-range data into concrete calendar dates using an uploaded academic week mapping, enabling accurate overlap detection.<\/p>\n<\/p><\/div>\n<div style=\"background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;padding:16px;\">\n<p style=\"margin:0 0 5px;font-size:12px;font-weight:700;color:#065f46;text-transform:uppercase;letter-spacing:.5px;\">Team-managed configuration<\/p>\n<p style=\"margin:0;font-size:14px;line-height:1.6;color:#374151;\">All rules, profiles, exceptions, travel times, and week mappings are managed via CSV uploads by the team &#x2014; no developer involvement needed.<\/p>\n<\/p><\/div>\n<\/div>\n<p><!-- RULES TABLE --><\/p>\n<h2 style=\"font-family:Georgia,serif;font-size:26px;color:#003E74;margin:0 0 14px;padding-bottom:8px;border-bottom:2px solid #e5e7eb;\">Rules Implemented<\/h2>\n<table style=\"width:100%;border-collapse:collapse;font-size:14px;margin-bottom:36px;\">\n<thead>\n<tr style=\"background:#003E74;color:#ffffff;\">\n<th style=\"padding:10px 14px;text-align:left;font-weight:600;border-radius:8px 0 0 0;\">Rule<\/th>\n<th style=\"padding:10px 14px;text-align:left;font-weight:600;\">Type<\/th>\n<th style=\"padding:10px 14px;text-align:left;font-weight:600;border-radius:0 8px 0 0;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"border-bottom:1px solid #e5e7eb;\">\n<td style=\"padding:10px 14px;font-weight:600;color:#374151;\">Room double-booking<\/td>\n<td style=\"padding:10px 14px;\"><span style=\"background:#fee2e2;color:#991b1b;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600;\">Hard<\/span><\/td>\n<td style=\"padding:10px 14px;color:#6b7280;\">Two events in the same room at the same time, with campus and cohort context<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;background:#f9fafb;\">\n<td style=\"padding:10px 14px;font-weight:600;color:#374151;\">Staff overlap<\/td>\n<td style=\"padding:10px 14px;\"><span style=\"background:#fee2e2;color:#991b1b;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600;\">Hard<\/span><\/td>\n<td style=\"padding:10px 14px;color:#6b7280;\">Staff member scheduled for overlapping sessions<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;\">\n<td style=\"padding:10px 14px;font-weight:600;color:#374151;\">Travel buffer<\/td>\n<td style=\"padding:10px 14px;\"><span style=\"background:#fee2e2;color:#991b1b;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600;\">Hard<\/span><\/td>\n<td style=\"padding:10px 14px;color:#6b7280;\">Insufficient travel time between consecutive sessions at different campuses<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;background:#f9fafb;\">\n<td style=\"padding:10px 14px;font-weight:600;color:#374151;\">Duration bounds<\/td>\n<td style=\"padding:10px 14px;\"><span style=\"background:#fee2e2;color:#991b1b;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600;\">Hard<\/span><\/td>\n<td style=\"padding:10px 14px;color:#6b7280;\">Session duration outside allowed range (default 30 min &#x2013; 3 hrs)<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;\">\n<td style=\"padding:10px 14px;font-weight:600;color:#374151;\">Time window<\/td>\n<td style=\"padding:10px 14px;\"><span style=\"background:#fee2e2;color:#991b1b;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600;\">Hard<\/span><\/td>\n<td style=\"padding:10px 14px;color:#6b7280;\">Sessions outside the permitted teaching day (default 09:00&#x2013;18:00)<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;background:#f9fafb;\">\n<td style=\"padding:10px 14px;font-weight:600;color:#374151;\">Lunch break<\/td>\n<td style=\"padding:10px 14px;\"><span style=\"background:#fee2e2;color:#991b1b;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600;\">Hard<\/span><\/td>\n<td style=\"padding:10px 14px;color:#6b7280;\">Less than 60 minutes free between 12:00&#x2013;14:00<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;\">\n<td style=\"padding:10px 14px;font-weight:600;color:#374151;\">Max consecutive teaching<\/td>\n<td style=\"padding:10px 14px;\"><span style=\"background:#fee2e2;color:#991b1b;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600;\">Hard<\/span><\/td>\n<td style=\"padding:10px 14px;color:#6b7280;\">More than 4 hours of consecutive teaching without a break<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;background:#f9fafb;\">\n<td style=\"padding:10px 14px;font-weight:600;color:#374151;\">Cohort overlap<\/td>\n<td style=\"padding:10px 14px;\"><span style=\"background:#fee2e2;color:#991b1b;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600;\">Hard<\/span><\/td>\n<td style=\"padding:10px 14px;color:#6b7280;\">Same student group booked for two events simultaneously<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;\">\n<td style=\"padding:10px 14px;font-weight:600;color:#374151;\">Same-module clash<\/td>\n<td style=\"padding:10px 14px;\"><span style=\"background:#fef3c7;color:#92400e;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600;\">Soft<\/span><\/td>\n<td style=\"padding:10px 14px;color:#6b7280;\">Overlapping bookings for the same module (hold-and-allocate pattern) &#x2014; recommendation: ignore<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;background:#f9fafb;\">\n<td style=\"padding:10px 14px;font-weight:600;color:#374151;\">Event sequence order<\/td>\n<td style=\"padding:10px 14px;\"><span style=\"background:#fef3c7;color:#92400e;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600;\">Soft<\/span><\/td>\n<td style=\"padding:10px 14px;color:#6b7280;\">Numbered\/parted events out of chronological order<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e5e7eb;\">\n<td style=\"padding:10px 14px;font-weight:600;color:#374151;\">Recurring day pattern<\/td>\n<td style=\"padding:10px 14px;\"><span style=\"background:#fef3c7;color:#92400e;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600;\">Soft<\/span><\/td>\n<td style=\"padding:10px 14px;color:#6b7280;\">Recurring event usually on one weekday but an instance falls on a different day<\/td>\n<\/tr>\n<tr style=\"background:#f9fafb;\">\n<td style=\"padding:10px 14px;font-weight:600;color:#374151;\">Tutor \/ module preferences<\/td>\n<td style=\"padding:10px 14px;\"><span style=\"background:#fef3c7;color:#92400e;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600;\">Soft<\/span><\/td>\n<td style=\"padding:10px 14px;color:#6b7280;\">Teaching outside a tutor&#x2019;s preferred time window or a module&#x2019;s preferred campus<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><!-- TECHNOLOGY --><\/p>\n<h2 style=\"font-family:Georgia,serif;font-size:26px;color:#003E74;margin:0 0 14px;padding-bottom:8px;border-bottom:2px solid #e5e7eb;\">Technology<\/h2>\n<p style=\"font-size:15px;line-height:1.85;color:#374151;margin-bottom:20px;\">Built as a serverless Next.js application &#x2014; no database dependency. All processing is in-memory per run, with configuration and reference data uploaded as CSV\/XLSX files. This keeps the tool lightweight and deployable without infrastructure overhead.<\/p>\n<div style=\"display:flex;flex-wrap:wrap;gap:10px;margin-bottom:36px;\">\n  <span style=\"background:#f1f5f9;border:1px solid #e2e8f0;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:600;color:#334155;\">Next.js 14<\/span><br \/>\n  <span style=\"background:#f1f5f9;border:1px solid #e2e8f0;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:600;color:#334155;\">React<\/span><br \/>\n  <span style=\"background:#f1f5f9;border:1px solid #e2e8f0;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:600;color:#334155;\">TypeScript<\/span><br \/>\n  <span style=\"background:#f1f5f9;border:1px solid #e2e8f0;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:600;color:#334155;\">Tailwind CSS<\/span><br \/>\n  <span style=\"background:#f1f5f9;border:1px solid #e2e8f0;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:600;color:#334155;\">Vercel<\/span><br \/>\n  <span style=\"background:#f1f5f9;border:1px solid #e2e8f0;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:600;color:#334155;\">GitHub<\/span><br \/>\n  <span style=\"background:#f1f5f9;border:1px solid #e2e8f0;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:600;color:#334155;\">csv-parse<\/span><br \/>\n  <span style=\"background:#f1f5f9;border:1px solid #e2e8f0;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:600;color:#334155;\">xlsx<\/span>\n<\/div>\n<p><!-- HOW IT WORKS --><\/p>\n<h2 style=\"font-family:Georgia,serif;font-size:26px;color:#003E74;margin:0 0 20px;padding-bottom:8px;border-bottom:2px solid #e5e7eb;\">How It Works<\/h2>\n<div style=\"display:flex;flex-direction:column;gap:0;margin-bottom:36px;\">\n<div style=\"display:flex;align-items:flex-start;gap:16px;padding:16px 0;border-bottom:1px solid #e5e7eb;\">\n<div style=\"min-width:36px;height:36px;background:#003E74;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;color:#ffffff;flex-shrink:0;\">1<\/div>\n<div>\n<p style=\"margin:0 0 4px;font-weight:700;color:#111827;font-size:15px;\">Upload configuration (optional)<\/p>\n<p style=\"margin:0;font-size:14px;color:#6b7280;line-height:1.6;\">Week mapping, rules config, tutor\/module profiles, exceptions, and travel times &#x2014; all as CSV files.<\/p>\n<\/div><\/div>\n<div style=\"display:flex;align-items:flex-start;gap:16px;padding:16px 0;border-bottom:1px solid #e5e7eb;\">\n<div style=\"min-width:36px;height:36px;background:#003E74;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;color:#ffffff;flex-shrink:0;\">2<\/div>\n<div>\n<p style=\"margin:0 0 4px;font-weight:700;color:#111827;font-size:15px;\">Upload reference data (optional)<\/p>\n<p style=\"margin:0;font-size:14px;color:#6b7280;line-height:1.6;\">Module and room workbooks from CELCAT add cohort phase, campus site, and room capacity for enriched context.<\/p>\n<\/div><\/div>\n<div style=\"display:flex;align-items:flex-start;gap:16px;padding:16px 0;border-bottom:1px solid #e5e7eb;\">\n<div style=\"min-width:36px;height:36px;background:#003E74;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;color:#ffffff;flex-shrink:0;\">3<\/div>\n<div>\n<p style=\"margin:0 0 4px;font-weight:700;color:#111827;font-size:15px;\">Upload timetable events<\/p>\n<p style=\"margin:0;font-size:14px;color:#6b7280;line-height:1.6;\">A CELCAT export in any supported format (CSV or XLSX).<\/p>\n<\/div><\/div>\n<div style=\"display:flex;align-items:flex-start;gap:16px;padding:16px 0;border-bottom:1px solid #e5e7eb;\">\n<div style=\"min-width:36px;height:36px;background:#1abc9c;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;color:#ffffff;flex-shrink:0;\">4<\/div>\n<div>\n<p style=\"margin:0 0 4px;font-weight:700;color:#111827;font-size:15px;\">View results<\/p>\n<p style=\"margin:0;font-size:14px;color:#6b7280;line-height:1.6;\">The app parses data, expands week-based events to calendar dates, runs all enabled rules, and displays findings with severity, confidence, and recommended next action.<\/p>\n<\/div><\/div>\n<div style=\"display:flex;align-items:flex-start;gap:16px;padding:16px 0;\">\n<div style=\"min-width:36px;height:36px;background:#1abc9c;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;color:#ffffff;flex-shrink:0;\">5<\/div>\n<div>\n<p style=\"margin:0 0 4px;font-weight:700;color:#111827;font-size:15px;\">Export<\/p>\n<p style=\"margin:0;font-size:14px;color:#6b7280;line-height:1.6;\">Download an exception report CSV for offline review, or a fix pack CSV with corrected data for use alongside CELCAT.<\/p>\n<\/div><\/div>\n<\/div>\n<p><!-- STATUS --><\/p>\n<div style=\"background:#f0fdf4;border-left:4px solid #1abc9c;border-radius:0 8px 8px 0;padding:20px 24px;\">\n<p style=\"margin:0 0 6px;font-size:13px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:#065f46;\">Current Status<\/p>\n<p style=\"margin:0;font-size:15px;line-height:1.7;color:#1c1917;\">Live proof-of-concept with the timetabling team actively testing against real <strong>2027\/28 CELCAT data<\/strong>. The team has validated rule accuracy across Charing Cross and Hammersmith campuses, confirming accurate detection of room clashes, lunch break violations, duration issues, and more. Next steps include automated fix suggestions, additional exception categories, and expanded campus coverage.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>RULE TYPE STATUS Room clash Hard &#x2715; Flag Module clash Soft &#x26a0; Review Day pattern Soft &#x26a0; Review Timetabling Compliance Checker CELCAT ingestion &#xb7; 12+ rules &#xb7; Exception reporting &#xb7; [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":0,"parent":7,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-209","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/pages\/209","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/comments?post=209"}],"version-history":[{"count":4,"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/pages\/209\/revisions"}],"predecessor-version":[{"id":275,"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/pages\/209\/revisions\/275"}],"up":[{"embeddable":true,"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/pages\/7"}],"wp:attachment":[{"href":"https:\/\/medlearn.imperial.ac.uk\/innovation\/wp-json\/wp\/v2\/media?parent=209"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}