# Verification record — ls/rsl/individual-income-tax-return@1.0.0

GOV-4755 ("GovSchema Standard Research"). Per the prior cycle's own recommendation ([[gov4748-ls-obfc-opens-98th-backlog-exhausted]]), this cycle deepened Lesotho's remaining verticals rather than scouting yet another new jurisdiction, since the GOV-4748 cycle found the registry's other recently-banked backlog candidates (Hungary Business Formation, Tunisia DMV, Morocco's four remaining verticals, North Macedonia Visa, Georgia's own disclosed backlog) all re-confirmed dead or weak on independent re-check.

Screened Lesotho's Ministry of Home Affairs channels first: passport issuance (`homeaffairs.gov.ls/passports/`) is confirmed in-person/biometric-only with no downloadable application form (matching this registry's own established in-person-only pattern, e.g. Czechia/Georgia); the National ID (NICR) department publishes no downloadable form either; the ministry's own e-VISA service is stated as "currently suspended" on its own FAQ page. All three left as soft dead ends for a future cycle, not hard-confirmed (a genuine live-form re-check would need a different search angle or real-browser confirmation). Pivoted to Revenue Services Lesotho (RSL, the tax authority, formerly the Lesotho Revenue Authority), which publishes a large, unauthenticated "Forms & Instructions" library directly on its own domain.

## Reaching the live source

Fetched directly: `https://www.rsl.org.ls/sites/default/files/2024-07/Individual%20Income%20Tax%20Return%202023%20%281%29.pdf`, HTTP 200, `Content-Type: application/pdf`, `Content-Length: 373694` (byte-identical to the downloaded file), `Last-Modified: Mon, 22 Jul 2024 10:36:15 GMT`, sha256 `ed5366829b61bbbc0f8ff757be43155f03daa7c04b1ec3ed92b140140e28ea3a`, no login/CAPTCHA/WAF gate — linked directly from `https://www.rsl.org.ls/forms-and-instructions` under "Income Tax Forms", alongside the same-family Company Income Tax Return, FBT Return, and Trusts/Estates return (each a separate future-cycle candidate). Form S128-I is the individual (not company) return, corroborated independently by a public search result citing the same form number and confirming it is available "through the Interim E-filing Solution in E-Services" as well as this direct download.

## Extraction method

`pdfjs-dist` (`/tmp/node_modules/pdfjs-dist/build/pdf.js`, non-legacy CJS build). `getDocument().promise` reports 8 pages; `getAnnotations()` returns zero annotations on every page, confirming a flat, non-fillable PDF with no AcroForm/XFA fields (this registry's established flat-PDF pattern). `getTextContent()`'s raw item stream was **not** trusted on its own this cycle: page 1's text layer, read literally, listed nine items under "2. Unreimbursed employment-related expenses and donations" (`a`, `b`, `b`, `c`, `d`, `c`, `d`, `f`, `g`) where the printed form has exactly seven (`a`-`g`), including a spurious extra line ("d. Other unreimbursed work expenses") not present anywhere in the rendered page and a genuinely present line ("e. Home office expenses") entirely absent from the text-item stream. This is a new, sixth distinct PDF-extraction failure mode for this registry (see `gov-form-pdf-extraction`): duplicated/extraneous ghost text co-resident with the real content in the same text layer, rather than merely out-of-order or checkbox-only scrambling. Resolved by rendering every page used in this schema (`node-canvas` at 2.5x scale) and reading the visual layout directly, cross-checking every field against the rendered image rather than the text layer alone.

## Scoping decision

The source form is a genuinely large 8-page return covering six income categories (employment, pension, business, commercial farming, property, other) plus a foreign-tax-credit schedule. Following this registry's established main-form-now/companion-schedules-later precedent (e.g. `kz/*` Form 220.0X/250.0X series, `tn/dgi/irpp-declaration`), this v1.0.0 schema is scoped to the **core declaration** that a typical employee/pensioner taxpayer completes in full:

- **Your Details** (residency status, identity, contact).
- **Part A — Employment Income & Expenses** (up to 3 employers, up to 3 unemployment periods, the 7-item unreimbursed-expense schedule, chargeable employment income).
- **Part B — Pension Income** (up to 2 pension payers, chargeable pension income).
- **Part H — Tax Computation** (the chargeable-income summary grid, the four tax-bracket rows, credits, payments, and the resulting tax due/overpaid).
- **Declaration of Paid Preparer** and **Declaration of Taxpayer or Representative**.

**Parts C (Business Income & Expenses), D (Commercial Farming Income & Expenses), E (Property Income & Expenses), F (Other Income & Expenses), and G (Credit for Foreign Tax Paid)** are out of scope for this version. Each is a structurally self-contained parallel schedule (Lesotho-source / foreign-source / chargeable columns, its own net-profit-or-loss and loss-carryforward computation) affecting a minority of individual filers; modeling all five in full would roughly double this schema's field count for comparatively rare use. Part H's own summary lines referencing these parts (1c-1f, 5b) are still modeled as pass-through optional numeric fields — a taxpayer with such income can still record the schedule's final total even though this schema does not yet walk through how that total is derived — each field's own description discloses which deferred part it corresponds to. This mirrors this registry's Tunisia IRPP precedent of keeping the summary/computation grid while deferring the detailed per-category build-up schedules.

## Disclosed findings and interpretation choices

1. **Item 2's correct a-g ordering was recovered by visual rendering, not the text layer** — see "Extraction method" above. The rendered image confirms: a. Travel; b. Education; c. Technical/trade books and subscriptions; d. Motor vehicle; e. Home office; f. Superannuation contributions; g. Donations to the Lesotho Sports and Recreation Commission — matching the printed "2h... (2a+2b+2c+2d+2e+2f+2g)" seven-term total formula exactly.
2. **Part B precedes Part C in the printed layout**, even though a naive linear read of page 2's raw text item stream (without position-sorting) surfaces Part C's content before Part B's — confirmed from the rendered page image, where Part B (Pension Income) is the first block and Part C (Business Income & Expenses, out of scope) begins roughly halfway down the same page.
3. **Employer/pension-payer slots are bounded to the form's own printed capacity** (3 employer rows in Part A, 2 pension-payer rows in Part B, 3 unemployment-period rows in Part A), matching this registry's established bounded-slot convention; each section's own printed instruction ("if more than three employers, attach a list with the additional information", "if more than two pension payers, attach a list with additional information", "if more than threesuch periods, attach list with the additional information") is modeled as a corresponding optional `documents[]` entry rather than a synthetic overflow field.
4. **`residencyStatus` is modeled as a required enum** (`resident`/`non-resident`/`part-year-resident`) from the form's own single "Tick applicable box" instruction with three named options; `partYearResidentDays` is `requiredWhen residencyStatus equals "part-year-resident"`, matching the form's own "enter number of days you were a resident" instruction printed directly beside that option only.
5. **Line 7 ("7. Total tax after")** is transcribed verbatim from the source, which prints this label with no further qualifier (the phrase "Total tax after" is not completed with "credits" or similar in the published PDF) — likely a publishing truncation in RSL's own document, not a rendering artifact on this schema's part (confirmed present identically in both the text layer and the rendered image). The field's own description clarifies the value is total tax after non-refundable credits (line 4 minus line 6), inferred from the surrounding arithmetic (line 6 "Total non refundable credits" immediately precedes it, and line 8 "Payments" immediately follows, consistent with a "tax after credits, before payments" position in the return's own flow), while disclosing the verbatim label as printed per this registry's source-fidelity convention.
6. **Row 3a's flat 10% bracket applies specifically to chargeable commercial farming income** (Part H's own "line 1d on this part"), a genuine Lesotho tax-policy fact (a concessional flat rate for farming income ahead of the progressive brackets applied to the rest of chargeable income in rows 3b-3d) rather than an extraction ambiguity — each tax-bracket row's field description transcribes the form's own conditional branching (by residency status and, for the 20%/30% brackets, taxpayer age) verbatim, but this schema does not attempt to encode that branching as executable `crossFieldValidation`, matching this registry's established practice of deferring a source's own complex conditional tax-law computation to prose description rather than modeled logic (see the Tunisia IRPP precedent's own deferred minimum-tax-floor computation).
7. **Signature fields are not modeled** (only `paidPreparerDate`/`declarationDate`, the accompanying dates), consistent with this registry's standing convention that a physical/wet signature is not a machine-fillable data field.
8. **`representativePhone` is left unconditionally optional, not `requiredWhen`-gated on `representativeFullName`** — the source has no separate yes/no checkbox for "signing on behalf of a legally incapacitated person," so gating `representativePhone`'s requiredness on another optional string field being non-empty would reproduce this registry's own documented `notEquals`-empty-string-against-an-absent-field anti-pattern (`notequals-empty-string-absent-field-bug`); disclosed in the field's own description instead.
9. **Two `crossFieldValidation` rules assert Part H's own copied-forward totals equal their Part A/Part B source values** (`taxComputationChargeableEmploymentIncome` = `chargeableEmploymentIncome`; `taxComputationChargeablePensionIncome` = `chargeablePensionIncome`), reflecting the form's own internal consistency requirement (the filer transcribes the same number into a second box) — Part H's remaining summary lines referencing deferred Parts C/D/E/F/G (1c/1d/1e/1f/5b) have no such cross-check since this schema does not model those parts' own totals.

## Conformance

6 mock scenarios exercised against an ephemeral, from-scratch conformance checker (deriving required/`requiredWhen`/`crossFieldValidation` rules directly from this schema's own `fields[]` and `crossFieldValidation[]`, discarded after use, not committed): (1) a full-time resident employee with a single employer, 0 errors; (2) the same taxpayer as a part-year resident with `partYearResidentDays` supplied, 0 errors; (3) the same part-year-resident scenario with `partYearResidentDays` omitted, correctly raising exactly 1 `requiredWhen` error; (4) an employer record with `employer1EmployedUntil` before `employer1EmployedFrom`, correctly raising exactly 1 `crossFieldValidation` error; (5) a Part H `taxComputationChargeableEmploymentIncome` value deliberately mismatched against Part A's own `chargeableEmploymentIncome`, correctly raising exactly 1 `crossFieldValidation` error; (6) a pensioner-only scenario (no employment income), 0 errors.

Validated clean with `node tools/validate.mjs` and `node tools/validate-ajv.mjs` (ajv 2020-12, v0.3 meta-schema), individually and as part of the full registry run. `registry-index.json` regenerated via `npm run build-index` in `tools/govschema-client/`.
