# uni.africa legal pages (P1.20)

Static, self-contained HTML — `privacy.html`, `terms.html`, `index.html` — meant to deploy
alongside the marketing site at `uni.africa/legal/`. The app's registration consent checkbox
and the `landing/index.html` footer link here. No build step, no external requests, inline CSS
only, matching the main landing page's own "zero external assets" approach (see
`../README.md`).

## Source material — read this before editing

The work order for this deliverable pointed at `docs/corpus/uni_africa_privacy_policy.txt` and
`docs/corpus/uni_africa_terms_of_service.txt` as the source text to render faithfully. **Neither
file exists in the corpus** (checked again on 12 July 2026 by filename, case-insensitively,
across the whole repo — no `.txt`, `.docx`, or any other extension of either file is present
anywhere in this tree). `docs/corpus/` contains five documents, none of them a privacy policy or
ToS:

- `uni_africa_dpia.txt` — Data Protection Impact Assessment (Mar 2026)
- `uni_africa_prd.txt` — Product Requirements Document (Mar 2026)
- `uni_africa_system_spec.txt` — System Specification (Mar 2026)
- `uni_africa_realization_plan.txt`
- `uni_africa_gtm_strategy.txt`

This is a corpus gap, not a naming mismatch — the project's own memory notes already track
"corpus defects" as an open issue (budget workbook, pitch deck) alongside this repo's build
plan; the missing legal-text files are the same category of problem. Rather than block on it,
or invent generic SaaS boilerplate and label it "faithful," these two pages were **compiled
from the real facts that do exist** across the corpus and the governing spec, organised into the
shape a privacy policy and ToS need:

| Section | Primary source |
|---|---|
| Data categories, purposes, lawful basis, retention, DPO, cross-border transfers | `docs/corpus/uni_africa_dpia.txt` |
| Right to erasure mechanics (soft-delete → 30-day hard delete → AI-log pseudonymisation at 90 days) | `spec/uni-africa-final-spec.md` §11, §14.3; `docs/corpus/uni_africa_system_spec.txt` §14.3 |
| Security posture (argon2id, JWT lifetimes, TLS 1.3, LUKS, SQLCipher, rate limits) | `spec/uni-africa-final-spec.md` §11 |
| AI tutor no-PII-in-prompt invariant, offline queueing, feedback/moderation | `spec/uni-africa-final-spec.md` §8 |
| Age gate (18+), free/paid boundary (first module free per course), certificates (100% + ≥70% pass) | `spec/uni-africa-final-spec.md` §3; `docs/corpus/uni_africa_prd.txt` §4.2/§4.4 |
| Sub-processors (Flutterwave, Africa's Talking, Anthropic, Hetzner/Cloudflare) | `docs/corpus/uni_africa_system_spec.txt` §15 |
| Refund rule (14 days / <20% completed) — this is **ToS §6.3** by design, matching the exact cross-reference `spec/uni-africa-final-spec.md` §10 already makes ("per ToS §6.3") | `spec/uni-africa-final-spec.md` §10; `docs/corpus/uni_africa_prd.txt` §4.8 |
| Pricing *mechanism* (free tier / Pro subscription / a-la-carte / institutional) without a hardcoded price | `docs/corpus/uni_africa_gtm_strategy.txt` §5 and `spec/uni-africa-final-spec.md` §10 disagree on the actual pilot price ($4/mo vs a locked founding-member ≈$2/mo) and `spec/uni-africa-final-spec.md` §19 lists the final price as an open, founder-owned question — so neither page states a dollar figure; both point to checkout as the source of truth |

`spec/uni-africa-final-spec.md` is this repo's governing document ("Precedence... this spec →
build plan → realization plan → PRD → system spec v1.0") and took precedence wherever it
disagreed with the older March-2026 corpus (it explicitly does, on several points — see its own
§20 "Deviation ledger"). In particular: **the age gate is 18+, not 13+** — the older DPIA/PRD
discuss a 13–17 tier with parental consent, but `spec/uni-africa-final-spec.md` §20 explicitly
records that as deferred ("13–17 access deferred (18+ gate) — DPIA updated to match"), and the
`backend/internal/auth` package enforces `minAge = 18` in code. Getting this wrong in the public
Privacy Policy / ToS would misstate who the platform actually admits — double-check this specific
point first if these pages are ever regenerated from an older source.

## What is a placeholder, on purpose

A handful of facts in `spec/uni-africa-final-spec.md` itself are still open questions (§19), and
the pages say so in place rather than inventing an answer:

- **Legal entity name, registration number, registered address** — §19 open question #1
  ("Kenyan entity vs home entity + registration... Founder + counsel... Blocking: Wave 0") is
  not resolved yet. Both pages refer to the operator as "uni.africa" and flag the formal entity
  block as pending. Don't assert a specific entity name (e.g. "uni.africa Ltd") as settled fact
  until that question actually closes.
- **DPO name and direct contact** — the DPIA itself only has `[Name, email]` as a placeholder
  (`docs/corpus/uni_africa_dpia.txt`, end of §6). Carried forward as a placeholder here rather
  than fabricated.
- **Governing-law jurisdiction (ToS §14)** — Kenya is used as the working assumption (it's the
  launch market and the jurisdiction the ODPC/Kenya DPA registration work is built around), but
  this is explicitly downstream of the same open entity question.
- **Liability/disclaimer language (ToS §13)** — flagged in-page as needing dedicated counsel
  attention; liability caps are jurisdiction- and consumer-law-sensitive in a way this exercise
  shouldn't guess at.

## Before public launch

**These pages must be reviewed and approved by qualified legal counsel before they are treated
as a live, binding Privacy Policy / Terms of Service**, per `spec/uni-africa-final-spec.md` §11
("privacy policy + ToS live at `uni.africa/legal` before beta") and §17 (v0.5 definition of done:
"legal pages live"). Until that review happens, both pages carry a visible "Draft — not yet in
effect" notice and a `<meta name="robots" content="noindex">` tag — don't remove either as part
of an unrelated content edit; removing them is itself a launch-readiness decision, not a copy
fix, and neither page should be described as "live" anywhere (docs, commit messages, status
notes) until it actually has been reviewed and approved.

Suggested review checklist for counsel:
- [ ] Confirm/replace the registered-entity placeholder once Wave 0's entity decision lands.
- [ ] Confirm ToS §14 governing law once the entity jurisdiction is final.
- [ ] Replace ToS §13's disclaimer/liability paragraph with counsel-drafted language for each
      launch market's consumer-protection law.
- [ ] Confirm the DPIA's sub-processor list (§15 of the system spec) still matches production
      before publishing — this draft reflects the spec, not a vendor-contract audit.
- [ ] Confirm final pricing language (ToS §5) reads correctly once pilot pricing is locked
      (`spec/uni-africa-final-spec.md` §19, open question #2).
- [ ] Re-confirm the 18+ age gate (see above) hasn't drifted from `backend/internal/auth`'s
      actual enforced `minAge` before publishing.
- [ ] Remove the "Draft — not yet in effect" notice and `<meta name="robots" content="noindex">`
      tag from all three pages only once approved.

## Local preview

```sh
cd landing/legal
python3 -m http.server 8000
# open http://localhost:8000/
```

## Deploying

Ship alongside the rest of `landing/` (see `../README.md`) — same static host, same "upload the
files, no build step" model. `index.html`, `privacy.html` and `terms.html` all need to go out
together; `README.md` (this file) doesn't need to ship.
