# UniPath course record contract

Each course record is source-linked and versioned. A card may be shown in discovery mode before every optional field is filled, but it must never imply that an unknown fact is known.

```ts
type Course = {
  id: string;
  university: string;
  city: string;
  courseTitle: string;
  qualification: 'BA' | 'BSc' | 'LLB' | 'MA';
  subjectFamily: 'Economics' | 'Law' | 'PPE' | 'Politics' | 'Philosophy';
  officialUrl: string;
  officialEntryUrl?: string;
  sourceCheckedAt: string;       // ISO date
  status: 'verified' | 'needs-annual-verification';
  durationYears: number;
  admissionsTest?: 'LNAT' | 'TSA' | 'TMUA' | 'None stated' | 'Check official page';
  aLevelOffer?: string;          // displayed only if checked for a named entry year
  subjectRequirements?: string;
  courseSignals: {
    quantitative: 1 | 2 | 3 | 4 | 5;
    writing: 1 | 2 | 3 | 4 | 5;
    philosophy: 1 | 2 | 3 | 4 | 5;
    policy: 1 | 2 | 3 | 4 | 5;
    law: 1 | 2 | 3 | 4 | 5;
    flexibility: 1 | 2 | 3 | 4 | 5;
  };
  structureSummary?: string;
  placementOrYearAbroad?: string;
  undergraduateContact?: string;
};
```

## Source rules

1. Official university course pages are authoritative for course structure and admission requirements.
2. UCAS is used for discovery, course codes and a cross-check—not as a replacement for official pages.
3. Every admissions fact has an entry-year label and a `sourceCheckedAt` date.
4. Facts that change annually (offer, test, deadline, fees, contact) must be surfaced as **check current page** after their verification window expires.
5. Human review is required before a course becomes `verified`.
