Skip to content

Immigration — Work / Visit Pass Applications (Singapore MOM)

1. Document Control

Document TitleSingapore MOM Work / Visit Pass Application Automation
Document IDSOP-IMM-001
Version1.0 (Draft for Automation Build)
Effective Date[Insert Date]
Review Date[Insert Date + 12 months]
Document OwnerHead of Immigration
ApproverManaging Director
StatusDraft

Distribution

Role TitleAccess Rights
IMM OperatorEdit (intake, review, submit gate)
Platform AdminEdit (incl. threshold config)
Client SubmitterPortal form + document upload only
ApplicantPortal form + document upload only

2. Purpose and Scope

This SOP covers the AI-assisted preparation of a Singapore work / visit pass application: an IMM Operator initiates an application for an employer entity + applicant party, the applicant completes a portal form and uploads documents, the applicant is screened (KYC), eligibility is evaluated against the per-pass-type SG rules, an assisted Ministry of Manpower (MOM) submission pack is assembled, and — after a mandatory human gate — the operator files in EP Online / WPOL and records the acknowledgement. A pass-renewal deadline is then tracked.

The platform does not auto-file with MOM. Submission to the authority is always human-performed (FR-IMM-007); the agent produces a transcribable pack and records the real acknowledgement the operator obtains.

The workflow is IMM.PREPARE_APPLICATION (one AgentRun per application). See the run lifecycle for the full state machine.


3. Pass Types

The six SG pass types the platform recognises (admin-configurable thresholds, dedicated form definitions where bespoke):

Pass typeForm definition idNotes
EMPLOYMENT_PASSimm.application.employment_pass.v1EP Online. Salary + qualification + contract.
S_PASSimm.application.s_pass.v1WPOL. Salary + skills certificate + contract.
DEPENDANT_PASSimm.application.dependant_pass.v1EP Online. Sponsor pass + relationship proof.
PERSONALISED_EMPLOYMENT_PASSimm.application.generic.v1Generic form; threshold configurable.
ONE_PASSimm.application.generic.v1Overseas Networks & Expertise Pass; generic form.
SOCIAL_VISIT_PASSimm.application.generic.v1Long-term visit pass; threshold typically 0.

Pass types without a bespoke form definition fall back to the generic definition (immFormDefinition in packages/agent-runtime/src/modules/imm-form-defs.ts): the common identity fields + a passport bio-data page.


4. Required Documents per Pass Type

Authored as data in packages/agent-runtime/src/modules/imm-form-defs.ts. Each required-doc slot has a stable key (the portal + completeness check address it by) and maps to a lean KycDocType so uploaded files persist as KycDocument rows (no schema migration).

Common fields (every pass type): full name (passport), pass type (prefilled, locked), employer (prefilled, locked), passport number, nationality, date of birth.

Pass typeExtra form fieldsRequired documents (slot key → KycDocType)
EMPLOYMENT_PASSmonthly salary (prefilled), job title, highest qual.passport_bio_pageID; educational_certificateOTHER; employment_contractOTHER
S_PASSmonthly salary (prefilled), job titlepassport_bio_pageID; educational_certificateOTHER; employment_contractOTHER
DEPENDANT_PASSsponsor's pass number, relationship to sponsorpassport_bio_pageID; proof_of_relationshipOTHER; sponsor_proof_of_addressPROOF_OF_ADDRESS
generic fallbackpassport_bio_pageID

The portal blocks submit until every required-doc slot has a file. Slot keys are carried on KycDocument.verificationStatus as UPLOADED:<slotKey>.


5. Eligibility Rules and Threshold Config

5.1 The SG IMM rule pack

packages/rules/src/packs/sg-imm.ts (SG_IMM_PACK, version 0.1.0) — four BLOCK rules evaluated at the evalEligibility step. A failure of any rule throws ImmEligibilityBlockedError and the run goes FAILED.

Rule idCheckBlocks when
SG.IMM.SALARY_THRESHOLDsalary_meets_thresholdapplicant monthly salary < the per-pass-type threshold (SGD)
SG.IMM.DOCUMENTS_PRESENTrequired_documents_presentany required-doc slot is missing
SG.IMM.SCREENING_CLEAREDscreening_clearedscreening outcome is CONFIRMED_MATCH
SG.IMM.EMPLOYER_ELIGIBLEemployer_eligiblethe employer entity is not LIVE

5.2 Per-pass-type salary thresholds (platform config)

Thresholds are PLATFORM settings, not tenant data. They live on the global, non-tenant-scoped Jurisdiction.config.immThresholds JSON (key = pass type, value = monthly SGD). At eval time the IMM workflow reads immThresholds[passType] for the employer's jurisdiction and injects it onto a per-run copy of the pack's minMonthlySalarySgd (the shared SG_IMM_PACK constant is never mutated). Fallback when no value is configured: 5000 SGD (DEFAULT_IMM_SALARY_SGD).

Who edits them: PLATFORM_ADMIN only, at /dashboard/jurisdictions.

API:

  • GET /admin/jurisdictions — list jurisdictions.
  • GET /admin/jurisdictions/:id — detail incl. current immThresholds.
  • PATCH /admin/jurisdictions/:id/config — merge-update immThresholds (validates: each key is one of the six known pass types, each value a non-negative finite number; rejects the whole patch on the first offence). Writes an audit event jurisdiction.imm_thresholds.set under Tenant 0.

Representative SG figures (seed/doc reference only — exact values are admin-configured): EP 5600, S Pass 3150, PEP 22500, ONE Pass 30000, DP 6000, Social Visit 0 (REPRESENTATIVE_IMM_THRESHOLDS_SGD).


6. The Human Gate (FR-IMM-007)

Submission to MOM is a tier-4 proposed action (IMM.SUBMIT_APPLICATION) pinned to a mandatory human gate. The submit workflow step never files — it routes the run to AWAITING_REVIEW in the shared review inbox.

The IMM Operator:

  1. Opens the application detail (/dashboard/imm/applications/[id]), reviews eligibility, documents, and the assembled MOM pack.
  2. Files the application manually in EP Online / WPOL, transcribing from the pack's mappedFields + artifact.
  3. Approves the gate via POST /ops/review-inbox/:reviewTaskId/approve with applyInput.filing.acknowledgementNumber (optional filedAt, reference).

The apply executor (imm-apply.ts, the only writer) then records the FilingTransaction(MOM, PASS_APPLICATION, ACKNOWLEDGED), persists the pack as a Document(IMM_APPLICATION), upserts a StatutoryDeadline(PASS_RENEWAL), emits FILING_OUTCOME, and closes the run. It is idempotent — a retry that finds the filing already written is a no-op.

Permissions: IMM intake, review, and the submission gate are restricted to IMM_OPERATOR + PLATFORM_ADMIN (operatorRolesForModule('IMM')). The IMM.SUBMIT_APPLICATION permission is ENTITY-scoped.


7. Renewal Tracking (FR-IMM-008 / Workstream 5)

When a filing is acknowledged, a StatutoryDeadline(PASS_RENEWAL) is created (default filedAt + 24 months, or the operator-supplied renewal date).

The daily deadline-scheduler worker calls sweepPassRenewals (packages/db/src/deadlines.ts) per tenant. It re-derives each PASS_RENEWAL deadline's status from its due date against a 60-day lead time:

  • UPCOMING → more than 60 days out (risk LOW);
  • DUE_SOON → within 60 days (risk MEDIUM);
  • OVERDUE → past due (risk HIGH).

The status is written only when it actually changes (idempotent), and a DEADLINE_STATE event is emitted on every real transition. On the first crossing into DUE_SOON (the UPCOMING → DUE_SOON edge only — repeated sweeps never re-alert), one Notification of type PASS_RENEWAL_DEADLINE_APPROACHING is created per active IMM_OPERATOR / PLATFORM_ADMIN, linking to /dashboard/imm?entityId=<entityId>. Renewal itself is re-initiated manually — the sweep never auto-creates a run.


8. End-to-End Flow Summary

StepActorActionSystem effect
1IMM OperatorStart application (/dashboard/imm)IntakeRequest + AgentRun (IMM.PREPARE_APPLICATION) queued
2SystemclassifycollectApplicationForm (FORM, pauses)FormInstance + magic link; run AWAITING_CLIENT
3ApplicantOpen /portal/imm/:token, fill form, upload docs, submitKycDocument rows; FormInstance SUBMITTED; resume enqueued
4SystemcollectDocumentsscreenevalEligibilityKycCase + ScreeningResult; BLOCK ⇒ FAILED
5SystemassembleApplicationsubmitMOM pack assembled; tier-4 action proposed; run AWAITING_REVIEW
6IMM OperatorFile in EP Online / WPOL; approve gate with acknowledgementFilingTransaction + Document + StatutoryDeadline; CLOSED
7System (daily)sweepPassRenewalsPASS_RENEWAL status transitions + one-time DUE_SOON notify

Internal use only — BreezyCorp