forms/form1/form1.htmlform/v5.htmlapp/sooner-app.html · 3 docs missing vs spec| Sev | Form | Issue | Evidence | Fix 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. |
| Form | Field | Label | Type | Req | Model link | Consequence | Doc-importable | Source |
|---|
gabriel-spec.md)| # | Spec demands | HTML state | File:line |
|---|---|---|---|
| 1 | Form 1 step 5 = Cost Breakdown table; step 6 = Sooner Offer reveal | Missing — steps 5/6 are residency/income | forms/form1/form1.html:764,778 |
| 2 | Form 1 contact info collected FIRST | Collected LAST (step 8) | forms/form1/form1.html:854–874 |
| 3 | Form 2 Q7 "Additional household income earners?" yes/no gate before co-applicant Qs | MISSING — Form 2.5 fields render unconditionally | form/v5.html:587–600 |
| 4 | Form 2 Q10 monthly rent | Asks ANNUAL rent (P1 bug) | form/v5.html:606 |
| 5 | Form 3 = 8 documents | 5 documents in code default | app/sooner-app.html:2065–2069 |
| 6 | Form 3 conditional doc list (salary cert if salaried, trade license if self-emp) | No conditional branching of buildDocList | app/sooner-app.html:2059–2071 |
| 7 | Form 3 pre-fills from Form 2 | Profile overlay duplicates Form 2 data capture | app/sooner-app.html:1186–1322 |
| 8 | Spec has no down_payment_source or property_usage_raw | Both present in v5 (added scope) | form/v5.html:624,629 |
| 9 | Spec has no bedrooms field | Present in HTML (added scope, harmless) | forms/form1/form1.html:749–754 |
| Reliable doc | Collected? | Where / gap |
|---|---|---|
| Emirates ID (front + back) | YES | app/sooner-app.html:2065 |
| Passport copy | YES | app/sooner-app.html:2066 |
| Visa page | YES | app/sooner-app.html:2067 |
| Bank statements 3–6mo | YES (6 slots) | app/sooner-app.html:2068 |
| AECB consent / report | PARTIAL | Tile combines report-OR-consent; need explicit consent capture path when no report uploaded |
| Salary certificate | NO | Missing tile — Reliable requires for all salaried |
| Employment letter | NO | Missing tile — Reliable separates from salary cert |
| Trade license PDF (self-emp) | NO | Text-only input at app/sooner-app.html:2745 — no upload tile |
| Audited financials (self-emp >2y) | NO | Missing tile |
| Form | Insertion point | Rationale |
|---|---|---|
| Form 1 | After Sooner Offer reveal (the spec-demanded step 6 we're inserting) | Aha moment — show base tier + upsells (Home Discovery, Brokerage) as add-ons |
| Form 2 | After sooner_reveal (v5.html:561), before property_timeline | Same logic post budget reveal — show full Sooner package |
| Form 2 | Thanks screen (form/v5.html:651) | Display final fee tier locked in based on SCS bucket + service selection |
| Form 3 | Dashboard screen (app/sooner-app.html:968) | Closure surface — locked-in tier + service add-ons selected |
| Doc | Auto-fillable fields |
|---|---|
| emirates_id | Full name, DoB (NEVER asked, per spec), nationality, phone (from registered SIM bind), Emirates ID number |
| passport | Full name (Romanized), nationality, passport number, expiry |
| visa_page | Residency status (G1), visa type, sponsor, UAE residency duration (G1/E) |
| salary_certificate | Employer name, job title, tenure, fixed salary, allowances breakdown |
| bank_statements | Variable income (commission patterns), rent payments, savings buffer, recurring DBR commitments |
| aecb_report | AECB score (G3/G), credit cards (limits + balances), existing loans (personal/car/mortgage payments), credit history (Cat-F) |
| trade_license | Business name, license number, years in business (G7), shareholding |
| loan_statements | Confirms 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.