Rebuild on shared-lib resolver hotfix (boot crash: LenderProfileRepository)
MortgageProviderResolver deps → ObjectProvider — was crash-looping MediaService
The @Service is component-scanned by every com.kamo service, but mlos.config repositories only exist where @EnableJpaRepositories registers them. Hard construct...
'Meet your loan officer' — the borrower hears the moment their lead is accepted
On accept (ASSIGNED), best-effort MEET_YOUR_LO email to the mortgage lead's borrower: the accepting LO's real name + NMLS + email + a continue-application link....
MEET_YOUR_LO canonical template — borrower intro when an LO accepts their lead
Preferred name fills AKA+first; pool entry publishes the realtime lead event
(1) The funnel's preferred name now writes nameFirstAKA AND stands in for nameFirst until the legal name arrives (owner rule) — it was landing on first name onl...
CreateFromLead saved Declarations against a transient Borrower — save the app graph first
Same latent TransientPropertyValueException the blank create() fixed at its first caller; createFromLead's first real caller is the portal promote seam (caught ...
The lead→application conversion seam — POST /portal/promote
The funnel was a closed loop: nothing ever converted the portal lead into an application (blank mints only — no sourceLead, no seeded fields, no LO inheritance)...
AccountGuid insert always violated FIRST_SEEN_AT NOT NULL — ZERO portal leads ever created
Hibernate includes every mapped column in INSERT (no @DynamicInsert), so the unset timestamp went out as explicit NULL and the DB default never applied. Every v...
Member tooltip shows last active datetime + time ago
Interaction Center member rows now show a two-line tooltip: availability status plus when the member was last active — 'Active now' while online, otherwise 'Las...
Durable last-seen timestamps + bulk endpoint
PRESENCE:{id} is deleted the moment a member goes offline, so nothing recorded when they were last active. Stamp PRESENCE_LAST_SEEN:{id} (orgId + ts, 400d TTL) ...
Borrower pricing-quote endpoint — party-gated, integration-config-gated
POST **************** caller must be a loan party (or pipeline steward); resolves the tenant's PRICING_PPE integration — NOT_CONFIGURED / EXTERNAL_VENDOR_PENDIN...
Integrations-status endpoint — the portal's honest view of the org's vendor wiring
GET **************** per-category **************** runtimeVendor from the market integrations config via the runtime resolver. Session-gated; no secrets.
The doc-04 vendor RUNTIME — MortgageProviderResolver + VendorTypeBridge
The integrations tab wrote MortgageProviderConfig rows nothing consumed at runtime. Resolver: (org, VendorCategory) → activation-gated, profile-scoped, first-en...
Reply-all no longer CCs yourself; blank lines survive send
Reply All excluded only activeMailbox.emailAddress, which is unset on the default personal mailbox view — so your own address (from the original To:) landed in ...
AI vision document extraction — docs → org's vision provider → VerifiedFact(OCR)
The first producer of VerifiedFactSource.OCR: POST **************** reads a vault document (bank **************** ID) with the ORG'S OWN configured vision provi...
Real verified-fact reconciliation — evidence facts now populate the URLA
Replaces the M3a log-only stub: asset.* facts (grouped per source document) become Asset rows and employment.* facts become Employment rows via BorrowerSectionS...
ClaimedFactsDTO carries the FULL mortgage lead (35 fields)
Adds the 16 fields the portal structurally couldn't send (monthlyDebts, taxes, insurance, HOA, currentPayment, sellerCredits, renovationCost, borrowerAge, isVet...
Company NMLS ID field in org Company Info
Edit + read row + hydration + PUT (nmlsId). Feeds the borrower portal footer trust pill and the originator projection's company NMLS.
NmlsId is patchable — the company NMLS finally has a write path
Organization.nmlsId (SAFE Act identifier feeding the originator projection's originatorOrgNmlsId and the borrower portal's verified-license pill) was readable e...
Mortgage fields as 3 column panes on the Client Lead Data tab (reuse form via layout prop)
Add layout?: 'tabs' | 'panes' to MortgageFieldsComponent (default 'tabs', byte-identical to the existing Mortgage Workshop rendering). editControls, loanFields,...
Weld the LO chain — portal leads enter the accept-lead pool; accepted LO survives conversion
(1) PortalLeadService routes a portal lead into the credit-based assignment pool (requiresAssignment=true) the moment it has a contact point — portal leads were...
Live header KPIs from the draft; sellerCredits in cash-to-close; nav guard only when actually dirty
Keep form + What-If as one grid cell so the outputs panel stays in the right column
The What-If move made MortgageFieldsComponent render Card + whatIfSlot as sibling children; since MortgageDetailsTab lays out its children in a 2-col grid, What...
Rebuild to pull renamed 'Mortgage Workshop' leads tab from translation dictionary
Make What-If Studio its own pane below the form (drop the 4th tab)
Removes the "What-If Studio" sub-tab; the Scenario Sandbox now renders as its own pane below the Loan/Borrower/Subject Property form. Retitled "Scenario Sandbox...
Address-field layout + move agent block to Borrower tab + Payment above Eligibility
- Subject Property: Address + Address Details half-width side by side; City/State/Zip on one row (md 5/4/3, Zip narrowest). - Move buyer's-agent block (Repres...
Restore two-column outputs layout (Rate above Insights in the left column)
Prior reorder pushed Rate/Insights into the right column, collapsing the balance onto one side. Keep the short summary cards in the LEFT column (Rate directly a...
Rebuild against shared-lib (sellerCredits + JsonIgnoreProperties lead DTO tolerance)
Add sellerCredits field + @JsonIgnoreProperties tolerance on lead request DTOs
Mirrors renovationCost: entity column, 3 DTOs (CreateLeadRequest/ UpdateLeadRequest/LeadDTO MortgageFieldsDTO + LeadDTO builder), LeadService create/update pass...
Remove Cash-to-Close card; move buyer's-agent fields to Subject Property tab
Drop response-only enum string mirrors from mortgage save payload
The lead update was 400ing — UpdateLeadRequest rejects unknown fields and the form round-tripped LeadDTO's **************** strings (which only exist on the res...
Clear core-card edit on nav + guard communications composer draft
Discard the open core-card edit (release its pane lock) when the user proceeds past the unsaved-changes confirm in setTab/guardedNavigate, so editingCard no lon...
Remove estimate/disclaimer footnotes from scenario cards
Drop the EstimatedNote component and its plumbing, and the AI-narrative verify-before-relying disclaimer, per owner request to stop showing estimate/disclaimer ...
Surface recommended (yellow) fields even before a loan purpose is set
The blank-lead fallback returned only the required set, so a purpose-less lead showed red markers but never yellow. Now **************** are flagged as recommen...
ClosingHorizon — shared §5 close-date heuristic (stage → business days)
One source for the closing horizon so the capital-markets forecast and the doc-freshness sweep project the SAME close date. A calibrated CDF replaces the table ...
Inline red/yellow field markers + tab rollups; drop Profile Completeness pane
Translate Residential-Mortgage grid columns + Purpose filter
Replace the literal column headers (Purpose/Loan Amount/LTV/DTI), the Loan Purpose filter label, and the filter option labels with next-intl t() keys **********...
Rebuild against shared-lib Phase-4 fields (renovationCost + currentLoanType + LeadFieldPatch)
Residential-Mortgage columns (Purpose/Loan Amount/LTV/DTI) + Purpose filter
On /leads, when the selected market is a Residential Mortgage market, show four columns to the right of State: - Purpose — mortgageFields.loanPurpose, title-ca...
Rebuild against shared-lib Phase-4 fields (renovationCost + currentLoanType + LeadFieldPatch)
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.