# Verification record — sz/ers/return-of-income-individual@1.0.0

GOV-4790 ("GovSchema Standard Research"). GOV-4783 opened Eswatini as the registry's 99th jurisdiction via the Elections and Boundaries Commission's Special Voting application (National ID & Civic Documents, 1 of 6), and its own notes flagged the Eswatini Revenue Service's forms library as a live, unauthenticated candidate for a future cycle. This cycle followed up on that lead directly rather than re-scouting: `ers.org.sz` publishes an "IncomeForms" page listing its Domestic Taxes forms; the page is a Next.js app whose form table only renders after JS hydration (plain `curl` returns an empty shell), but row 23, "Return of Income - Individual" (category "Income Tax", 7.85mb, "Individual income tax return"), links a working DOWNLOAD button straight to a PDF with no login/CAPTCHA gate on the file itself.

## Reaching the live source

Fetched directly: `https://www.ers.org.sz:8000/form-files/1713854893090-Individual_Income_Tax_Return_Editable_2022.pdf`, HTTP 200, `Content-Type: application/pdf`, `Content-Length: 8230988` (byte-identical to the downloaded file), `Last-Modified: Mon, 14 Oct 2024 07:35:15 GMT`, sha256 `e4a72dec8907da44956ff527b61fef645efae3b45ad1fa55659fa35719c88b24`. The site's TLS certificate does not validate cleanly (`curl -skI` / `NODE_TLS_REJECT_UNAUTHORIZED=0` is required to reach it) — a genuine certificate misconfiguration on ERS's own port-8000 form-file host, not a bot-block or WAF, and not treated as a reason to distrust the document's own provenance since the URL, content type, and size all corroborate the file linked from the human-facing `IncomeForms` page.

## Extraction method

`pdfjs-dist` (`/tmp/node_modules/pdfjs-dist/legacy/build/pdf.js`) reports 11 pages. `getFieldObjects()` returns 446 raw field objects, confirming a genuine AcroForm PDF (not flat) — but, matching this registry's now-familiar all-raw-field-names-meaningless pattern (first hit on `ba/purs/annual-income-tax-return`, GOV-4727), almost every field name is a meaningless auto-generated one (`Text2`, `Text7.15`, `Group5`, etc.) with no `/TU` tooltip text to recover a label from. A handful of fields on the Tax Computation page (`BusinessIncome`, `TaxableIncome`, `firstBracket`, `percentage`, etc.) do carry semantic names, suggesting this "Editable 2022" edition of the form had that one section's fields manually renamed by ERS at some point — but the overwhelming majority of the 446 fields remain auto-named, so semantic names could not be relied on in general.

Every field used in this schema was resolved by rendering each of the 11 pages with `node-canvas` (2.2x scale, `standardFontDataUrl` pointed at `pdfjs-dist`'s own bundled `standard_fonts/` directory — omitting it silently produces blank/unrendered glyphs, a distinct node-canvas failure mode from the checkbox-glyph and reading-order issues this registry has hit before), then overlaying each field's own `rect`/page from `getFieldObjects()` as a labeled red box on top of the rendered page image and visually reading which printed label each box sits beside. This let every field be identified unambiguously by position rather than by name, including disambiguating rows within repeating tables (e.g. the 7-row employer table on page 2, where the raw names `Text8.0`, `Text9`, `Text8.1`, `Text8.2`... do not sort in row order and had to be resolved by each widget's own y-coordinate). The PDF's own internal field names are not used anywhere as this schema's field ids.

## Document structure

Page 1: header (Eswatini Revenue Service, Domestic Taxes Department letterhead) and form number "IT 12"; PART A - Taxpayer Particulars (TIN, Tax Year, Surname, Name, Graded Tax Number, Personal ID Number, Residential/Postal Address, Email, Contacts: Work/Home/Cell/Fax, Bank Details, a Yes/No "changed since your last return?" toggle, and a Commission/staff-only "FOR OFFICIAL USE: SME/LTU" box). Page 2: PART B - Statement of Local Assets and Liabilities (lines 1-20, a single-column net-worth schedule); PART C - Statement of Foreign Assets and Liabilities (lines 21-23); PART D - Income from Employment (lines 24-31, a 7-row x 4-column table: employer name, employer TIN, gross amount, tax deducted). Page 3: PART E - Benefits from Employment (lines 32-38); PART F - Allowable Deductions (lines 39-44); PART G - Net Income from Employment (line 45); PART H - Other Receipts and Accruals (lines 46-51, including a 5-row Directors' Fees sub-table). Page 4: PART I - Local Farming, Business, Trade and Professional Income (lines 52-76, a 5-column schedule: Partnership / Rental Income / Business 3 / Business 4 / Business 5, each with its own Turnover, Cost of Sales, and an 18-line expenditure breakdown); PART J - Adjustments: Add Back (lines 77-85, same 5 columns). Page 5: PART K - Adjustments: Allowable (lines 86-89, same 5 columns) plus a partnership Yes/No toggle and profit-share percentage; PART L - Determination of Profit/Loss (lines 90-92, same 5 columns); PART M - Amounts Considered Non-Taxable (lines 93-97); PART N - Tax Computation (lines 98-106, including the two-line "Tax on the first ___ / Tax on the balance of ___ at ___%" bracket computation and the 104A Less Tax Credit sub-block: Primary Rebate, Secondary Rebate, Mortgage Interest, Life Accident Insurance/Provident Fund/Unemployment Insurance). Page 6: "Less Tax Already Paid" (lines 107-111: PAYE, Foreign Tax Credits, Provisional Tax Paid, Tax Withheld) and Tax Due/Refund Due (line 112); PART O - Income Already Taxed/Non Taxable Income (lines 113-119: lump sum receipts, dividend income, interest income, exempt income, foreign source income); DECLARATION (attestation prose, Signature, Date). Pages 7-11 are non-fillable prose: "Guidelines for filling in the Income tax Returns (Individuals) - IT12", walking through each Part, followed by Annexure A (Deemed Foreign Income), the current Rates of Normal Tax table and Rebates notes, and Annexure B (Income Already Taxed/Non Taxable Income) — no additional fillable fields appear on these pages, confirmed both from `getFieldObjects()` (no field rects on pages 7-11) and from rendering them directly.

## Scoping decision

The source form is a genuinely large return: 446 raw AcroForm fields across 11 pages, covering a net-worth statement, employment income, a five-column business/farming/rental income schedule with its own add-back and allowable-adjustment companions, a non-taxable-amounts statement, the tax computation itself, and an already-taxed/non-taxable-income disclosure. Following this registry's established main-form-now/companion-schedules-later precedent (e.g. `ls/rsl/individual-income-tax-return`, `tn/dgi/irpp-declaration`), this v1.0.0 schema is scoped to the **core declaration** a typical single/few-source-of-income employee or pensioner taxpayer completes in full:

- **PART A — Taxpayer Particulars**, including bank details (for any refund) and the "changed since last return" toggle.
- **PART D — Income from Employment.** The source form's own guidelines (page 8) define "employment income" broadly enough to include "pension, superannuation allowance, ... retiring allowance" — this Eswatini form does not break pension income out into its own Part the way Lesotho's S128-I does, so PART D is modeled as covering both.
- **PART E — Benefits from Employment** and **PART F — Allowable Deductions**.
- **PART G — Net Income from Employment**.
- **PART N — Tax Computation**, together with the "Less Tax Already Paid" block and the resulting Tax Due/Refund Due, and the **Declaration**/Signature.

**PART B and PART C** (the Statement of Local/Foreign Assets and Liabilities) are out of scope: this is a net-worth disclosure that is never referenced anywhere in PART N's own tax computation, so it can be deferred cleanly with no pass-through field needed. **PART H** (Other Receipts and Accruals — directors' fees, deemed foreign income, royalties, minor-children income) and **PART I through PART L** (the five-column Local Farming/Business/Trade/Professional Income schedule and its Adjustments/Determination-of-Profit-or-Loss companions) are likewise out of scope, but since PART N's own lines 99 and 100 explicitly copy forward PART H's and PART L's own final totals, this schema keeps `otherReceiptsAndAccruals` and `businessIncomeAggregate` as pass-through optional numeric fields — a taxpayer with such income can still record the schedule's own bottom-line total even though this schema does not yet model how that total is derived. **PART M** (Amounts Considered Non-Taxable) and **PART O** (Income Already Taxed/Non-Taxable Income) are also out of scope: neither is referenced by PART N's own computation, so both are deferred entirely with no pass-through.

## Disclosed findings and interpretation choices

1. **The 7-row employer table (PART D, lines 24-30) is modeled at its own full printed capacity**, not artificially bounded to fewer slots — unlike the Lesotho sibling's 3-employer cap, this Eswatini form itself prints 7 rows with no "if more than N, attach a list" overflow instruction, so this schema follows the form's own printed capacity exactly (this registry's established bounded-slot convention, applied here to a larger bound).
2. **PART D's raw field names do not sort in row order** (`Text8.0`, `Text9`, `Text8.1`, `Text8.2`, `Text8.3`, `Text8.4`, `Text8.5` for the 7 "Name of Employer" cells, in that literal naming sequence) — row assignment was recovered strictly from each widget's own y-coordinate via the rendered-page overlay, not from the names themselves.
3. **PART N's two-line bracket computation (lines 102-103, "Tax on the first ___" / "Tax on the balance of ___ at ___%") is modeled as five separate numeric fields** (`taxOnFirstThreshold`, `taxOnFirstAmount`, `taxOnBalanceOfAmount`, `taxOnBalanceRate`, `taxOnBalanceAmount`) rather than as an executable multi-bracket formula. The source PDF's own fields default to `0` / `0.00` / `20`, consistent with the current Rates of Normal Tax table (Annexure, page 10) whose first bracket (E0–E100,000) is a flat 20% with no fixed base amount — this schema transcribes the form's own two-line manual-computation design (used by the filer to record whichever bracket boundary and rate actually applies) rather than reimplementing Eswatini's four-bracket schedule as `crossFieldValidation`, matching this registry's established practice of deferring a source's own complex conditional tax-law computation to prose description (see the Lesotho sibling's own tax-bracket rows, and the Tunisia IRPP precedent's deferred minimum-tax-floor computation).
4. **`primaryRebate`'s source PDF field carries a live default value of `8,200.00`** (visible in the rendered page even before any values are entered), matching the Rebates note that the Primary Rebate applies to all natural persons; `secondaryRebate` (60+ only), `mortgageInterestCredit` (limited to E2,400, principal private residence only), and `lifeInsuranceCredit` (limited to E360) carry no such default and are modeled as ordinary optional numeric fields with `maximum` set to each rebate's own printed cap.
5. **Three `requiredWhen greaterThan 0` document gates were added for conditional attachments printed directly on the form face**: `courtOrderForAlimony` (PART F line 42, "attach a certified copy of Court Order"), `mortgageInterestSupport` (PART N line 104A, "attach bank statement and proof of residence"), `foreignTaxCreditCertificate` and `taxWithheldCertificate` (Less Tax Already Paid, lines 108 and 110, each printed with its own "attach ..." instruction) — all using the Condition grammar's `greaterThan` operator against a numeric field rather than a boolean/enum gate, since none of these lines has its own separate yes/no tick box. `otherBenefitsSchedule` (PART E line 36, "Other (attach schedule)") is gated the same way; PART F's own line 43 ("Other (Furnish particulars)") uses softer language than "attach schedule" and is not given a document entry, since the form only asks the taxpayer to describe the item, not attach a separate document.
6. **`employerTaxCertificates` (Form PAYE 05/IRP5) is modeled as an unconditionally optional, not `requiredWhen`-gated, supporting document**, since PART D's own printed instruction ("Please refer to form PAYE 05 / IRP5") is a reference note rather than a conditional "attach" instruction tied to a specific field value.
7. **`detailsChangedSinceLastReturn` is modeled as a boolean.** The source PDF's own YES/NO radio-button pair (`Group5`) carries the generic auto-generated export values `Choice1`/`Choice2` rather than semantic strings; boolean `true` is mapped to the YES option (printed first/left of the two, per the rendered page), consistent with reading widget position rather than trusting an auto-generated export-value string.
8. **The "FOR OFFICIAL USE: SME/LTU" box (page 1) and the PART K "Are you in a partnership?" toggle plus profit-share percentage (page 5) are both out of scope** — the first is completed by ERS staff after submission (not an applicant-facing field, matching this registry's standing convention); the second belongs entirely to the deferred PART K business schedule.
9. **Two `crossFieldValidation` rules assert PART N's own copied-forward totals equal their PART D/PART G source values** (`netEmploymentIncomeForTaxComputation` = `netEmploymentIncome`; `payePaid` = `totalEmploymentTaxDeducted`), reflecting the form's own internal consistency requirement that the filer transcribe the same figure into a second box, mirroring the Lesotho sibling's identical pattern.
10. **Signature is modeled as a plain required string field** (not a file/image upload), consistent with this registry's standing convention that a physical/wet signature line on a paper-style form is a machine-fillable data field, not a document attachment.

## Conformance

23 fixtures exercised against an ephemeral, from-scratch conformance checker (deriving `required`/`requiredWhen`/`crossFieldValidation` rules directly from this schema's own `fields[]`, `documents[]`, and `crossFieldValidation[]`, discarded after use, not committed): (1) a full-time single-employer taxpayer with tax due, 0 errors; (2) a 60-and-over pensioner (via PART D, per the form's own broad definition of employment income) claiming the Secondary Rebate with a refund due, 0 errors; (3)/(3b) `otherBenefits > 0` without/with the `otherBenefitsSchedule` document attached, exactly 1 `document-required` error then 0; (4)/(4b) `alimonyOrMaintenancePaid > 0` without/with `courtOrderForAlimony`, exactly 1 then 0; (5)/(5b) `mortgageInterestCredit > 0` without/with `mortgageInterestSupport`, exactly 1 then 0; (6)/(6b) `foreignTaxCredits > 0` without/with `foreignTaxCreditCertificate`, exactly 1 then 0; (7)/(7b) `taxWithheld > 0` without/with `taxWithheldCertificate`, exactly 1 then 0; (8) `netEmploymentIncomeForTaxComputation` deliberately mismatched against `netEmploymentIncome`, exactly 1 `cross-field` error; (9) `payePaid` deliberately mismatched against `totalEmploymentTaxDeducted`, exactly 1 `cross-field` error; (10) an unknown field, exactly 1 `unknown-field` error; (11) each of this schema's 8 `required: true` fields (`tin`, `taxYear`, `surname`, `givenNames`, `personalIdNumber`, `residentialAddress`, `signature`, `declarationDate`) individually mutated to absent against scenario (1), each confirmed to raise exactly 1 `required` error. All 23 fixtures passed.

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 662-document registry run.
