Add detection for institutions that follow UK university naming
conventions (e.g., "University of the Peak District") but aren't
in the recognised institutions list. These are now flagged as
"Suspicious" with a -15 point penalty instead of just "Unknown".
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add checkbox requiring users to agree to Terms of Service and Privacy Policy
- Add TermsAcceptedAt field to ApplicationUser to track acceptance
- Link checkbox to actual /terms and /privacy pages
- Remove passive text that was using dead # links
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace 'diploma mill' language with objective 'unaccredited institution' terminology
- Rename DiplomaMills.cs to UnaccreditedInstitutions.cs with neutral language
- Update EducationVerificationResult.IsUnaccredited property
- Update flag titles to 'Unaccredited Institution' and 'Institution Requires Verification'
- Add legal disclaimer to verification report page
- Add Privacy Policy page (/privacy) with UK GDPR compliance info
- Add Terms of Service page (/terms) with candidate notice requirements
- Add footer links to Privacy and Terms pages
- Update all tests to use new terminology
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix logo to show RealCV instead of TrueCV
- Remove duplicate auth-logo from Login/Register pages
- Dashboard: reduce padding, smaller icons, tighter table rows
- Report: compact score header (140px → 100px roundel)
- Reduce stat card sizes and spacing throughout
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The SRA (Solicitors Regulation Authority) does not provide a public REST API.
Their register is only accessible via their website. Removed all SRA-related
code and added ApiTester tool for testing remaining integrations.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Keep only the genuinely free APIs:
- FCA Register (free with registration)
- SRA Register (free public API)
- GitHub (free tier sufficient)
- ORCID (free public API)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This adds five new free API integrations for enhanced CV verification:
- FCA Register API: Verify financial services professionals
- SRA Register API: Verify solicitors and legal professionals
- GitHub API: Verify developer profiles and technical skills
- OpenCorporates API: Verify international companies across jurisdictions
- ORCID API: Verify academic researchers and publications
Includes:
- API clients for all five services with retry policies
- Service implementations with name matching and validation
- Models for verification results with detailed flags
- Configuration options in appsettings.json
- DI registration for all services
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Deliveroo alias (ROOFOODS LTD) to fix matching to wrong company
- Add JCB alias (J.C. BAMFORD EXCAVATORS LIMITED)
- Improve FindDirectAliasMatch to prefer active companies over dissolved
- Display verification flags in CVBatchTester output
- Employer verification improved from 65% to 86%
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- WPP was failing because AI didn't recognize "WPP 2005 LIMITED" as the main
WPP entity (WPP plc is incorporated in Jersey, not UK Companies House)
- Added FindDirectAliasMatch() that accepts candidates matching known aliases
without requiring AI confirmation
- Fixed WPP alias to use "WPP 2005 LIMITED" instead of non-existent "WPP PLC"
- This improves employer verification from 84% to 85%
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add trading name aliases for major UK companies (Boots, BBC, Lloyds, etc.)
mapping to their official Companies House registered names
- Add Leeds Beckett University (and former name Leeds Metropolitan) to
recognised UK institutions
- This improves company verification from 65% to 84% on test data
- CVBatchTester tool for testing verification against JSON CVs
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Added CandidateName field to CVCheckDto
- Extract candidate name from ReportJson or ExtractedDataJson
- Dashboard now shows actual candidate name for JSON uploads
- PDF export uses candidate name from report
This fixes the issue where JSON files showed their filename (e.g.,
"CLEAN-001") instead of the actual candidate name from the CV data.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fixed CSS variable references in Razor components that were still
using the old --truecv- prefix, causing score circles and other
styled elements to not render properly.
Also changed score-ring-value font to Inter for consistent numbers.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The stylized '0' in JetBrains Mono was being confused with '8'.
Changed to Inter with tabular-nums for clearer number display.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The logo already serves as the home link, so having a separate Home
text link next to it was redundant and cluttered the navigation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Change text-warning from bright yellow (#ffc107) to darker amber (#b45309)
for WCAG AA compliant 4.8:1 contrast ratio on white backgrounds.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Increase font sizes from 11px to 12px for employment headers and notes
- Improve color contrast (gray-500 to gray-600) for WCAG AA compliance
- Increase opacity for white text on dark backgrounds (0.6/0.8 to 0.8/0.9)
- Fix duplicate company penalty display to only apply for sequential entries
- Non-sequential entries of same company now each show their own penalty
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
ProcessCVCheckJob:
- Recognize "contract", "contract work", "contract role" as freelance
- Add "various", "various clients" for multiple short-term contracts
- Prevents false matching of contract work to dissolved companies
Report.razor:
- Fix stat blocks centering (icon, number, label now centered)
- Fix employment table column alignment with fixed widths
- Add inline styles to header for consistent centering
- Improve GetPointsForCompany to show -10 for unverified companies
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add universal cursor inherit rule for consistent cursor behavior
- Add user-select: none to prevent text selection on UI elements
- Expand element coverage to include modals, tooltips, and inline elements
- Preserve text cursor and selection for form inputs with !important
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- deploy.sh: Publish and deploy from dev machine
- server-setup.sh: One-time Ubuntu server setup (Nginx, Docker, SQL Server)
- README.md: Deployment documentation and troubleshooting guide
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace hero section PNG logo with clean SVG document illustration
- Add comprehensive cursor styling to prevent text cursor on non-editable elements
- Cover all SVG elements, Bootstrap components, and custom classes
- Ensure checkboxes and interactive elements have pointer cursor
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add CandidateName property to VeracityReport and display on report page
- Simplify employment verification layout with compact row-based design
- Add UK employment history notice to Home and Check pages
- Improve hero section text readability with text shadow
- Update Login and Register page styling
- Remove Companies House references from UI text
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move admin credentials from hardcoded values to configuration
- Add rate limiting (5/min) to login endpoint for brute force protection
- Extract CleanJsonResponse to shared JsonResponseHelper class
- Add DateHelpers.MonthsBetween utility and consolidate date calculations
- Update PdfReportService to use ScoreThresholds constants
- Remove 5 unused shared components (EmploymentTable, FlagsList, etc.)
- Clean up unused CSS from MainLayout.razor.css
- Create IPdfReportService interface for better testability
- Add authentication requirement to Hangfire dashboard in development
- Seal EducationVerifierService class
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add checkbox column with Select All in header
- Show selection count badge and Delete Selected button
- Enhanced confirmation modal for bulk operations
- Row highlighting for selected items
- Fixed button spacing (gap between View and Delete)
- Scrollable list in modal for many selected items
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add "partnership" detection to charity/voluntary check (excluding LLPs).
Most UK "X Partnership" organisations are registered charities or CICs,
e.g., North Halifax Partnership Limited (charity 1169746).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update flag assertions to filter by specific flag types
(job now creates additional informational flags)
- Update overlap tests: now "Concurrent Employment" with Info severity
- Update overlap score tests: no penalty for overlaps
(legitimate for part-time, consulting, job transitions)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Enhance text contrast (darker grey #2d2b27)
- Soften footer with warmer dark (#3a3833)
- Use warmer primary blue (#3d5a80)
- Add subtle background gradient for depth
- Strengthen table header styling
- Increase logo size to 95px for better visibility
- Fix AI matcher to handle acronyms in parentheses (e.g., NHP)
- Improve matching rules for CIC/LLP legal suffixes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace bright white backgrounds with warmer off-white tones to reduce
eye strain while maintaining good contrast and professional appearance.
Changes:
- Update CSS variables with warmer neutral palette (#f5f3f0 page bg,
#faf9f7 surfaces, #f0ede8 muted sections)
- Soften primary blue from #2563eb to #3b6fd4
- Update navbar, cards, tables to use new surface colours
- Update upload area, file lists, and icon backgrounds
- Update flag item backgrounds with softer tints
- Update shared components (VeracityScoreCard, FlagsList)
The new colour scheme uses warm off-white/cream tones that are easier
on the eyes than pure white while maintaining professionalism.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace fuzzy string matching with semantic AI matching to fix false
positives where similar-sounding but different companies were matched
(e.g., "Families First CiC" incorrectly matching "FAMILIES AGAINST
CONFORMITY LTD").
Changes:
- Add ICompanyNameMatcherService interface and AICompanyNameMatcherService
implementation using Claude Sonnet 4 for semantic company name comparison
- Add SemanticMatchResult and related models for AI match results
- Update CompanyVerifierService to use AI matching with fuzzy fallback
- Add detection for public sector employers, charities, and self-employed
entries that cannot be verified via Companies House
- Update tests to work with new AI matcher integration
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Red ring for low/zero scores
- Amber ring for medium scores
- Green ring for high scores
- Background ring now visible and coloured appropriately
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add explicit circumference calculation for clarity
- Apply rotate(-90deg) to start progress from 12 o'clock
- Add transform-origin: center for consistent rotation
- Clean up duplicate CSS rules
- Fix mobile responsive styles for score-roundel
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Change header background to neutral blue gradient
- Add score roundel with coloured ring based on score
- Ring colour indicates score level (green/amber/red)
- Keeps header consistent regardless of score
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Filter out empty, "Unknown", and "Unknown Institution" values
from generating verification flags since there's nothing to verify.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove score rating labels (Excellent, Good, Fair, Poor, Very Poor)
- Display "TrueCV Score" instead of rating text
- Remove Rating column from batch PDF report
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add custom CSS design system with brand colours and variables
- Enhance Report page with SVG score ring and improved flag styling
- Improve Dashboard with better table design and score badges
- Enhance Check page upload area with animated icon and file styling
- Update spellings to UK English (analysing, recognised)
- Add user-select: none to prevent text cursor on clickable elements
- All date formats already use UK-friendly dd MMM yyyy format
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When the institution name is empty, "Unknown", or "Unknown Institution",
don't show the "not found in UK database" message since it's not useful.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Informational flags are context-only and don't affect the score,
so displaying "0 pts" was redundant and confusing.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>