Skip to content
KAMOUniverse

Changelog

What's new.

Every improvement to the platform, as it ships.

  1. · kamo-internal

    Warn on navigating away / switching tabs with unsaved edits

  2. · 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.

  3. · kamo-internal

    Reorder outputs **************** + move save error toast to bottom

  4. · kamo-internal

    Render field markers inline after the label, not far-right

  5. · 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.

  6. · kamo-internal

    Inline red/yellow field markers + tab rollups; drop Profile Completeness pane

  7. · 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 ****************

  8. · 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).

  9. · 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).

  10. · 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

  11. · 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.

  12. · 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).

  13. · kamo-internal

    Put Loan Purpose first on the Loan tab (it drives field relevance)

  14. · 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.

  15. · kamo-internal

    Veteran-status field + map subject state/zip; enable VA eligibility; dedupe insights/completeness

  16. · kamo-shared-library

    Add isVeteran mortgage field (entity, DTOs, service, history)

  17. · kamo-internal

    Cross-field consistency checks (Data Checks card)

  18. · kamo-internal

    Purpose-aware profile completeness + weighted header meter

  19. · DaemonService

    Org-scoped inbound loan recognition in MeridianLink poller

  20. · kamo-shared-library

    Org-scope inbound LOS loan lookup + after-commit outbound push + inbound history audit

  21. · kamo-internal

    Honest DTI/payment labels for missing inputs (partial PITI, no-debts back-end, conventional-PMI MI)

  22. · kamo-internal

    Purpose-gate Eligibility Snapshot; hide unevaluable programs; merge HomeReady/Home Possible; sort UNKNOWN last

  23. · 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.

  24. · 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.

  25. · 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.

  26. · SecurityService

    Lead create/open LOS application endpoints + market-config MLOS fields

  27. · kamo-shared-library

    Lead↔LOS push/patch + outbound sync hook

  28. · 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.

  29. · 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.

  30. · 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