/Users/gabo/Desktop/Projects/sooner-underwriting-sandbox — NOT a git repo yet; never pushed to GitHub.v0.1.0, aggregate SHA 05a1ad5.... Files: criteria.v0.json, profile-input.v0.json, decision-result.v0.json, a0-apply-payload.v0.json, b1-decision-payload.v0.json, c0-candidate-intake.v0.json, d0-upload-adapter.v0.json./criteria, /profiles, /playground. 30 seed profiles imported. 41 tests passing./api/locations/search, /api/locations/classify, /api/employers/taxonomy, /api/employers/classify. Production env not configured (Vercel/Railway return upstream_not_configured on live search)./Users/gabo/Desktop/Projects/sooner-gtm-forms, branch t3/sooner-application-forms. Latest HEAD: dc1aa1f Sooner 2.0: Supabase integration, Edge Function, staging site.forms/form1/form1.html — 2,249 lines — Form 1 lead qualificationform/v5.html — 1,785 lines — Form 2 pre-approval (current production)app/sooner-app.html — 3,421 lines — borrower dashboard + Form 3 documents (currently conflates Form 2.5 co-applicant work)underwriting-funnel/gabriel-spec.md describes a 3-form funnel (Form 1 / Form 2 / Form 3) — does NOT yet model Form 2.5.underwriting-funnel/t3-field-audit.md. Provisional A0 handoff metadata wired. Reliable Mortgages required-vs-optional doc list NOT yet confirmed.buyer_lead table + Supabase Storage. Apps Script fallback. Service-role secrets rotated 2026-05-11.| Tag | Item | Source spec position | Decision / deviation taken | Reason |
|---|---|---|---|---|
| decision | Master orchestration moves back to Opus | sooner-orchestration-handoff.md says "coordinator rewrites are Codex-maintained" while Opus blocked. |
Opus 4.7 is now the planning seat. Codex stays as the implementation engine per codex-routing.md (80/20 Codex/Opus on code-touching turns). |
User explicitly invoked a master Claude session to drive synthesis and sub-sessions. |
| deviation | Form 2.5 (optional co-applicant) added to the funnel | gabriel-spec.md defines a 3-form funnel (Form 1 / Form 2 / Form 3) with no Form 2.5. |
Treat Form 2.5 as an optional branch off Form 2: if Q "Will a co-applicant be on the mortgage?" = yes, surface a parallel mini-form capturing co-applicant employment, income, debts. Otherwise skip. Renders inline on desktop, separate step on mobile. | Co-applicant data is currently buried inside app/sooner-app.html dashboard; needs to move upstream so SCS can run with both applicants' data before document upload. |
| deviation | Pricing-tier ladder (10% / 12.5% / 15%) added to T1 canonical | Engine packages/config/json/pricing-card.json has only a flat 16.5% monthly collection rate. criteria.v0.json has no fee structure at all. The 10/12/15% ladder is not modeled anywhere in code. |
Add a new contract section criteria.fees with shape:
{
"version": "0.1.1",
"tiers": [
{ "id": "all_three", "feePct": 10,
"services": ["closing_fee_financing","home_discovery","mortgage_brokerage"] },
{ "id": "two_with_cff", "feePct": 12.5,
"requires": ["closing_fee_financing"], "additionalAnyOf":
["home_discovery","mortgage_brokerage"] },
{ "id": "cff_only", "feePct": 15,
"services": ["closing_fee_financing"] }
]
}
T3 forms read this contract and dynamically display the applicable rate based on service selections.
|
User stated this is the canonical fee structure. Embedding once in T1, consumed by T3, prevents drift. |
| decision | Forms render consequences messaging live | Not in spec. | Each answer that changes pricing or doc requirements renders an inline advisory: e.g. "Selecting Mortgage Pre-Approval already in hand means we cannot help you switch banks." / "Adding Home Discovery drops your service fee from 12.5% to 10%." Implementation: declarative rules co-located with question definitions; messages are content slots, not modals. | User asked for forms to "tell the customer about the consequences of their actions." Doing this declaratively keeps it maintainable. |
| decision | HTML helper pages live in sooner-coordination/ (this folder) |
No spec position. | Both forms-inventory.html and matrix-browser.html live here. They are view layers over canonical data — they don't own data, they render data shipped from sooner-underwriting-sandbox (employer + location taxonomies) and sooner-gtm-forms (question definitions). |
Keeps inventory artifacts repo-agnostic. Avoids the trap of inventory living inside the code repo and getting stale at merge time. |
| tradeoff | Document-import opportunities highlighted only, not implemented | User scope. | Identify each form field that could be auto-filled from an uploaded document (Emirates ID, salary cert, bank statement, AECB report) and tag it in forms-inventory.html. Do not wire OCR or extraction yet. Tag class: importable-from. |
OCR pipeline is its own engineering effort (Bedrock vs Azure vs Extend AI bake-off per uae-ocr-strategy.md memory). Premature to mix. |
| decision | T3 question reconciliation against T1 A0 happens via a generated mapping doc | t3-field-audit.md recommends docs/criteria-field-map.md after A0 accepted. |
Maintain the mapping as a checked-in JSON file (sooner-gtm-forms/underwriting-funnel/field-map.json) keyed by canonical field name → list of form locations using it. Generate the human-readable view from JSON. |
JSON is diffable, lets us write tests that fail when a form drops a required field. |
| tradeoff | T1 sandbox stays not-on-GitHub for now | T1 STATUS.md flags this as an open blocker. | Don't block on GitHub publication this turn. The contracts are vendored into T3 already; downstream consumers don't need a remote until A1 sign-off. Open ticket exists. | Forces no work; can be solved out-of-band whenever GitHub App access is confirmed. |
criteria.v0.json. The 10/12/15% ladder needs to be added as a versioned contract addition (proposed 0.1.1).matrix-browser.html does not exist. The lender-facing /criteria page on the deployed sandbox covers gates + scoring weights but NOT the named employer matrix or location matrix in browsable+searchable form.PROPSEARCH_*, BUYER_PLATFORM_*, MATCHING_DB_URL) missing on Vercel/Railway — live search and scored locations return upstream_not_configured.docs/audits/ in underwriting-engine) but coverage gaps were filed as APP-1844 (still backlog).sooner-app.html.form/v5.html) is on a different code path.| # | Question | Default I'm assuming |
|---|---|---|
| Q1 | Where should forms-inventory.html and matrix-browser.html ultimately live? Inside sooner-underwriting-sandbox as part of the canonical surface, or stay in sooner-coordination/ as orchestration artifacts? |
Stay in sooner-coordination/ until A1 sign-off, then move matrix-browser.html into sandbox (lender-facing) and forms-inventory.html into sooner-gtm-forms/docs/. |
| Q2 | For pricing tiers — is "Closing Fee Financing" always required (i.e. the customer cannot choose Home Discovery + Mortgage Brokerage without CFF)? | Yes — CFF is the core product. Other two are upsells. The 12.5% tier assumes CFF + one upsell. The 10% tier assumes CFF + both upsells. |
| Q3 | Does Form 2.5 co-applicant data flow into the same SCS computation, or run as a parallel score that Reliable's underwriter weighs? | Same SCS — co-applicant income increases household income, co-applicant debts increase DBR. SCS is a joint score. |
| Q4 | Master Claude session — should the sub-sessions (T1, T3) commit back to a single shared dir (this sooner-coordination/) or should each session own its repo and the master just reads? |
Master writes to sooner-coordination/. Sub-sessions write to their own repos but emit handoff stubs into sooner-coordination/handoffs/ for the master to consume. |
| Q5 | Are T2 and T4 truly deferred for the next 2 weeks, or just lower priority? (Affects whether their contracts can drift independently.) | Deferred. T2 stays in In Review, T4 stays in Preping. No new commits on either track from the master. |
forms-inventory.html — table of Form 1 / Form 2 / Form 2.5 / Form 3 with question lists, lengths, info captured, gaps, doc-importable tags. Dispatch to codebase-explorer subagent to map question definitions, then this master writes the HTML.matrix-browser.html — searchable list of named employers + industry tier matrix + master-community / sub-community / developer tier. Reads from sooner-underwriting-sandbox/contracts/source-snapshots/employer-classification.json and community-classification.json.contracts/criteria.v0.json bump to 0.1.1; add fees section. Dispatch to Codex per routing rules.field-map.json — canonical → form-location mapping for T3 reconciliation against A0.form1.html) has partner income / commission / applyingWith state already wired; Form 2 (v5.html) has 7 co_applicant_* URL prefill params; underwriting-engine prototype (apply/documents.tsx) has full CoApplicantAnswers types + CoApplicantDocumentsSection. Decision: Form 2.5 evolves from these pieces; do not green-field. Open questions Q1–Q3 in §4 confirmed by Gabriel.sooner-gtm-forms/form/form25/ is NOT the Form 2.5 UI; it's the T2 CandidateIntake adapter (data normalization to C0 contract). Rename to sooner-gtm-forms/form/candidate-intake-adapter/ when convenient so we can use form/form2.5/ for the actual Form 2.5 UI without confusion.sooner-coordination/; sub-sessions own repos.forms-inventory.html. New P1 findings escalated to T3 scope:
form/v5.html:606) collects ANNUAL rent (placeholder "80,000", min 12000) but spec/Cat-I scoring expects MONTHLY. Silently breaks Lifestyle Alignment scoring. Fix in next T3 PR.form/v5.html:587–600 are NOT gated by a has_co_applicant yes/no. Every solo applicant gets asked. Fix: add the gate and pre-fill from Form 1's applyingWith URL param.po-* at app/sooner-app.html:1186–1322) duplicates Form 2 capture. Decide source-of-truth, pre-fill the other.co_applicant_full_name. Mismatch.fees source-snapshot following existing pattern; criteria.v0.json gets a pointer. Refined to 4 tiers (separate cff_plus_discovery and cff_plus_brokerage at 12.5% — lets advisory copy target each upsell). Required-spine encoded as a rules array. effectiveFrom yes, effectiveUntil no. New /pricing route (NOT folded into /criteria). Advisory copy stays in T3's consequences-rules.json. 5-slice PR ready, ~270 LoC. Gabriel's decisions pending.dc1aa1f per option C. Agent's 401c26e commit preserved in wip/t3-2026-05-19-pre-reset; working tree preserved in stash@{0}. Forward path: file Linear sub-issues from forms-inventory.html + t3-question-map.html; ship slice by slice.cds into sooner-coordination/ (a git repo as of today) before dispatching parallel agents, so each agent's worktree lands under sooner-coordination/.claude/worktrees/ rather than polluting work repos.fees.json + new aggregate SHA 6ded4dfb… + provenance correction note (single fix commit, since sandbox is pre-GitHub-publish), all viz HTMLs (forms-flow + inventory + impl-notes), kickoff prompts, and Linear tickets affected (GTM-70 advisory copy will reference 12.5% not 12%).sooner-coordination/sooner-forms-viz/index.html.cwd=sooner-underwriting-sandbox · Linear APP-1863cwd=sooner-gtm-forms branch t3/sooner-application-forms · Linear GTM-59sooner-coordination/handoffs/ (file-based handoff stubs per session-topology.md) + Linear ticket updates.