Borrower notifications close the collection loop
DocNotificationService sends transactional emails (established EmailTemplateServiceClient path, recipient = account primary member, portal link from org root do...
DOC_REQUEST + DOC_REJECTED canonical templates
Borrower document-collection emails (transactional, CAN-SPAM-exempt): a request nudge when the checklist is minted, and a return-for-reupload notice. Added to C...
Document-collection progress column
Per-loan doc progress (accepted/total + a colored bar, 'N from borrower' / in-review / complete) in the applications pipeline, fetched in one batch by loanFileU...
Remember Quick Tips open/closed per USER across all pages
The help column's visibility was stored in a single global localStorage key, so it wasn't scoped to the user. Introduce useQuickTipsVisible, keyed by user id (n...
Proactive checklist generation + pipeline doc summary
- Generate the scenario document checklist at APPLICATION_TAKEN (MortgagePipelineController transition hook) so it exists the moment a loan enters the pipelin...
Standardize Quick Tips help column + de-slop reference page
- Rename the help side-column title to "Quick Tips" everywhere (SettingsView reads **************** whose value is now "Quick Tips"). - Add a shared HelpConte...
Nested sub-options so deeper items (e.g. Settings sub-topics) are reachable
The sub-option menu only rendered one level, so a sub-option that itself has sub-options (Settings topics → sub-topics) was inaccessible. - NavToolButton now r...
Member-configurable navigation — drag options between rail & top bar, expandable rail, per-member layout
Turn the two hardcoded navs (NavPri/NavTop) into a data-driven, per-member system. - Single nav registry (navRegistry) + pure resolver (resolveNavLayout) enfor...
**************** self-heal
Idempotent re-link of every borrower on a loan to its account-party, callable from the document surfaces so an upload can always resolve the borrower's vault pa...
Document vault tab — parties, requirements, satisfy/accept/reject
- AccountDocumentsTab: per-borrower-party view of the account's document vault and per-loan requirements. Upload once, satisfy every loan (satisfy-across); st...
Proxy the vault-backed requirement surface
- MlosDocClient: POST verbs (generate, satisfy, accept, reject, satisfy-across) + enriched loan/party reads over X-Internal-Auth. - MortgageAppController /{ui...
Account-borrower-party link service + vault finders
- **************** find-or-create the reusable account-party (document-vault shared-human key) for each loan Borrower; dedup ssn4+dob, else primary→account....
Transaction drill-in drawer in the pipeline
Clicking a multi-loan deal opens a right drawer showing the group status + each member loan (borrower, property, loan status), each clickable through to the loa...
Transaction detail endpoint GET ****************
Returns one deal group's rolled-up summary + each member loan's AppMortgageSummaryDTO (drill-in for the per-transaction pipeline). Operator view or a party to t...
P4 member document vault backend (reusable docs across loans)
- MemberDocumentService: upload a doc ONCE at AccountBorrowerParty scope → ImageService creates an Img in the auto-created imaging-member-vault bucket *******...
Per-transaction pipeline — list per deal, not per loan (owner req)
ApplicationsPipelineConsole now lists ONE row per LoanTransaction (its representative loan + any not-yet-grouped legacy loans), with a pinned 'Deal / Status' co...
KamoMLOS portal default-product designation in vendors-products (#11)
A star toggle on each product designates the org's single KamoMLOS portal auto-assign product (single-active). Gated via GET /lead-vendors/mlos-readiness: shown...
P3 default-product designation backend (single-active) + operator readiness
- **************** designates ONE LeadVendorProduct as the org's KamoMLOS portal auto-assign product; single-active (demotes any other, org-scoped, fail-close...
P2c leads-first portal backend
- MortgageVerticalResolver: resolves an org's RESIDENTIAL_MORTGAGE LeadMarket, MORTGAGE CommerceMarket, designated default LeadVendorProduct, and EFFECTIVE PO...
Account-merge admin UI (MERGE_ACCOUNTS)
AccountManager gains a Merge Accounts action (gated by **************** select exactly two customer accounts, pick the survivor, optionally keep the duplicate's...
P2a account-merge tool + P2b transaction backend
P2a — admin account merge (owner requirement A), gated by MERGE_ACCOUNTS: - AccountMergeService: reparents EVERY account_uid child via native UPDATE (bypasses J...
P1 entity foundation — lead-first / account-centric / transaction-grouped refactor
NEW entities (additive; KI runs DDL): - TransactionGroupStatus enum + LoanTransactionStatusDeriver: derived group lifecycle (Created→…→Completed) rolled up fr...
Borrower self-service authorization (loan-party IDOR guard)
A borrower is a plain org Member with no operator LOS rights; they may act on the ONE application they are a party to — and only that one. Layered guard: operat...
Borrower loan-party ownership on AppMortgageService
Adds the ownership primitives for borrower self-service (a borrower is a plain org Member with no operator LOS rights): - createBlankOwnedByMember(orgId, member...
Borrower-journey column + intake filter in the loan pipeline
The sub=pipeline datagrid (ApplicationsPipelineConsole) now shows pre-app-taken borrower-journey progress so org employees can review an application's status as...
Pre-app-taken borrower-journey endpoint for the operator pipeline
New GET **************** (LOS_VIEW_PIPELINE) returns per-DRAFT borrower-intake progress so pipeline stewards can watch a loan take shape while the borrower is s...
LOS controllers accept per-borrower *** sessions (doc03 §0.1)
BaseLosController now resolves the caller's session via CallerSessionResolver (X-OTK-validated attribute FIRST — operators/BFF unchanged — then a first-party **...
LOE-Core server-authoritative program scorer + /programs/scores (doc03 §9 Phase 2)
Ports the KamoMLOS client scorer (lib/los/scoring.ts) into SecurityService LOE-Core: LoeCoreScorer scores the org's effective program catalog (baseline deep-mer...
Seed the 17 real program rulesets (doc03 §9 Phase 1)
Migrates the authoritative ProgramRuleset data from the KamoMLOS client ruleset files into **************** (17 codes, extracted faithfully) and replaces Progra...
Real deep-merge for org program-ruleset overrides (doc03 §9 Phase 0)
Replaces the M2 last-write-wins mergeOverlay placeholder (which silently discarded the authoritative baseline on any org override) with a recursive JSON deep-me...
MlosExtractedCandidate staging entity for the ingestion pipeline (D48)
The terminal per-field output of MLOSIngestionService's parser: a staged, reviewable extraction candidate (segment/source-doc FK, targetEntity, fieldPath, cellR...
Isolated best-effort profile write-back for legal-wall paths (D47)
mergeFactsBestEffort runs the enrichment write-back in its OWN transaction (REQUIRES_NEW) so a failure can never roll back the caller's transaction — the safe w...
State Based Licensing section on member my-profile
New SectionCard (NMLS ID + per-state licensed table with actively- providing checkbox and renewal/expiry dates, renewal<=expiry validated). Gated by ***********...
Member state-licensing API + license-aware lead availability
Add MemberStateLicensingController (GET/PUT /api/security/members/{id}/ state-licensing) gated by STATE_LICENSING_* rights with server-side renewal<=expiry vali...
State-based member licensing + lead-acceptance gate
Reuse mlos.legal StewardLicense as the single per-member/per-state NMLS registry (add activelyProvidingBusiness). Add member-level Member.nmlsId. Add General-Pe...
Add Source to the mappable lead fields
Lead 'source' is shown on the lead detail page but was missing from the import field list; add it (path 'source') now that the backend importer + CreateLeadRequ...
Map an imported column to the lead `source` field
Add case "source" to setDirectFieldOnCreateRequest so the mapping path 'source' is honored.
Add importable `source` field to CreateLeadRequest + persist it in createLead
The Lead has a free-text `source` (shown/edited on the lead detail page) but it was not importable — CreateLeadRequest had no source field, so createLead never ...
Add ScenarioProfileSource.PRICING for scenario-writer FICO/ratio write-back (D45)
Canonical scenario-fact spine — genesis deriver + factsJson populate + write-back + overlay matcher (D45)
D1/D45 broadens BorrowerScenarioProfile consumption. Populates the dormant factsJson and makes it the shared source of truth for borrower/loan facts: - Scenari...
Channel applicability rules collection CRUD — completes §3.2 config
createChannelRule/update/delete on the D31 flat-collection spine (profile-level, org fail-closed, WORM change-log); controller /channel-rules GET/POST/PUT (dele...
Product enablement config — per-program single-active, effective-dated
**************** (program-scoped demote-then-insert) + reads; controller /product-enablements GET (active per program) / PUT (publish). Body carries programId, ...
Policies tab — effective-dated pricing/capital/servicing config
New MortgagePoliciesTab: current active version + publish-new-version form + version history for each of the three effective-dated policies; configTypes/configA...
Effective-dated profile policies — pricing/capital/servicing publish
New MlosPolicyWriteService (isolated; its own repos so the config-collection write- service is untouched): single-active demote-then-insert versioning on the sa...
VersionedProfilePolicy interface for effective-dated policies
Pricing/Capital/ServicingPolicy implement it so one publish routine drives the single-active demote-then-insert versioning.
Investor delivery + commitment rule sub-editors
The expanded investor row gains Delivery (funding behavior / execution path / remittance) and Commitment (type / min pull-through % / pair-off) editors alongsid...
InvestorConfig delivery + commitment rule sub-collections CRUD
**************** (+update/delete) on the D31 config spine (org fail-closed via the parent investor, WORM change-log per row); controller /investors/{id}/deliver...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.