Changelog
What's new.
Every improvement to the platform, as it ships.
· kamo-internal
Warn on navigating away / switching tabs with unsaved edits
· kamo-internal
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 footnotes on the mortgage scenario cards.
· kamo-internal
Reorder outputs **************** + move save error toast to bottom
· kamo-internal
Render field markers inline after the label, not far-right
· kamo-shared-library
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 later.
· kamo-internal
Inline red/yellow field markers + tab rollups; drop Profile Completeness pane
· kamo-internal
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-cased **************** - Loan Amount — compact "574k" via new fmtK() - LTV / DTI — computed by the mortgage engine (ltv()/dti().backEnd), one decimal All render an em-dash when their field/inputs are unset. Loan Purpose also gets a toolbar filter (mirrors the productFilterValue pattern: state + Select + filter in both filteredRowData branches + reset + browser-state persist), shown and applied only in the Residential-Mortgage view so it can't silently empty a non-mortgage grid. Gate: preserve market.salesSubType (already in the API, previously dropped) and derive isResidentialMortgageView = currentMarket.salesSubType === RESIDENTIAL_MORTGAGE. Data comes from the widened LeadListDTO; no leadsApi change (mapLeadResponse spreads). New pure helpers fmtK + loanPurposeLabel are unit-tested ****************
· kamo-shared-library
Carry mortgage figures in LeadListDTO for the /leads grid
The /leads Residential-Mortgage columns (Loan Amount, Loan Purpose) and the client-side LTV/DTI need mortgage data the lean list projection didn't ship. Widen ListMortgageFields + fromLead with loanAmount, loanPurpose(+id), propertyValue, purchasePrice, downPayment, currentLoanBalance, cashOutAmount, estimatedIncome, monthlyDebts, annualPropertyTaxes, annualInsurance, monthlyHoa — mirroring LeadDTO.MortgageFieldsDTO and its loanPurpose.name() encoding. Still carries no contact PII (no street/city/zip, e-mail, or phone).
· kamo-shared-library
Sync renovationCost + currentLoanType through MeridianLink mapper (ids TODO-flagged)
Extends the isVeteran LO-XML wiring (1f583db) to the two new renovation/ streamline-refi fields added in 4A (5132026). - LoXmlFieldMapper: FIELD_RENOVATION_COST (sRehabTotalCost) + FIELD_CURRENT_LOAN_TYPE (sProdCurrentLoanT) constants, both TODO-flagged as unconfirmed convention guesses, added to TRACKED_FIELD_IDS. leadToLoXml emits renovationCost via money() and currentLoanType via putIfPresent(); loXmlToLead parses them via parseMoney()/trimToNull() as the new trailing patch components. - LeadFieldPatch: canonical record grows to 9 components (…isVeteran, renovationCost, currentLoanType); the 6-arg backward-compat aux constructor now defaults all three trailing components to null so SecurityService's 6-arg LOS-apply test keeps compiling. - LeadService.applyLosPatch: two null-guarded write-backs recording mortgage.renovationCost / mortgage.currentLoanType history keys, mirroring isVeteran. - LoXmlFieldMapperTest: emit/parse/absent coverage for both fields + updated trackedFieldIdsAreTheSyncedSet assertion. - LeadServiceLosTest: updated 4 pre-existing 7-arg LeadFieldPatch(...) call sites to 9-arg (collateral compile fix, no behavior change).
· kamo-internal
Renovation family (203k/HomeStyle) + streamline refis (FHA Streamline/VA IRRRL)
Adds two new stated-lead inputs (renovationCost, currentLoanType) and five eligibility rows gated on real borrower signal, matching the existing show-only-when-signaled discipline: - FHA_203K_LIMITED / FHA_203K_STANDARD: forward + primary-only, split on the $75k rehab-cost boundary - HOMESTYLE_CHOICE: conventional renovation analog, any occupancy (merges HomeStyle + CHOICERenovation into one row) - FHA_STREAMLINE / VA_IRRRL: refi-only, gated on the existing loan's type
· kamo-internal
Projected Close section — surfaces the §5 close-date forecast
Capital & Risk console now fetches /closing-forecast and shows each active loan's projected close date (stage-based business-day horizon), soonest-first. Best-effort (never fails the console). Makes the close-date engine end-to-end usable.
· kamo-shared-library
Add renovationCost + currentLoanType mortgage fields
Mirrors the isVeteran field (3f0cea1): entity column, 3 DTOs **************** MortgageFieldsDTO + LeadDTO builder), LeadService create/update passthrough, and LeadHistoryFieldRegistry descriptors (mortgage.renovationCost, mortgage.currentLoanType). Both nullable, no default. Unlocks the renovation-family and streamline-refi program eligibility work (Task 4B/4C).
· kamo-internal
Put Loan Purpose first on the Loan tab (it drives field relevance)
· kamo-shared-library
Sync isVeteran through MeridianLink LoXmlFieldMapper (id TODO-flagged)
Wires LeadClaimMortgage.isVeteran into the LO-XML round trip using the convention field id aBIsVeteran (matches the aB... borrower-attribute prefix of aBFirstNm/aBLastNm) with a TODO to confirm the id and 1/0 encoding against the tenant LOXmlFormatDefinition.xml. - LoXmlFieldMapper: FIELD_BORROWER_IS_VETERAN constant + TRACKED_FIELD_IDS entry, leadToLoXml emits "1"/"0", loXmlToLead parses via new parseBool helper (1/true/y/yes -> TRUE, 0/false/n/no -> FALSE, else null). - LeadFieldPatch: new trailing isVeteran record component. - LeadService.applyLosPatch: applies inbound isVeteran, records mortgage.isVeteran history key (matches LeadHistoryFieldRegistry from the 3A commit). - LeadServiceLosTest: updated 4 pre-existing LeadFieldPatch(...) call sites for the new record component (collateral compile fix, no behavior change). - LoXmlFieldMapperTest: new coverage for true/false/null round-trip in both directions.
· kamo-internal
Veteran-status field + map subject state/zip; enable VA eligibility; dedupe insights/completeness
· kamo-shared-library
Add isVeteran mortgage field (entity, DTOs, service, history)
· kamo-internal
Cross-field consistency checks (Data Checks card)
· kamo-internal
Purpose-aware profile completeness + weighted header meter
· DaemonService
Org-scoped inbound loan recognition in MeridianLink poller
· kamo-shared-library
Org-scope inbound LOS loan lookup + after-commit outbound push + inbound history audit
· kamo-internal
Honest DTI/payment labels for missing inputs (partial PITI, no-debts back-end, conventional-PMI MI)
· kamo-internal
Purpose-gate Eligibility Snapshot; hide unevaluable programs; merge HomeReady/Home Possible; sort UNKNOWN last
· SecurityService
Internal LOS apply endpoint for inbound sync
POST **************** {leadUid, provider, loXmlFields} — server-to-server (no session/rights). Constant-time X-Internal-Auth check against the cluster internal-auth secret; missing/wrong header -> 403 before any lookup or mutation. Maps LO-XML via LoXmlFieldMapper.loXmlToLead and applies MeridianLink-wins via LeadService.applyLosPatch (which emits the realtime LEAD_UPDATED). Called by the DaemonService inbound poller.
· DaemonService
MeridianLink 60s inbound poll job
Drain the per-appCode modified-loans queue (collapsed to distinct (instanceBaseUrl, appCode) poll-units) and forward recognized field changes to SecurityService's internal LOS apply endpoint via RestTemplate + X-Internal-Auth. Recognized loans (a LeadLosLink exists) are applied then cleared + lastPulledAt stamped (injected clock); unrecognized loans and failed applies are left in the queue. Failure-tolerant, null-guarded, Quartz 60s trigger; PLATFORM_ENC_KEY mounted for the creds resolver.
· kamo-internal
Lead Create/Open Application button + LOS proxy routes + leadsApi
Phase 7 of the MeridianLink external-LOS integration: adds the header button that creates or opens a lead's linked MeridianLink loan file, the Next.js proxy routes it calls, and the leadsApi/type surface that carries losProvider/losLinkStatus from market-config.
· SecurityService
Lead create/open LOS application endpoints + market-config MLOS fields
· kamo-shared-library
Lead↔LOS push/patch + outbound sync hook
· kamo-internal
MLOS integration dropdown on market modal
Add a MLOS Integration dropdown **************** to the market Add/Edit modal, shown only for Service > Residential Mortgage markets, plus a Configure button beside it. Configure is disabled until the market is saved; for MERIDIAN_LINK it opens the new per-market Configure dialog, for KAMO_MLS it deep-links to the existing internal MLOS console (the single POS commerceType:MORTGAGE market's Integrations tab), and ENCOMPASS_ICE stays disabled with a "coming soon" tooltip.
· kamo-internal
MeridianLink per-market Configure dialog
New MeridianLinkConfigDialog, modeled on the platform OAuth EditDialog, scoped to a single LeadMarket's connection via losConnectionApi (Phase 3 backend). Edits **************** plus a write-only client secret (blank keeps the stored ciphertext), with a Test Connection action and load-on-open via losConnectionApi.get.
· kamo-shared-library
Active-filtered MarketLosConnection finder
Adds **************** so consumers can treat a soft-deleted (isActive=false) LOS connection as absent, mirroring SocialConnectionController's active-filtered read pattern. No schema change — is_active already exists via EmbRecordState.

Your universe is waiting.
Start free in minutes. Add products whenever you are ready — no migration, no new logins.
Free forever — no credit card required