Botswana CMS — end-to-end functional flow

Full campus lifecycle for LUCT Botswana (BWA-GBE, DB cmsbotswana) broken down by desk / capability — including the campus-local DTEF → TEF.gov.bw scholarship admission sync. Package CMS_Botswana_Source_Codes_&_DB_Structure_24_09_2026. Not the launch SoR (ADR-1 remains Cyberjaya); use for M5 expansion.

DB cmsbotswana 713 tables 14 desks DTEF gov API Dump 24 Sep 2026
LUCT CMS subsection. Connected from the Cyberjaya analysis hub: LUCT CMS → Botswana. Use the top nav LUCT CMS → Botswana group for ERD, DFD, database, DTEF, and comparison.
Scope. Structure and behaviour only. PHP tree, credentials, and live student data are not committed. Canonical notes: old-cms-botswana.md, botswana-dtef-scholarship-sync.md.

1. End-to-end campus lifecycle

One shared MySQL SoR. Staff desks own writes; thin student/lecturer PHPMaker UIs and api_student_* / portal_*_botswana hooks sit beside them. The TEF government POST is Botswana-only (no Cyberjaya equivalent).

Student journey across desks

Recruitment → offer → register → term study → fees / DTEF → services → reporting.

flowchart LR
  subgraph Recruit["1 · Recruit"]
    MKT[Marketing
app_* / agents] CDU[CDU / AQA
entry rules] end subgraph Admit["2 · Admit"] REG1[Registry
offer letters] APP[Online / staff
application] end subgraph Enrol["3 · Enrol"] REG2[Registry
r_student / programme] FAC1[Faculty
structure / modules] SET[Setup
terms / fees] end subgraph Study["4 · Study"] FAC2[Faculty
timetable / results] LEC[Lecturer
marks / attendance] STU[Student desk
self-service] end subgraph Money["5 · Finance"] BUR[Bursary
invoice / pay / assist] DTEF[DTEF queue
r_scholarshipapp] TEF[tef.gov.bw] end subgraph Life["6 · Student life"] SVC[Services
visa / welfare] ACC[Accommodation] LIB[Library] end subgraph Close["7 · Close / report"] REP[Reporting] BATCH[botsbatch] end MKT --> APP CDU -.-> APP APP --> REG1 REG1 --> REG2 SET --> REG2 FAC1 --> REG2 REG2 --> FAC2 FAC2 --> LEC FAC2 --> STU REG2 --> BUR BUR --> DTEF DTEF -->|status 31 POST| TEF REG2 --> SVC REG2 --> ACC REG2 --> LIB FAC2 --> REP BUR --> REP BATCH -.-> REP

2. Functional breakdown by desk

PHPMaker apps under botswana/campus/<desk>/ — same LUCT family as Cyberjaya.

Functional structure

Domains map to folders; all share cmsbotswana.

mindmap
  root((Botswana CMS
BWA-GBE)) Academic registry faculty lecturer cdu training Student life services accommodation library notice student Commercial bursary marketing DTEF_TEF_sync Platform setup reporting botsbatch portal_api_hooks

Module catalogue

Desk Primary job Key tables / signals ~PHP
registry/ Student master, offers, forms, transcripts, DTEF scholarship queue r_student, r_stdprogram, r_stdofferletter*, r_scholarshipapp ~894
setup/ Institution, terms, fee catalogs, user levels f_term, fee / security setup tables ~756
bursary/ Invoices, payments, receipts, assist / DTEF billing b_payment*, b_assistbilling*, b_stdassist*, DTEF letters ~452
faculty/ Schools, programmes, modules, attendance, results f_program, f_module, bots_program*, timetable ~333
services/ Welfare, counselling, visa / insurance ops w_* visa, insurance, applications ~308
marketing/ Applications, agents, recruitment app_*, m_agent ~235
reporting/ Population, enrolment, payment, scholarship reports rep_*, dtef_scholarship view ~211
cdu/ AQA / programme accreditation Entry / accreditation desks ~207
training/ Short-course / training enrolment Training desks ~202
lecturer/ Marks, attendance, module materials Lecturer portal screens ~122
library/ Library desks Library tables / views ~121
accommodation/ Dorms, occupants, room charges acc_*, w_occupant, w_room* ~118
notice/ Bulletin / noticeboard Notice desks ~79
student/ Thin student self-service Student PHPMaker screens ~38

3. Core process flows

3.1 Admissions & registry

Application → offer → student record

app_* forms, eligibility, offer letters, r_student creation.

flowchart TD
  A[Marketing / online app
app_applicationform*] --> B[Docs / eligibility
app_docfile · letters] B --> C[Registry offer
r_stdofferletter* · FetchOfferLetters] C --> D[Confirm registration
confirmReg SP] D --> E[r_student + r_stdprogram
+ r_stdsemester] E --> F[Faculty structure
f_program / bots_program*] E --> G[Bursary fee plan]

3.2 Academic term cycle

Modules → attendance → results

Faculty + lecturer desks; SPs GetTimetable, StudentConfirmModule, insertModule.

flowchart LR
  T[Term / structure
f_term · bots_structuresemester*] --> M[Module enrolment
r_stdmodule] M --> TT[Timetable
GetTimetable] TT --> ATT[Attendance] M --> MARK[Lecturer marks] MARK --> RR[Release results
f_releaseresult*] RR --> TR[Transcripts / BOE views]

3.3 Finance & assist

Billing → payment → scholarship assist

Bursary owns money; Registry owns DTEF admission POST to TEF (see §4).

flowchart TD
  FEE[Fee catalog / setup] --> INV[Invoices / instalments
b_*] INV --> PAY[Payments / receipts] PAY --> STMT[Statements / ageing views] INV --> ASSIST[Assist programmes
b_stdassistprog / sem] ASSIST --> DSCH[dtef_scholarship view
AssistProviderCode=DTEF] ASSIST --> GSTAT[getSCholarshipStatus fn] REGQ[Registry r_scholarshipapp] -->|status 31| TEF[tef.gov.bw] TEF -.->|34/35 outcomes| REGQ

3.4 Student life & ops

AreaDeskWhat happens
Visa / welfare / insuranceservices/w_visa, w_insurance*, counselling apps
Hostelaccommodation/acc_dorm / occupants / charges; links to bursary accommodation updates
Library / noticeslibrary/, notice/Campus services & bulletins
Batch / portalbotsbatch/Nightly SQL (registry, bursary, examination, portal, attendance) — ops artefacts, not committed
Portal hooksDB routinesapi_student_*, api_faculty_*, portal_*_botswana

4. Integrations — DTEF scholarship → TEF.gov.bw

Botswana-specific government integration. Registry queues programme-of-study admissions; saving with status 31 (Sent by Registry) POSTs HAL+JSON to tef.gov.bw. Finance assist billing is a separate path (b_stdassist* / dtef_scholarship.

Gov API · Drupal HAL+JSON Table r_scholarshipapp CAP-48 adjacent No Cyberjaya equivalent

Sync sequence

Evidence: r_scholarshipappedit.php / r_dropout_scholarshipappedit.php (lists r_scholarshipapplist.php, r_dropout_scholarshipapplist.php).

sequenceDiagram
  actor Reg as Registry officer
  participant Edit as Scholarship edit
  participant DB as r_scholarshipapp
  participant TEF as tef.gov.bw

  Reg->>Edit: Edit row · set status 31 · Save
  Edit->>TEF: GET /rest/session/token
  TEF-->>Edit: CSRF token
  Edit->>TEF: POST /api/post/studentadmissions
(HAL+JSON program_of_study) alt success or duplicate admission Edit->>DB: app_status=32 · remark=SUCCESS! else API / curl error Edit->>DB: app_status=33 · remark=error Edit-->>Reg: Alert — contact support end Note over DB,TEF: 34 Approved / 35 Rejected
recorded later (outcome path)

Where it sits in the campus flow

Admission POST vs finance assist

Same campus, two paths — do not conflate.

flowchart LR
  subgraph Registry["Registry"]
    L1[Active list]
    L2[Dropout list]
    E[Edit · status 31]
    L1 --> E
    L2 --> E
  end
  subgraph Store["cmsbotswana"]
    T[(r_scholarshipapp)]
    A[(b_stdassistprog / sem)]
    V[[dtef_scholarship]]
  end
  subgraph Gov["Government"]
    TEF[tef.gov.bw]
    DTEF[DTEF financing]
  end
  E -->|POST program_of_study| TEF
  E -->|UPDATE 32/33| T
  TEF -.->|34/35| T
  A --> V
  T -.->|ID overlap| A
  DTEF -.-> TEF
          

Status vocabulary (app_status)

CodeMeaningTEF call?
30PendingNo
31Sent by RegistryYes — triggers POST
32Successfully Sent to DTEFResult
33FailedResult
34Approved by DTEFOutcome (later)
35Rejected by DTEFOutcome (later)

Registry desks & API contract

DeskListEdit (sync)Query surface
Active r_scholarshipapplist.php r_scholarshipappedit.php View r_scholarshipapp_v
Dropout r_dropout_scholarshipapplist.php r_dropout_scholarshipappedit.php r_scholarshipapp ⟕ w_student_sview; requires programCost; skips update when status already 34
StepRequestNotes
1 · CSRF GET https://tef.gov.bw/rest/session/token Sent as X-CSRF-Token
2 · Admission POST …/api/post/studentadmissions?_format=hal_json application/hal+json · HTTP Basic (credentials not published)
Entity type[].target_id = program_of_study Fields: title, id, surname, firstname, institution, institution_program_code, program_name, program_duration, start/completion dates, entry_level, cost
Duplicate Duplicate Student Admission! Treated as non-fatal → status 32

Full field map and Raisd security notes: botswana-dtef-scholarship-sync.md. Legacy deep-link: dtef-scholarship-sync.html → this section.

5. Physical ERD (cmsbotswana)

Logical view of real MySQL tables from the Botswana structure dump. Not the Raisd canonical model — CAP-53 translates; it does not clone these tables.

Contrast Raisd ERD at ../erd.html. Botswana adds r_scholarshipapp, bots_*, and thicker w_* / acc_*.

5.1 Core student

r_student · programme · semester · module

Same LUCT spine as Cyberjaya; Botswana mirrors via bots_program*.

erDiagram
  r_student {
    int StudentID PK
    string StudentNo
    string LoginActive
  }
  r_stdpersonal {
    int StudentID PK
  }
  r_stdprogram {
    int StdProgramID PK
    int StudentID FK
    int ProgramID FK
  }
  r_stdsemester {
    int StdSemesterID PK
    int StdProgramID FK
    int TermID FK
  }
  r_stdmodule {
    int StdModuleID PK
    int StdSemesterID FK
    int ModuleID FK
  }
  bots_program {
    int ProgramID FK
  }
  r_student ||--|| r_stdpersonal : StudentID
  r_student ||--o{ r_stdprogram : StudentID
  r_stdprogram ||--o{ r_stdsemester : StdProgramID
  r_stdsemester ||--o{ r_stdmodule : StdSemesterID
  r_stdprogram }o--|| bots_program : Botswana_mirror
          

5.2 Admissions & offer

app_* → offer → student

app_applicationform, docs, eligibility, r_stdofferletter*.

erDiagram
  app_applicationform {
    int ApplicationID PK
  }
  app_docfile {
    int ApplicationID FK
  }
  app_eligibilityletter {
    int ApplicationID FK
  }
  r_stdofferletter {
    int StudentID FK
    int ApplicationID FK
  }
  r_student {
    int StudentID PK
  }
  app_applicationform ||--o{ app_docfile : ApplicationID
  app_applicationform ||--o{ app_eligibilityletter : ApplicationID
  app_applicationform ||--o| r_stdofferletter : ApplicationID
  r_student ||--o{ r_stdofferletter : StudentID
          

5.3 Finance & DTEF scholarship queue

Assist billing vs TEF admission queue

b_stdassist* for campus finance; r_scholarshipapp for gov POST.

erDiagram
  r_student {
    int StudentID PK
    string StudentNo
  }
  r_stdprogram {
    int StdProgramID PK
    int StudentID FK
  }
  b_stdassistprog {
    int AssistProgID PK
    int StdProgramID FK
    int AssistProviderID FK
  }
  b_stdassistsem {
    int AssistProgID FK
    int StdSemesterID FK
  }
  r_assistprovider {
    int AssistProviderID PK
    string AssistProviderCode
  }
  r_scholarshipapp {
    int schctr PK
    int applicationid
    string IDNumber
    string app_status
    double programCost
  }
  r_student ||--o{ r_stdprogram : StudentID
  r_stdprogram ||--o{ b_stdassistprog : StdProgramID
  b_stdassistprog ||--o{ b_stdassistsem : AssistProgID
  r_assistprovider ||--o{ b_stdassistprog : AssistProviderID
  r_student ||--o{ r_scholarshipapp : "IDNumber=StudentNo"
          

5.4 Accommodation, welfare & portal

acc_* · w_* · portal_*_botswana

Thicker student-life schema than Sierra Leone; campus-suffixed portal sync tables.

erDiagram
  r_student {
    int StudentID PK
  }
  acc_dorm {
    int DormID PK
  }
  acc_occupant {
    int OccupantID PK
    int StudentID FK
  }
  w_visa {
    int StudentID FK
  }
  w_insurance {
    int StudentID FK
  }
  portal_r_student_botswana {
    int StudentID FK
  }
  r_student ||--o{ acc_occupant : StudentID
  acc_dorm ||--o{ acc_occupant : houses
  r_student ||--o{ w_visa : StudentID
  r_student ||--o{ w_insurance : StudentID
  r_student ||--o| portal_r_student_botswana : sync
          

6. Data-flow diagrams (DFD)

How data moves between external actors, Botswana desks, cmsbotswana, nightly botsbatch, and TEF.gov.bw.

6.1 Context diagram (Level 0)

External entities ↔ Botswana CMS

Staff desks + thin student/lecturer UIs share one SoR; TEF is outbound only.

flowchart TB
  APPLICANT([Applicant / agent])
  STUDENT([Student])
  LECTURER([Lecturer])
  STAFF([Registry · Faculty · Bursary · Services])
  TEF([tef.gov.bw / DTEF])
  CMS[["Botswana CMS
PHPMaker desks + cmsbotswana"]] APPLICANT -->|application / docs| CMS STAFF -->|operational writes| CMS STUDENT -->|self-service reads / confirms| CMS LECTURER -->|marks / attendance| CMS CMS -->|invoices / letters / portal data| STUDENT CMS -->|HAL+JSON admissions| TEF TEF -.->|approval outcomes 34/35| CMS

6.2 Admissions → registry

Online / staff app → offer → enrol

SPs: AfterInsertApplicationForm, FetchOnlineApplication*, confirmReg.

flowchart LR
  EXT([Applicant]) --> MKT[Marketing desk]
  MKT --> APP[(app_applicationform*)]
  APP --> REG[Registry desk]
  REG --> OFF[(r_stdofferletter*)]
  REG --> STU[(r_student / r_stdprogram)]
  STU --> FAC[Faculty structures]
  STU --> BUR[Bursary fee plan]
          

6.3 Academic term

Structure → modules → results

GetTimetable, StudentConfirmModule, release-result triggers.

flowchart LR
  SET[Setup / Faculty
term · bots_structure*] --> ENR[(r_stdmodule)] ENR --> TT[Timetable / attendance] ENR --> LEC[Lecturer marks] LEC --> RES[(results / transcript views)] RES --> REP[Reporting]

6.4 Finance + DTEF / TEF

Two money-related paths

Bursary ledger vs Registry TEF admission POST.

flowchart TB
  STU[(r_student)] --> BUR[Bursary desk]
  BUR --> LED[(b_payment / receipt / assist*)]
  LED --> VIEW[[dtef_scholarship view]]
  STU --> REG[Registry scholarship desks]
  REG --> QUEUE[(r_scholarshipapp)]
  QUEUE -->|status 31 POST| TEF([tef.gov.bw])
  TEF -.->|34/35| QUEUE
  BATCH[[botsbatch SQL]] -.-> LED
  BATCH -.-> STU
          

6.5 Batch & portal hooks

botsbatch + api_* / portal_*_botswana

Ops scripts (not committed) refresh portal/exam/registry/bursary slices; api_student_* SPs feed external clients.

flowchart LR
  BATCH[[botsbatch
portal · registry · bursary · exam]] --> DB[(cmsbotswana)] DB --> API[["api_student_* / api_faculty_*"]] DB --> PORT[(portal_*_botswana)] API -.-> EXT([Future Portal API / M5]) PORT -.-> EXT

7. Database — tables, procedures, triggers & views

Derived from cmsbotswana structure dumps (CMS_Botswana_Tables|Procedure|Triggers|Views_24_09_2026.sql. Legacy URL database.html redirects here.

713 tables 46 SPs 15 functions 157 triggers 407 views

Stored procedures (46) — highlights

ProcedureDomain
api_student_login_infoPortal API — student login
api_student_module_infoPortal API — modules
api_student_program_infoPortal API — programme
api_student_semester_infoPortal API — semester
api_faculty_list / api_faculty_program_listPortal API — faculty
AfterInsertApplicationForm / FetchOnlineApplication*Admissions — online app
b_Update_billing / b_Update_StudentFinance — billing
confirmReg / GetTimetable / r_Update_SemesterRegistry / academic
getSCholarshipStatus (function)Assist / DTEF status helper

Full list (46 procedures + 15 functions): _proc-catalog.txt

Views (407)

Large reporting forest — finance statements, attendance, transcripts, population, accommodation.

Machine extract: _view-catalog.txt

Domain table signals

SignalApprox.Examples
Temp / scratch~159temp_*, tmp_*, one-off billing copies
r_* student~110r_student, r_stdmodule, r_scholarshipapp
f_* academic~74f_program, f_module, attendance / results
w_* welfare / visa / acco~49w_visa, w_insurance, w_occupant
b_* finance~42b_payment, b_receipt, b_assistbilling*
app_* admissions~21app_applicationform, app_docfile
bots_* local structs~11bots_program, bots_stdPortal
portal_*6portal_r_student_botswana, …

Full table list: _table-catalog.txt · Triggers (157 — heavy on r_student*, app_*, finance, accommodation): _trigger-summary.txt

CAP-53 note

Botswana confirms a third live LUCT schema in the same product family, with campus-suffixed portal tables and api_* procedures. Portal API campus configuration (CAP-53) must stay campus-keyed; do not assume Cyberjaya table names or SP signatures match 1:1.

8. Raisd mapping

Desks vs portals

Portals never talk to campus MySQL; Portal API / ACL is campus-keyed (CAP-53).

flowchart TB
  subgraph BW["LUCT Botswana CMS"]
    DESKS[Registry · Faculty · Bursary · Marketing
Lecturer · Services · Accommodation · Setup · Reporting] DB[("cmsbotswana")] DESKS --> DB DESKS -.->|DTEF POST| TEFext[tef.gov.bw] end subgraph Raisd["Raisd — M5+"] API[Portal API] AP[Applicant] SP[Student] LP[Lecturer] ST[Staff] AP --> API SP --> API LP --> API ST --> API API -.->|"campus-keyed"| DB end
TopicGuidance
Launch SoRCyberjaya remains ADR-1. Botswana is expansion reference.
Closest sisterSame LUCT desk tree and app_* as Cyberjaya — cleaner ACL transfer than Sierra Leone EMS.
DTEF / TEFCampus feature flag + secret store; Portal API must own any future TEF client (never browser → TEF).
CAP-48Scholarships — SoR today is registry + bursary; student portal read-only awards later.
Accommodation / welfareThicker w_* / acc_* than Sierra Leone — may need earlier staff-portal surfaces for Botswana.

Full three-campus matrix: §9 Campus comparison.

9. Comparison — Cyberjaya · Botswana · Sierra Leone

All-aspect matrix of the three inventoried campus dumps. Botswana sits between Cyberjaya (fullest LUCT SoR) and Sierra Leone (thinner EMS / ac_* shape) — closest sister to Cyberjaya, with a unique government TEF integration.

Cyberjaya = ADR-1 SoR Botswana = LUCT sister + TEF Sierra Leone = EMS / M5 pattern

Where each campus sits

Product family vs launch role.

flowchart LR
  subgraph Family["Same product family"]
    CYB["Cyberjaya
cmscbj · LUCT · app_*"] BWA["Botswana
cmsbotswana · LUCT · app_*"] SLE["Sierra Leone
ems_sierraleone · EMS · ac_*"] end CYB -->|closest sister| BWA CYB -.->|same EMS roots
different admissions prefix| SLE CYB ==>|ADR-1 launch SoR| LAUNCH([Raisd portals]) BWA -.->|M5 expansion| LAUNCH SLE -.->|M5 expansion| LAUNCH BWA -->|TEF.gov.bw| GOV([DTEF government])

9.1 Identity & role

AspectCyberjayaBotswanaSierra Leone
Package date23 Sep 202624 Sep 202623 Sep 2026
Databasecmscbjcmsbotswanaems_sierraleone
Campus / brand code[MYS-CYB][BWA-GBE] · CMS 0.9aICA Sierra Leone EMS
Product familyLUCT CMS / PHPMakerLUCT CMS / PHPMakerEMS / PHPMaker (same roots)
Desk pathcyberjaya/campus/<desk>botswana/campus/<desk>sierraleone/<desk>
ADR-1 launch SoRYesNo — M5 expansionNo — M5 expansion
Pages hubold-cms/old-cms-botswana/old-cms-sierra-leone/

9.2 Scale & technology

AspectCyberjayaBotswanaSierra Leone
Tables (structure)~1,942713 (~554 non-temp)345 (~156 non-temp)
Stored procedures~31846 (+15 functions)6
Triggers~23915791
ViewsLarge4079
Laravel add-onsPayment + ICU PDPANot in dumpNot in dump
Live class / streamingAdobe Connect + classroom linkNot highlighted in dumpNot in dump
Batch / opscyberbatch + scriptsbotsbatch (SQL + logs)sleonebatch empty in package
Approx. desk PHPLargest estate~5.7k under campus~1.7k PHP desks

9.3 Desks / modules

Capability areaCyberjayaBotswanaSierra Leone
Registry / student masterregistry/registry/ (~894)registry/
Faculty / academicfaculty/faculty/academic/
Bursary / financebursary/ + Laravel paymentbursary/finance/
Marketing / admissions opsmarketing/marketing/applicationcenter/
Lecturerlecturer/ · lec/lecturer/Inside academic desks
Student services / affairsservices/ (EMGS/KDN/SSD)services/ (w_*)studentaffair/ (sa_*)
Accommodationaccommodation/accommodation/ + w_*Thin / not a full desk
AQA / curriculumcdu/cdu/Setting / academic mix
Compliance / PDPAicu/ · Laravel icupdpaNot a dedicated dump deskNot in dump
Reportingreporting/reporting/reports/
Setup / settingscmsadminsetup / setup deskssetup/ (~756)setting/
Student self-serviceMultiple (stdfile, SIU, …)Thin student/ (~38)Portal extracts only

9.4 Domain data model

AspectCyberjayaBotswanaSierra Leone
Admissions tablesMostly app_*Mostly app_*Mostly ac_*
Student spiner_student → programme → semester → moduleSame + bots_* mirrorsSame r_* / f_* spine
FinanceRich b_* + payment appb_* + assist / DTEF billingb_* + loans; 6 calc SPs
Welfare / visaLarge EMGS/KDN forestThick w_* (~49)Small sa_* (~3)
Local campus structsCyberjaya-specific tablesbots_* (~11)Fewer campus-only structs
Portal sync tablesportal_*_cyberjayaportal_*_botswana (6)Not in dump
Temp / scratch shareHigh (dump includes history)~159 temp/scratch~189 temp/scratch

9.5 Functional capabilities

CapabilityCyberjayaBotswanaSierra Leone
Online / staff applicationsPresent (app_*)Present (app_* + online SPs)Present (ac_*)
Offer lettersPresentPresentPresent (RTF variants)
Timetable / attendance / resultsFull faculty + lecturerPresent (+ IH mirrors)Present (academic desk)
Invoices / payments / statementsFull + Laravel paymentFull b_*Full b_* + loans
Scholarships / assistBursary incentives / assistAssist + TEF.gov.bw POSTAssist calc SPs; no gov API
Government integrationEMGS/KDN/eIPTS reportingDTEF → tef.gov.bw HAL APINot found in dump
AccommodationFull deskFull desk + w_occupantThin
Visa / insuranceServices (rich)Services w_*Student affairs sa_*
Portal / API proceduresapi_student_* + portal tablesSame pattern (*_botswana)Not in dump
Nightly batch gatingportal.sql LoginActive rulesbotsbatch portal/registry/…Empty batch folder

9.6 External integrations

IntegrationCyberjayaBotswanaSierra Leone
National financing portal—tef.gov.bw student admissions—
Immigration / study permit opsEMGS / KDN heavyw_visa / welfaresa_studentvisa
Online classroomAdobe Connect / streaming host——
Payment gateway appLaravel payment/——
Raisd Portal API readinessHighest (launch ACL)High (same hooks, campus suffix)Lower (no api_* in dump)

9.7 Raisd / M5 implications

TopicCyberjayaBotswanaSierra Leone
Launch postureSoR for portals (ADR-1)Do not treat as launch SoRDo not treat as launch SoR
ACL transferBaselineCleanest sister (app_* + portal hooks)Expect ac_* mapping + thinner SPs
CAP-53 campus key*_cyberjaya*_botswana / bots_*New campus key when onboarded
Feature flags neededCore productTEF client · thick housing/welfareAdmissions prefix · loans
Staff portal priority extrasEMGS / payment / PDPA opsDTEF queue · accommodation earlierApplication centre shape
Inventory docsold-cms-cyberjaya.mdold-cms-botswana.mdold-cms-sierra-leone.md
Verdict. Botswana is the closest dump to Cyberjaya for M5 pattern matching (same LUCT desk tree and app_* admissions, portal api_* hooks present). Sierra Leone proves EMS portability with a different admissions prefix and a much smaller SP/view surface. Only Botswana evidence-backed government scholarship admission sync is tef.gov.bw — keep it campus-flagged. CAP comparison detail (Cyberjaya-focused): old-cms/comparison.html · SDD-14.