Sooner Forms — Inventory + Gap Analysis

Generated 2026-05-19 by Opus 4.7 (master) from a codebase-explorer pass over the production HTML on branch t3/sooner-application-forms.
Spec of record: sooner-gtm-forms/underwriting-funnel/gabriel-spec.md · Running notes: implementation-notes.html

Form 1
12 Qs
~2–3 min · partner-facing · forms/form1/form1.html
Form 2
26 Qs
~6–9 min · borrower · form/v5.html
Form 2.5
7 Qs
co-applicant branch · already embedded in Form 2 (lines 587–600)
Form 3
14 Qs + 5 docs
~5–8 min · app/sooner-app.html · 3 docs missing vs spec

P0 / P1 issues found in this pass

SevFormIssueEvidenceFix direction
P1 Form 2 Rent collected as ANNUAL, spec/scoring expect MONTHLY. Silently breaks Cat-I (Lifestyle Alignment) scoring. form/v5.html:606 — placeholder "80,000", min:12000 (annual). Spec sec.7 expects monthly rent. Change label + placeholder to monthly. Audit any callers of rent_payment for ÷12 / ×12 confusion. Add a test pinning monthly semantics.
P1 Form 2 + Form 2.5 Form 2.5 renders unconditionally. Every Form 2 user is asked 7 co-applicant questions even when applying solo. form/v5.html:587–600 — no has_co_applicant gate; spec Q7 (yes/no) is missing. Add has_co_applicant yes/no at the position currently held by line 586. Gate 587–600 on yes. Pre-fill from Form 1's applyingWith URL param.
P1 Form 3 3 required doc tiles missing vs spec + Reliable Mortgages. app/sooner-app.html:2065–2069 ships 5 tiles (EID, passport, visa, bank-stmts, AECB). Spec/Reliable need: salary certificate, employment letter, trade license PDF, audited financials. Add 4 tiles. Make 2 conditional on employment-type: salary certificate + employment letter for salaried; trade license PDF + audited financials for self-employed.
P1 Form 3 Form 3 re-asks Form 2 data. Profile overlay (5-step po-*) re-captures employment, CC, savings, AECB. Spec says pre-fill from Form 2. app/sooner-app.html:1186–1322 — full duplicate capture. Either Form 3 is the authoritative store (drift) or Form 2 answers are discarded. Decide source of truth (recommend: Form 2 owns data, Form 3 verifies via docs). Pre-fill the profile overlay from buyer_lead row. Show "confirmed from Form 2" badges, allow correction.
P2 Form 1 Contact info (name/email/phone) collected LAST. Spec says FIRST. forms/form1/form1.html:854–874 — step 8. Either move to step 1 per spec, or document and amend spec. Current placement means gates fire before identity captured — partners can drop off after seeing a decline screen with zero contact data.
P2 Form 1 Missing the "Cost Breakdown" + "Sooner Offer reveal" steps. forms/form1/form1.html — steps 5–6 in spec are not in HTML; spec sec.3 says these are the aha conversion moment. Insert two display-only screens between residency and income. Compute upfront cost (per dubai-closing-costs-canonical KB page) + show Sooner monthly payment.
P2 all Zero pricing-tier touchpoints anywhere. Service selection (CFF / Home Discovery / Brokerage) not asked. Resulting fee (10/12/15%) not displayed. grep tier|10%|12.5%|15%|service|brokerage|home discovery|closing fee across the 4 surfaces: zero relevant matches. Per confirmed defaults (2026-05-19): add a service-selection multi-select to Form 2 after sooner_reveal (line 561). CFF always required. Render live tier badge. Add consequences messaging declaratively.
P2 Form 2.5 Form 1's householdIncomeInput + partnerCommInput capture partner income/commission but NOT partner full-name. URL prefill plumbing in Form 2 expects co_applicant_full_name. forms/form1/form1.html:813,825 vs form/v5.html:287–293. Add full-name input to Form 1's partner expand. Pass it as co_applicant_name URL param to Form 2.
P2 Form 3 No co-applicant document tiles. If Form 2.5 promotes co-applicant to first-class, Form 3 needs parity (co-applicant EID, passport, visa, salary cert, bank stmts). grep on app/sooner-app.html: zero co-applicant/partner/spouse matches. Add a parallel coDocList rendering when state.profile.hasCoApplicant === true.

Question inventory (all 4 surfaces)

Rows tagged required / optional / computed. Model link = the underwriting gate (G1–G10) or scoring category (A–I) the field feeds. Importable-from-doc highlights opportunities to auto-fill from uploads (not yet implemented). Co-applicant rows are italicized.

Form Field Label Type Req Model link Consequence Doc-importable Source

Spec deviations (HTML vs gabriel-spec.md)

#Spec demandsHTML stateFile:line
1Form 1 step 5 = Cost Breakdown table; step 6 = Sooner Offer revealMissing — steps 5/6 are residency/incomeforms/form1/form1.html:764,778
2Form 1 contact info collected FIRSTCollected LAST (step 8)forms/form1/form1.html:854–874
3Form 2 Q7 "Additional household income earners?" yes/no gate before co-applicant QsMISSING — Form 2.5 fields render unconditionallyform/v5.html:587–600
4Form 2 Q10 monthly rentAsks ANNUAL rent (P1 bug)form/v5.html:606
5Form 3 = 8 documents5 documents in code defaultapp/sooner-app.html:2065–2069
6Form 3 conditional doc list (salary cert if salaried, trade license if self-emp)No conditional branching of buildDocListapp/sooner-app.html:2059–2071
7Form 3 pre-fills from Form 2Profile overlay duplicates Form 2 data captureapp/sooner-app.html:1186–1322
8Spec has no down_payment_source or property_usage_rawBoth present in v5 (added scope)form/v5.html:624,629
9Spec has no bedrooms fieldPresent in HTML (added scope, harmless)forms/form1/form1.html:749–754

Reliable Mortgages doc coverage

Reliable docCollected?Where / gap
Emirates ID (front + back)YESapp/sooner-app.html:2065
Passport copyYESapp/sooner-app.html:2066
Visa pageYESapp/sooner-app.html:2067
Bank statements 3–6moYES (6 slots)app/sooner-app.html:2068
AECB consent / reportPARTIALTile combines report-OR-consent; need explicit consent capture path when no report uploaded
Salary certificateNOMissing tile — Reliable requires for all salaried
Employment letterNOMissing tile — Reliable separates from salary cert
Trade license PDF (self-emp)NOText-only input at app/sooner-app.html:2745 — no upload tile
Audited financials (self-emp >2y)NOMissing tile

Pricing-tier touchpoints (where 10/12/15% display should land)

FormInsertion pointRationale
Form 1After Sooner Offer reveal (the spec-demanded step 6 we're inserting)Aha moment — show base tier + upsells (Home Discovery, Brokerage) as add-ons
Form 2After sooner_reveal (v5.html:561), before property_timelineSame logic post budget reveal — show full Sooner package
Form 2Thanks screen (form/v5.html:651)Display final fee tier locked in based on SCS bucket + service selection
Form 3Dashboard screen (app/sooner-app.html:968)Closure surface — locked-in tier + service add-ons selected

Doc-importability opportunities (highlight only)

Fields that could be auto-filled from an uploaded document (~60% of Form 2 + Form 3)
DocAuto-fillable fields
emirates_idFull name, DoB (NEVER asked, per spec), nationality, phone (from registered SIM bind), Emirates ID number
passportFull name (Romanized), nationality, passport number, expiry
visa_pageResidency status (G1), visa type, sponsor, UAE residency duration (G1/E)
salary_certificateEmployer name, job title, tenure, fixed salary, allowances breakdown
bank_statementsVariable income (commission patterns), rent payments, savings buffer, recurring DBR commitments
aecb_reportAECB score (G3/G), credit cards (limits + balances), existing loans (personal/car/mortgage payments), credit history (Cat-F)
trade_licenseBusiness name, license number, years in business (G7), shareholding
loan_statementsConfirms AECB payment figures; flags new/post-AECB obligations

Implementation deferred — OCR pipeline is its own engineering effort (Bedrock vs Azure vs Extend AI bake-off per uae-ocr-strategy.md memory). Tagging only.