{
  "$schema": "https://govschema.org/spec/v0.3/govschema.schema.json",
  "govschemaVersion": "0.3.0",
  "id": "pg/ica/entry-permit-extension-application",
  "version": "1.0.0",
  "title": "Papua New Guinea Application to Extend Entry Permit",
  "description": "Papua New Guinea's Immigration and Citizenship Authority's (ICA) \"Application to Extend Entry Permit\" — a follow-on/renewal action filed by a non-citizen already in-country on a valid entry permit who wishes to extend their authorised stay, distinct from this registry's sibling pg/ica/entry-permit-application (a first-entry visa application) and pg/ica/passport-application (an ICA travel-document/passport application). GOV-5812's own screening cycle banked this document alongside the first-entry candidate without authoring either; GOV-5819 authored the richer first-entry form to open the Visa vertical, leaving this extension form as disclosed backlog. Models the applicant's personal particulars, marital status, nationality, and passport particulars; the requested extension length and stated reason; the existing entry permit's own particulars (number, type, class, expiry, dates and place of issue, and date of last entry into PNG); the applicant's in-PNG address and contact/email-communication preference; the alternate stay-funding-source checklist; the organisational sponsor/employer block; previous-name/alias and other-passport history; the criminal-conviction and deportation/refused-entry screening questions; and the closing Declaration, including this specimen's own genuine PDF signature (/FT /Sig) field. Companion schema for Papua New Guinea's Visa vertical (3 of 6 verticals open, alongside Business Formation via pg/ipa/business-name-registration, Passport via pg/ica/passport-application, and first-entry Visa via pg/ica/entry-permit-application); does not itself open a new vertical. This document does not file the application itself; the live source is always authoritative. See VERIFICATION.md for the full sourcing record and every disclosed scoping decision. GovSchema is an independent, non-profit standards body; it is not affiliated with, endorsed by, or operated by the Independent State of Papua New Guinea or its Immigration and Citizenship Authority.",
  "status": "draft",
  "jurisdiction": {
    "country": "PG",
    "level": "national"
  },
  "authority": {
    "name": "Immigration and Citizenship Authority",
    "abbreviation": "ICA",
    "url": "https://ica.gov.pg"
  },
  "process": {
    "type": "application",
    "language": "en"
  },
  "source": {
    "url": "https://ica.gov.pg/uploads/media/post_file_2430587-visa-extension-form-new-savable.pdf",
    "retrievedAt": "2026-07-31",
    "documentRef": "\"Application to Extend Entry Permit\", Papua New Guinea Immigration and Citizenship (Service) Authority"
  },
  "verification": {
    "method": "manual-source-review-v1",
    "lastVerifiedAt": "2026-07-31",
    "verifiedBy": "GovSchema Engineering (Standards Engineer)",
    "nextReviewBy": "2027-01-31",
    "notes": "GOV-5826 (\"GovSchema Standard Research\"). GOV-5812's own cycle screened Papua New Guinea's Visa vertical and banked two live, unauthenticated, genuinely rich AcroForm candidates without authoring either: this document's own source (the ICA's own \"Application to Extend Entry Permit\", 123,043 bytes, confirmed 62 widgets across 2 pages — a follow-on/renewal action for someone already in-country) and a richer 102-widget first-entry \"Application for entry permit\" mirrored by the PNG-Japan Society. GOV-5819 authored the richer first-entry candidate, opening the Visa vertical outright as pg/ica/entry-permit-application, and explicitly left this document as unauthored backlog for a future cycle. This cycle authors it as a companion schema, deepening (not opening) Papua New Guinea's Visa vertical.\n\nIndependently re-fetched https://ica.gov.pg/uploads/media/post_file_2430587-visa-extension-form-new-savable.pdf directly via plain curl, twice, to confirm reproducibility: HTTP 200, 123,043 bytes both times (exactly matching the byte count GOV-5812's own banked estimate recorded), sha256 884af8c3b170acf103604899c2dc506189956e2d7d06bd05ec9255496e3c2e1d both times, byte-identical (cmp confirmed). No login, CAPTCHA, or WAF/JS-challenge gate — served directly (content-type: application/pdf) behind a Cloudflare edge cache (cf-cache-status: HIT, age: 145811 seconds at fetch time). Last-Modified: Wed, 30 Oct 2019, a long-standing, stable specimen, not a recent upload. Unlike GOV-5819's own first-entry specimen (served only from a third-party png.or.jp mirror, with the direct ica.gov.pg/immigration.gov.pg path 404ing), this specimen is served directly from ica.gov.pg itself under its own /uploads/media/ path — no mirror needed. This cycle reuses the existing registry/pg/ica/ authority directory and the existing pg/ica/passport-application and pg/ica/entry-permit-application authority block verbatim (name \"Immigration and Citizenship Authority\", abbreviation \"ICA\", url ica.gov.pg); see pg/ica/entry-permit-application's own VERIFICATION.md for the full disclosed authority-naming discussion (this specimen's own page-1 letterhead likewise reads \"PNG Immigration & Citizenship Service Authority\", the same older/alternate name already reconciled there), not re-litigated here.\n\n**Extraction method.** Extracted with pdfjs-dist (vendored install at /tmp/mn-passport/extract/node_modules/pdfjs-dist, CommonJS legacy build): a full getAnnotations() pass per page enumerated every AcroForm Widget (62 total across 2 pages — page 1: 25; page 2: 37), recording each widget's internal field name, PDF field type (Tx/Btn/Ch/Sig), rect (bounding box) position, and (for Btn widgets) checkBox/radioButton flags and exportValue, and (for Ch widgets) the options array; then a getTextContent() pass per page, sorted by descending y then ascending x, to recover reading order. The page-1 \"Days:/Months/Years\" requested-extension-length row and the page-2 DECLARATION paragraph were each independently re-checked with a raw per-glyph x/y re-extraction (narrower y-band, no text joining) to positively confirm reading order before transcribing text into this schema's own field descriptions/documents statement — both confirmed internally consistent (no line-joining/sort-order artifact), unlike this registry's own sibling pg/ica/entry-permit-application, whose DECLARATION paragraph carried a genuine source-specimen typo (\"...true and correct at I have disclosed...\"); this specimen's own DECLARATION paragraph carries no equivalent defect (\"...true and correct, and that I have disclosed...\", confirmed clean by the same per-glyph method). canvas was not available in this environment (checked /tmp/node_modules and every node_modules tree reachable from the working directory; only pdfjs-dist itself was found), so no page was rendered to a PNG; every field mapping was instead confirmed via rect-position/text-position cross-checking, consistent with this registry's established practice — no residual ambiguity required canvas rendering here.\n\n**No printed required/optional signal of any kind exists anywhere on this specimen** (no asterisk, no \"(required)\"/\"(optional)\" caption, confirmed by a full page-by-page text-layer read) — the same constraint pg/ica/passport-application, pg/ica/entry-permit-application, and cd/maeci/visa-application each faced. This schema follows the same policy those three adopted: required only the fields necessary to identify the applicant and the substance of the extension request (full name, date of birth, sex, marital status, nationality, country of birth, passport particulars, the stated reason for extension, every field in the EXISTING ENTRY PERMIT DETAILS block — since an extension application cannot be processed without identifying which permit is being extended, and every one of these fields is a direct transcription off that existing, already-issued permit — the primary in-PNG address line, the Declaration's date and signature, and the two background-screening yes/no questions, since these gate their own conditional detail fields and are the form's own substantive screening questions), and bare-optional for secondary address/phone detail, the stay-funding checklist, and the sponsor block's own secondary contact fields, with every genuinely conditional block gated by requiredWhen wherever the form's own layout or prose states a real conditional relationship.\n\nDisclosed scoping decisions:\n\n1. **This specimen's own \"Signature\" widget is a genuine PDF /FT /Sig field, not a text field or an image-insertion pushbutton.** getAnnotations() reports fieldType: \"Sig\" for this widget (page 2, beside \"Signature of Applicant, Parent or Guardian\"), distinct from every other widget on the form (all \"Tx\", \"Btn\", or \"Ch\") and distinct from pg/ica/entry-permit-application's own two image-insertion pushbutton (Btn, pushButton:true) widgets. Consistent with this registry's established convention for a genuine /FT /Sig field (see tz/immigration/visa-application's own declarationCertification precedent), it is modelled as the applicantDeclaration documents[] entry (category attestation), not a fields[] entry of type file or string.\n\n2. **No photograph widget or box of any kind exists anywhere on this specimen** — a genuine content difference from both pg/ica/passport-application (which requires a photograph per its own printed Instruction 9) and pg/ica/entry-permit-application (which carries a real photograph-insertion pushbutton widget); confirmed by a full page-by-page text-layer and widget-list read finding no \"photograph\"/\"photo\" text or matching widget. No photograph field is modelled for that reason.\n\n3. **Instruction 1 states \"Where the application is in respect of a child under 16 years of age, both parents must sign the application\", but only one Signature widget exists on the entire specimen** — the same genuine content gap pg/ica/entry-permit-application's own VERIFICATION.md discloses for its own, structurally distinct, two-image-widget case. Disclosed rather than invented; applicantDeclaration models the one signature capture point that exists.\n\n4. **Two directly-supplied boolean gates without a backing widget of their own** — hasChangedNameOrAlias and hasOtherPassport — split the same combined page-2 prose sentence pg/ica/entry-permit-application's own VERIFICATION.md discloses (\"If you have ever change your name, are known by an alias, or own another passport, please provide details:\"), preceding the same two visually distinct subsections (PREVIOUS NAMES/ALIAS DETAILS: and OTHER PASSPORTS:) on this specimen. Modelled with the same field names and same split-gate rationale as the sibling schema, for cross-schema consistency.\n\n5. **hasOrganisationalSponsor is a third directly-supplied gate for the ORGANISATIONAL SPONSOR/EMPLOYER block**, which this specimen's own printed heading marks \"(IF APPLICABLE)\" — an explicit textual conditional signal, stronger than pg/ica/entry-permit-application's own inferred-only equivalent (that sibling's own heading carries no \"(if applicable)\" qualifier). organisationalSponsorName and sponsorLotAndSectionNo (this specimen's own PNG-convention street-address-equivalent field, printed as a single combined text box) are gated required when true; sponsorAgentName, sponsorTownVillage, sponsorProvince, sponsorPostalAddress, sponsorTelephone, and sponsorEmail remain bare-optional even within a true branch, consistent with this registry's policy of not over-requiring secondary contact detail absent its own printed signal. Unlike the sibling entry-permit-application's own sponsor block, this specimen's sponsor block carries no separate country field.\n\n6. **The four \"how will you be funding your stay in PNG\" checkboxes (fundedBySalary/fundedByOwnFunds/fundedByCompanySponsor/fundedByFamily) are left entirely ungated (bare-optional, no requiredWhen)**, for the identical reason pg/ica/entry-permit-application's own VERIFICATION.md discloses for its own equivalent checklist: independent, mutually non-exclusive checkboxes with no \"tick one\"/\"at least one\" instruction, and this spec's requiredWhen grammar cannot express an \"at least one of these four\" constraint without overreaching what the form itself states.\n\n7. **previousSex and previousMaritalStatus are genuine Ch (combo-box) dropdown widgets**, each with a blank first option (exportValue \" \") followed by the real choices (F/M for sex; Married/Never married/Divorced/De-facto/Widowed for marital status) — the blank option is not modelled as a valid enum value, and both enums are normalised to the same MALE/FEMALE and MARRIED/NEVER_MARRIED/DIVORCED/DE_FACTO/WIDOWED vocabulary already established by pg/ica/entry-permit-application's own equivalent fields, for cross-schema consistency, rather than preserving the dropdown's own raw single-letter/differently-cased export values verbatim.\n\n8. **The requested-extension-length row (\"Days:\"/\"Months\"/\"Years\" boxes, page 1) sits between its own printed unit labels (y=308.88) and its own caption \"How long do you wish to stay in PNG:\" (y=290.76, printed below the boxes as a caption rather than above as a heading)** — confirmed by a raw per-glyph x/y re-extraction of that row, ruling out any reading-order ambiguity before modelling requestedExtensionDays/Months/Years as three alternative unit boxes joined by \"or\", mirroring pg/ica/entry-permit-application's own identical requestedStayDays/Months/Years pattern.\n\n9. **This specimen's own EXISTING ENTRY PERMIT DETAILS block has no equivalent on pg/ica/entry-permit-application (a first-entry application, with no existing permit to reference)** — entryPermitNumber, entryPermitExpiryDate, dateOfLastEntryIntoPNG, entryPermitType, entryPermitClass, entryPermitIssueDate, and entryPermitPlaceOfIssue are unique to this extension schema, each a direct transcription off the applicant's own already-issued entry permit, and all required per this document's own required-fields policy (paragraph above).\n\n10. **Instruction 3 states \"The completed form and the applicant's passport should be sent to: The Chief Migration Officer, Immigration and Citizenship Service Authority, PO Box 1790, BOROKO NCD, Papua New Guinea\"**, the same wording pg/ica/entry-permit-application's own VERIFICATION.md quotes for its own applicantPassport documents[] entry — modelled identically here (physical passport accompanies the submitted form, distinct from the passportNumber/passportExpiryDate fields[] entries that model the printed particulars).\n\n11. **No application fee of any kind is printed anywhere on this specimen**, confirmed by a full page-by-page text-layer read for \"fee\"/currency-amount mentions finding none — no documents[] payment entry is modelled.\n\n12. **Office-use fields (Date Received/BY/File No./Group/Receipt/ICD Clear/BMS Registered on/Decision/Applicant Notified on, page 1 instruction box) carry no AcroForm widgets of any kind**, confirmed by cross-checking every one of these printed labels against the full 62-widget getAnnotations() list finding no match — excluded in full, consistent with this registry's standard office-use-section treatment.\n\n**Structure.** Models 56 fields[] across 10 steps (3 of the 56 — hasChangedNameOrAlias, hasOtherPassport, hasOrganisationalSponsor — are directly-supplied gates without a backing widget; the other 53 collapse this specimen's own 61 non-signature AcroForm widgets, since 13 widgets across 5 checkbox-group/pair collapses — sex [2→1], maritalStatus [5→1], agreeToEmailContact [2→1], hasCriminalConviction [2→1], hasBeenDeportedOrRefusedEntry [2→1] — each collapse into one enum/boolean field; the 62nd widget, the genuine /FT /Sig Signature field, is modelled as the applicantDeclaration documents[] entry, not a fields[] entry), 2 documents[] entries (the applicant's own physical passport, and the Declaration attestation carrying the genuine Sig-field signature capture point), and no crossFieldValidation rules (this specimen's own passport-particulars block carries only passportNumber and passportExpiryDate, with no separate passportIssueDate to compare against, unlike pg/ica/entry-permit-application's own passportExpiryNotBeforeIssue rule).\n\n2 valid mock scenarios — valid-extension-minimal-no-conditional-history (a minimal applicant exercising the false/absent branch of every one of this schema's 5 conditional gates) and valid-extension-full-conditional-history (an applicant exercising the true branch of all 5 conditional gates simultaneously, including the full organisational-sponsor, previous-name/alias, other-passport, criminal-conviction, and deportation blocks) — plus 14 mutation-control fixtures (7 missing-required fixtures spanning a string, a date, an enum, and a boolean/gate field across different steps; 5 missing-requiredWhen fixtures, one per conditional branch; an invalid-enum-value fixture against maritalStatus; and an unknown-field-rejected fixture) are committed under conformance/pg/ica/entry-permit-extension-application/1.0.0/. An ephemeral, from-scratch conformance checker (deriving required/requiredWhen rules directly from this schema's own fields[], discarded after use, not committed) ran all 16 fixtures: both valid scenarios at 0 errors, all 14 mutation controls each raising exactly 1 error. Validated clean with node tools/validate.mjs and node tools/validate-ajv.mjs, individually and as part of the full registry run.\n\nThis schema is a companion to pg/ica/entry-permit-application, deepening (not opening) Papua New Guinea's Visa vertical (still 3 of 6). DMV and Taxes remain confirmed dead ends per GOV-5812's own screening; National ID and the sibling IPA Form A-2 remain open, unauthored backlog for a future cycle."
  },
  "license": "CC-BY-4.0",
  "fields": [
    {
      "name": "familyName",
      "label": "Family Name",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1, PERSONAL DETAILS — \"Family Name\"",
      "classification": "pii"
    },
    {
      "name": "givenNames",
      "label": "Given Names",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1, PERSONAL DETAILS — \"Given Names\"",
      "classification": "pii"
    },
    {
      "name": "dateOfBirth",
      "label": "Date of Birth",
      "type": "date",
      "required": true,
      "sourceRef": "Page 1 — \"Date of Birth\"",
      "classification": "sensitive-pii"
    },
    {
      "name": "sex",
      "label": "Sex",
      "type": "enum",
      "required": true,
      "description": "Two independent AcroForm checkboxes (\"Sex male\"/\"Sex female\"), collapsed into one enum.",
      "validation": {
        "enum": ["MALE", "FEMALE"]
      },
      "sourceRef": "Page 1 — \"Sex\": Male / Female"
    },
    {
      "name": "maritalStatus",
      "label": "Marital Status",
      "type": "enum",
      "required": true,
      "description": "Five independent AcroForm checkboxes (\"Never married\"/\"Married\"/\"Widowed\"/\"Divorced\"/\"Defacto\"), collapsed into one mutually-exclusive enum.",
      "validation": {
        "enum": ["MARRIED", "DE_FACTO", "WIDOWED", "DIVORCED", "NEVER_MARRIED"]
      },
      "sourceRef": "Page 1 — \"Marital Status\": Married / Never Married / Widowed / Divorced / Defacto"
    },
    {
      "name": "countryOfBirth",
      "label": "Country of Birth",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1 — \"Country of Birth\"",
      "classification": "pii"
    },
    {
      "name": "nationality",
      "label": "Nationality",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1 — \"Nationality\"",
      "classification": "pii"
    },
    {
      "name": "passportNumber",
      "label": "Passport Number",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1 — \"Passport Number\"",
      "classification": "sensitive-pii"
    },
    {
      "name": "passportExpiryDate",
      "label": "Passport Expiry Date",
      "type": "date",
      "required": true,
      "sourceRef": "Page 1 — \"Expiry Date\" (passport row)"
    },
    {
      "name": "requestedExtensionDays",
      "label": "Requested Extension — Days",
      "type": "integer",
      "required": false,
      "description": "One of three alternative unit boxes (Days/Months/Years) joined by \"or\"; only the relevant unit is expected to be completed. See VERIFICATION.md for the raw per-glyph re-extraction confirming this row's own label/caption order.",
      "sourceRef": "Page 1 — \"Days: ___ Months: ___ Years: ___ How long do you wish to stay in PNG:\""
    },
    {
      "name": "requestedExtensionMonths",
      "label": "Requested Extension — Months",
      "type": "integer",
      "required": false,
      "sourceRef": "Page 1 — \"How long do you wish to stay in PNG\" (Months box)"
    },
    {
      "name": "requestedExtensionYears",
      "label": "Requested Extension — Years",
      "type": "integer",
      "required": false,
      "sourceRef": "Page 1 — \"How long do you wish to stay in PNG\" (Years box)"
    },
    {
      "name": "reasonForExtension",
      "label": "Reason for Extension",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1 — \"Please state the reason for your extension:\""
    },
    {
      "name": "entryPermitNumber",
      "label": "Existing Entry Permit — Number",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1, EXISTING ENTRY PERMIT DETAILS — \"Entry Permit Number\""
    },
    {
      "name": "entryPermitExpiryDate",
      "label": "Existing Entry Permit — Expiry Date",
      "type": "date",
      "required": true,
      "sourceRef": "Page 1, EXISTING ENTRY PERMIT DETAILS — \"Entry Permit Expiry Date\""
    },
    {
      "name": "dateOfLastEntryIntoPNG",
      "label": "Date of Last Entry Into PNG",
      "type": "date",
      "required": true,
      "sourceRef": "Page 1, EXISTING ENTRY PERMIT DETAILS — \"Date of Last entry into PNG\""
    },
    {
      "name": "entryPermitType",
      "label": "Existing Entry Permit — Type",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1, EXISTING ENTRY PERMIT DETAILS — \"Entry Permit Type\""
    },
    {
      "name": "entryPermitClass",
      "label": "Existing Entry Permit — Class",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1, EXISTING ENTRY PERMIT DETAILS — \"Entry Permit Class\""
    },
    {
      "name": "entryPermitIssueDate",
      "label": "Existing Entry Permit — Date of Issue",
      "type": "date",
      "required": true,
      "sourceRef": "Page 1, EXISTING ENTRY PERMIT DETAILS — \"Date of Issue\""
    },
    {
      "name": "entryPermitPlaceOfIssue",
      "label": "Existing Entry Permit — Place of Issue",
      "type": "string",
      "required": true,
      "sourceRef": "Page 1, EXISTING ENTRY PERMIT DETAILS — \"Place of Issue\""
    },
    {
      "name": "addressNumberAndStreet",
      "label": "Address While in PNG — Number and Street",
      "type": "string",
      "required": true,
      "sourceRef": "Page 2, ADDRESS WHILE IN PNG — \"Number & Street:\"",
      "classification": "pii"
    },
    {
      "name": "addressTownVillage",
      "label": "Address While in PNG — Town/Village",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ADDRESS WHILE IN PNG — \"Town/Village\"",
      "classification": "pii"
    },
    {
      "name": "addressProvince",
      "label": "Address While in PNG — Province",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ADDRESS WHILE IN PNG — \"Province\""
    },
    {
      "name": "addressPostalAddress",
      "label": "Address While in PNG — Postal Address",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ADDRESS WHILE IN PNG — \"Postal Address\""
    },
    {
      "name": "addressHomeTelephone",
      "label": "Address While in PNG — Home Telephone",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ADDRESS WHILE IN PNG — \"Home Telephone\"",
      "classification": "pii"
    },
    {
      "name": "addressMobileTelephone",
      "label": "Address While in PNG — Mobile Telephone",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ADDRESS WHILE IN PNG — \"Mobile Telephone\"",
      "classification": "pii"
    },
    {
      "name": "applicantContactEmail",
      "label": "Applicant's Contact Email Address",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2 — \"Your contact email address\"",
      "classification": "pii"
    },
    {
      "name": "agreeToEmailContact",
      "label": "Do You Agree to Receiving Communication by Email?",
      "type": "boolean",
      "required": false,
      "description": "Two independent checkboxes (\"Email communications - Yes\"/\"Email communications -No\"), collapsed into one boolean.",
      "sourceRef": "Page 2 — \"Do you agree to receiving [email] communication? Yes / No\""
    },
    {
      "name": "fundedBySalary",
      "label": "Stay Funded by Salary",
      "type": "boolean",
      "required": false,
      "description": "Independent, non-exclusive checkbox — left ungated (bare-optional) since the requiredWhen grammar cannot express an \"at least one of these four\" constraint without overreaching what the form itself states; see VERIFICATION.md.",
      "sourceRef": "Page 2 — \"How will you be funding your stay in PNG:\" \"Stay support salary\""
    },
    {
      "name": "fundedByOwnFunds",
      "label": "Stay Funded by Own Funds",
      "type": "boolean",
      "required": false,
      "sourceRef": "Page 2 — \"How will you be funding your stay in PNG:\" \"Stay support own funds\""
    },
    {
      "name": "fundedByCompanySponsor",
      "label": "Stay Funded by Company Sponsor",
      "type": "boolean",
      "required": false,
      "sourceRef": "Page 2 — \"How will you be funding your stay in PNG:\" \"Stay support company sponsor\""
    },
    {
      "name": "fundedByFamily",
      "label": "Stay Funded by Family",
      "type": "boolean",
      "required": false,
      "sourceRef": "Page 2 — \"How will you be funding your stay in PNG:\" \"Stay support family\""
    },
    {
      "name": "hasOrganisationalSponsor",
      "label": "Do You Have an Organisational Sponsor/Employer?",
      "type": "boolean",
      "required": true,
      "description": "Directly-supplied gate for the ORGANISATIONAL SPONSOR/EMPLOYER block, whose own printed heading carries an explicit \"(IF APPLICABLE)\" qualifier; see VERIFICATION.md.",
      "sourceRef": "Page 2 heading — \"ORGANISATIONAL SPONSOR/EMPLOYER (IF APPLICABLE)\""
    },
    {
      "name": "organisationalSponsorName",
      "label": "Organisational Sponsor/Employer — Name",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasOrganisationalSponsor",
        "equals": true
      },
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR/EMPLOYER — \"Organisation Name\""
    },
    {
      "name": "sponsorAgentName",
      "label": "Organisational Sponsor/Employer — Agent",
      "type": "string",
      "required": false,
      "description": "Bare-optional even when hasOrganisationalSponsor is true; see VERIFICATION.md.",
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR/EMPLOYER — \"Agent\"",
      "classification": "pii"
    },
    {
      "name": "sponsorLotAndSectionNo",
      "label": "Organisational Sponsor/Employer — Lot and Section No.",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasOrganisationalSponsor",
        "equals": true
      },
      "description": "This specimen's own PNG-convention street-address-equivalent field (a single combined text box), distinct from pg/ica/entry-permit-application's own separate sponsorStreetAddress field.",
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR/EMPLOYER — \"Lot and Section No\""
    },
    {
      "name": "sponsorTownVillage",
      "label": "Organisational Sponsor/Employer — Town/Village",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR/EMPLOYER — \"Town/Village\""
    },
    {
      "name": "sponsorProvince",
      "label": "Organisational Sponsor/Employer — Province",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR/EMPLOYER — \"Province\""
    },
    {
      "name": "sponsorPostalAddress",
      "label": "Organisational Sponsor/Employer — Postal Address",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR/EMPLOYER — \"Postal Address\""
    },
    {
      "name": "sponsorTelephone",
      "label": "Organisational Sponsor/Employer — Telephone",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR/EMPLOYER — \"Telephone\""
    },
    {
      "name": "sponsorEmail",
      "label": "Organisational Sponsor/Employer — Email",
      "type": "string",
      "required": false,
      "sourceRef": "Page 2, ORGANISATIONAL SPONSOR/EMPLOYER — \"Email\""
    },
    {
      "name": "hasChangedNameOrAlias",
      "label": "Have You Ever Changed Your Name or Are You Known by an Alias?",
      "type": "boolean",
      "required": true,
      "description": "Directly-supplied gate splitting one combined prose sentence into its own subsection trigger, mirroring pg/ica/entry-permit-application's own identical gate; see VERIFICATION.md.",
      "sourceRef": "Page 2 — \"If you have ever change your name, are known by an alias, or own another passport, please provide details:\" (PREVIOUS NAMES/ALIAS DETAILS subsection)"
    },
    {
      "name": "previousFamilyName",
      "label": "Previous Family Name",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasChangedNameOrAlias",
        "equals": true
      },
      "sourceRef": "Page 2, PREVIOUS NAMES/ALIAS DETAILS — \"Family Name\"",
      "classification": "pii"
    },
    {
      "name": "previousGivenNames",
      "label": "Previous Given Names",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasChangedNameOrAlias",
        "equals": true
      },
      "sourceRef": "Page 2, PREVIOUS NAMES/ALIAS DETAILS — \"Given Names\"",
      "classification": "pii"
    },
    {
      "name": "previousDateOfBirth",
      "label": "Previous Record — Date of Birth",
      "type": "date",
      "required": false,
      "requiredWhen": {
        "field": "hasChangedNameOrAlias",
        "equals": true
      },
      "sourceRef": "Page 2, PREVIOUS NAMES/ALIAS DETAILS — \"Date of Birth\""
    },
    {
      "name": "previousSex",
      "label": "Previous Record — Sex",
      "type": "enum",
      "required": false,
      "requiredWhen": {
        "field": "hasChangedNameOrAlias",
        "equals": true
      },
      "description": "A Ch (combo-box) dropdown with a blank first option, then F/M; normalised to this schema's own MALE/FEMALE vocabulary for cross-field consistency with the top-level sex field. See VERIFICATION.md.",
      "validation": {
        "enum": ["MALE", "FEMALE"]
      },
      "sourceRef": "Page 2, PREVIOUS NAMES/ALIAS DETAILS — \"Sex\" (dropdown)"
    },
    {
      "name": "previousMaritalStatus",
      "label": "Previous Record — Marital Status",
      "type": "enum",
      "required": false,
      "requiredWhen": {
        "field": "hasChangedNameOrAlias",
        "equals": true
      },
      "description": "A Ch (combo-box) dropdown with a blank first option, then Married/Never married/Divorced/De-facto/Widowed; normalised to this schema's own maritalStatus vocabulary. See VERIFICATION.md.",
      "validation": {
        "enum": ["MARRIED", "NEVER_MARRIED", "DIVORCED", "DE_FACTO", "WIDOWED"]
      },
      "sourceRef": "Page 2, PREVIOUS NAMES/ALIAS DETAILS — \"Marital Status\" (dropdown)"
    },
    {
      "name": "hasOtherPassport",
      "label": "Do You Hold Another Passport?",
      "type": "boolean",
      "required": true,
      "description": "Directly-supplied gate splitting the same combined prose sentence as hasChangedNameOrAlias into its own subsection trigger; see VERIFICATION.md.",
      "sourceRef": "Page 2 — \"...or own another passport, please provide details:\" (OTHER PASSPORTS subsection)"
    },
    {
      "name": "otherPassportCountry",
      "label": "Other Passport — Country of Issue",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasOtherPassport",
        "equals": true
      },
      "sourceRef": "Page 2, OTHER PASSPORTS — \"Country of Issue\""
    },
    {
      "name": "otherPassportNumber",
      "label": "Other Passport — Number",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasOtherPassport",
        "equals": true
      },
      "sourceRef": "Page 2, OTHER PASSPORTS — \"Passport Number\"",
      "classification": "sensitive-pii"
    },
    {
      "name": "otherPassportExpiryDate",
      "label": "Other Passport — Expiry Date",
      "type": "date",
      "required": false,
      "requiredWhen": {
        "field": "hasOtherPassport",
        "equals": true
      },
      "sourceRef": "Page 2, OTHER PASSPORTS — \"Passport Expiry Date\""
    },
    {
      "name": "hasCriminalConviction",
      "label": "Have You Ever Been Charged With or Been Convicted of a Criminal Offence?",
      "type": "boolean",
      "required": true,
      "description": "Two independent checkboxes (\"Criminal offence yes\"/\"Criminal offence no\"), collapsed into one boolean.",
      "sourceRef": "Page 2 — \"Have you ever been charged with or been convicted of a criminal offence: Yes / No\""
    },
    {
      "name": "criminalHistoryDetails",
      "label": "Criminal History Details",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasCriminalConviction",
        "equals": true
      },
      "sourceRef": "Page 2 — \"Details of previous criminal history\""
    },
    {
      "name": "hasBeenDeportedOrRefusedEntry",
      "label": "Have You Been Deported From, or Refused Entry To, Papua New Guinea or Any Other Country?",
      "type": "boolean",
      "required": true,
      "description": "Two independent checkboxes (\"Deported yes\"/\"Deported no\"), collapsed into one boolean.",
      "sourceRef": "Page 2 — \"Have you been deported from, or refused entry to Papua New Guinea, or any other country: Yes / No\""
    },
    {
      "name": "previousDeportationDetails",
      "label": "Deportation/Refused-Entry Details",
      "type": "string",
      "required": false,
      "requiredWhen": {
        "field": "hasBeenDeportedOrRefusedEntry",
        "equals": true
      },
      "sourceRef": "Page 2 — \"If yes, please give details.\" (\"Deported details\")"
    },
    {
      "name": "declarationSignedDate",
      "label": "Declaration — Signed Date",
      "type": "date",
      "required": true,
      "sourceRef": "Page 2, DECLARATION — \"Signed date\""
    }
  ],
  "steps": [
    {
      "id": "personal_particulars",
      "title": "Page 1: Personal Details",
      "next": "passport_details",
      "fields": [
        "familyName",
        "givenNames",
        "dateOfBirth",
        "sex",
        "maritalStatus",
        "countryOfBirth",
        "nationality"
      ]
    },
    {
      "id": "passport_details",
      "title": "Page 1: Passport Particulars",
      "next": "requested_extension",
      "fields": [
        "passportNumber",
        "passportExpiryDate"
      ]
    },
    {
      "id": "requested_extension",
      "title": "Page 1: Requested Extension Length and Reason",
      "next": "existing_entry_permit_details",
      "fields": [
        "requestedExtensionDays",
        "requestedExtensionMonths",
        "requestedExtensionYears",
        "reasonForExtension"
      ]
    },
    {
      "id": "existing_entry_permit_details",
      "title": "Page 1: Existing Entry Permit Details",
      "next": "address_and_contact",
      "fields": [
        "entryPermitNumber",
        "entryPermitExpiryDate",
        "dateOfLastEntryIntoPNG",
        "entryPermitType",
        "entryPermitClass",
        "entryPermitIssueDate",
        "entryPermitPlaceOfIssue"
      ]
    },
    {
      "id": "address_and_contact",
      "title": "Page 2: Address While in PNG and Contact Details",
      "next": "stay_funding",
      "fields": [
        "addressNumberAndStreet",
        "addressTownVillage",
        "addressProvince",
        "addressPostalAddress",
        "addressHomeTelephone",
        "addressMobileTelephone",
        "applicantContactEmail",
        "agreeToEmailContact"
      ]
    },
    {
      "id": "stay_funding",
      "title": "Page 2: Stay-Funding Source",
      "next": "organisational_sponsor",
      "fields": [
        "fundedBySalary",
        "fundedByOwnFunds",
        "fundedByCompanySponsor",
        "fundedByFamily"
      ]
    },
    {
      "id": "organisational_sponsor",
      "title": "Page 2: Organisational Sponsor/Employer",
      "next": "previous_names_and_passports",
      "fields": [
        "hasOrganisationalSponsor",
        "organisationalSponsorName",
        "sponsorAgentName",
        "sponsorLotAndSectionNo",
        "sponsorTownVillage",
        "sponsorProvince",
        "sponsorPostalAddress",
        "sponsorTelephone",
        "sponsorEmail"
      ]
    },
    {
      "id": "previous_names_and_passports",
      "title": "Page 2: Previous Names/Alias and Other Passports",
      "next": "background_history",
      "fields": [
        "hasChangedNameOrAlias",
        "previousFamilyName",
        "previousGivenNames",
        "previousDateOfBirth",
        "previousSex",
        "previousMaritalStatus",
        "hasOtherPassport",
        "otherPassportCountry",
        "otherPassportNumber",
        "otherPassportExpiryDate"
      ]
    },
    {
      "id": "background_history",
      "title": "Page 2: Criminal and Deportation History",
      "next": "declaration",
      "fields": [
        "hasCriminalConviction",
        "criminalHistoryDetails",
        "hasBeenDeportedOrRefusedEntry",
        "previousDeportationDetails"
      ]
    },
    {
      "id": "declaration",
      "title": "Page 2: Declaration",
      "fields": [
        "declarationSignedDate"
      ]
    }
  ],
  "documents": [
    {
      "id": "applicantPassport",
      "label": "Applicant's passport (the physical document, sent with the form)",
      "category": "identity-document",
      "required": true,
      "belongsTo": "applicant",
      "sourceRef": "Instruction 3 — \"The completed form and the applicant's passport should be sent to: The Chief Migration Officer, Immigration and Citizenship Service Authority, PO Box 1790, BOROKO NCD, Papua New Guinea\""
    },
    {
      "id": "applicantDeclaration",
      "label": "Applicant's (or parents'/guardian's) signed Declaration",
      "category": "attestation",
      "required": true,
      "belongsTo": "applicant",
      "statement": "I declare that the information provided on the form is true and correct, and that I have disclosed all information that may be relevant to determining whether I should be granted an entry permit to travel to and stay in Papua New Guinea. I am aware it is a criminal offence to provide false or misleading statements, documents, or information in relation to this application.",
      "sourceRef": "Page 2, DECLARATION (quoted verbatim; independently re-confirmed via raw per-glyph x/y re-extraction, no line-joining artifact found). The underlying AcroForm's \"Signature\" widget is a genuine PDF /FT /Sig field, not a text field; modelled here as an attestation document rather than a scalar field — see VERIFICATION.md."
    }
  ]
}
