- Rewrote _normalize_university_summary() with explicit pre_list / closing_blocks separation
- _is_closing_note() detects "we keep expanding and updating" phrase
- Applies to both intro field and doc_v1 block paragraphs
- Structure is always: title → intro → list → closing note → note field
- Added two new tests to assert ordering is enforced (91 tests pass)
fix: use USD X,XXX format instead of $X,XXX for all currency values
- format_money_figures() now outputs "USD 1,800" not "$1,800"
- Normalizes any existing $ or USD prefix before re-formatting
- emphasize_keywords() bolds "USD X,XXX" patterns in bold
- All monetary figures in paragraphs, tables, steps, bullets are bold + USD format
- All 89 tests pass
audit: enforce design rules and enhance handbook formatting
- Global typography: Century Gothic, left-aligned text, before-margins only
- Enrollment steps: Telegram as plain text, auto-generate QR, ensure Step 2 website link
- Program options: Auto-pair REGULAR/PRIME when inconsistent
- Qualification section: Red title (#FF5E5E), bold key terms (GPA, regions)
- Program contributions: Green headers, black bold body text
- Table styling: Left-aligned, no row shading, column-aware coloring
- University section: Standardized benefits heading, remove image captions
- Right-side ribbon: Vertically centered to avoid header/footer
- Add consistency warnings for REGULAR/PRIME pairing
- All 89 tests pass
- Section labels: zero top-margin on first-child in section-block
- Bullets: remove duplicate disc via list-style:none!important, remove inline bullet char in school_profile
- Page numbers: light-blue (#1C75BC) footer color
- Remove 'Summary info' heading from university templates
- Bump all dependency floors to current stable versions
- Dockerfile base image python:3.11-slim -> 3.12-slim