Skip to content
KAMOUniverse

Changelog

What's new.

Every improvement to the platform, as it ships.

  1. · kamo-shared-library

    FindByStatus finder (freshness sweep enumerates ACCEPTED requirements)

  2. · SecurityService

    Staff vendor-doc upload endpoint satisfies third-party requirements

    POST **************** (LOS write): staff upload an appraisal/title/HOI/flood doc to the loan-level image store, then satisfy the loan's THIRD_PARTY requirement with it → RECEIVED (staff then accept → clears). Gives vendor documents an actual home + satisfy path instead of forcing a condition waive.

  3. · SecurityService

    Cascade condition waive/delete to document requirements

    waiveCondition and deleteCondition now best-effort call MLOSDocService's suppress-for-condition after a successful waive/delete, so a waived condition's requirements flip to WAIVED (delete → NOT_APPLICABLE) and the borrower portal stops demanding the document for an obligation the steward already removed.

  4. · SecurityService

    Notify borrower when they've submitted all documents (DOC_COMPLETE)

  5. · EmailService

    DOC_COMPLETE preview sample variables

  6. · kamo-shared-library

    DOC_COMPLETE canonical template (borrower has submitted every requested document)

  7. · SecurityService

    Daily outstanding-document reminder sweep (re-nudge borrowers, throttled)

  8. · kamo-shared-library

    FindBorrowerOutstandingForNudge (stale outstanding requirements for the reminder sweep)

  9. · SecurityService

    Notify borrower when a document is accepted (DOC_ACCEPTED, per-party routed)

  10. · EmailService

    DOC_ACCEPTED preview sample variables

  11. · kamo-shared-library

    DOC_ACCEPTED canonical template (borrower confirmation a submitted doc cleared)

  12. · kamo-internal

    Surface 'Needs review' (borrower-submitted docs awaiting staff) as a distinct, prioritized state

    A borrower's uploaded document flips the requirement to RECEIVED (awaiting lender), but the Documents column only showed 'Awaiting borrower' or a neutral 'In review' — so a doc waiting on STAFF sat invisibly until someone opened the account tab. Surface awaitingLender as a prominent violet 'N to review' that takes precedence over the amber borrower-waiting label, since it is the state the loan officer can act on now.

  13. · kamo-shared-library

    Centralize §4.5 supersession-collapse (RequirementSupersession)

    The freshness engine leaves a STALE_EXPIRED predecessor beside its fresh successor under one **************** Only the read path (ConditionClearabilityComputer) collapsed those dead heads out; the write/count paths used raw repo queries and disagreed. Extract the collapse to ONE pure shared helper (liveHeads / supersededUids / isSuperseded) so the clear-trigger, satisfy fan-out, and pipeline summary all agree with the read.

  14. · SecurityService

    Borrower notifications close the collection loop

    DocNotificationService sends transactional emails (established EmailTemplateServiceClient path, recipient = account primary member, portal link from org root domain): - DOC_REQUEST once when a loan reaches APPLICATION_TAKEN (checklist minted). - DOC_REJECTED when staff return a document (both the loan-scoped and party-scoped reject paths), with the doc name + reason. Best-effort — never blocks the document action.

  15. · EmailService

    DOC_REQUEST/DOC_REJECTED preview sample variables

  16. · kamo-shared-library

    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 CANONICAL_KEYS + 4 resource files (doc-request/doc-rejected .json/.html), seeded on-demand per org.

  17. · kamo-internal

    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 loanFileUid. Makes the document system visible in the processor's daily working view.

  18. · kamo-internal

    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 (not member id) so the open/closed choice is consistent for a user across every page and every org/member context, and never leaks between users on a shared browser. A custom event keeps mounted columns and other tabs in sync on toggle. SettingsView now uses it.

  19. · SecurityService

    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 pipeline — no waiting for a view. - Keep the checklist current: the loan document-requirements GET now always regenerates (idempotent) so newly-entered employment/gift/program facts add their requirements. - POST **************** pipeline-gated batch proxy for the per-loan collection-progress column.

  20. · kamo-internal

    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 HelpContent component set **************** **************** — one accent colour, one list marker, no emoji, semantic colour reserved for meaning (e.g. permission states). - Rewrite the Essential Settings help content (behavior-labeling, security-roles, departments, job-titles) with those components: removed the 💡 emoji and the green/blue/red decorative bullets; permission states keep meaningful colour. All translation keys preserved.

  21. · kamo-internal

    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 renders nested children as accordions in every placement (bar popover, collapsed rail fly-out, expanded rail inline). A parent with a destination navigates on row click while its chevron expands/collapses the children; chevron toggles use a span (not a nested <button>) to keep valid HTML. - Restore the full settings tree as data (settingsMenu.ts) — every topic and its sub-topics with routes + gates, ported from the retired SettingsStatusWindow, including the market-gated CRM sub-topics — and drive SettingsButton from it. - Add the two settings label keys the old window resolved by fallback (universe, loanProducts).

  22. · kamo-internal

    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) enforcing the invariants: every gated option lives in exactly one nav, gate-hidden options drop, newly-eligible options land at their default, nothing is ever lost/duplicated. - NavLayoutContext persists the layout per member via the existing ui-preferences store (cross-device, no backend change) and drives --nav-pri-width so an expanded rail reflows the shell with no magic numbers. - Always-on drag between NavPri and NavTop plus reorder within each nav screen-reader announcements. - NavPri gains expanded (icon + label + inline sub-lists) and collapsed (icons-only, fly-out sub-options) modes with hover-to-peek and a collapse toggle; adds active-route highlighting + aria-current; triggers are real <button>s. - The five tool buttons **************** become portable via one NavToolButton primitive — downward popover in the bar, right fly-out in the collapsed rail, inline list in the expanded rail — preserving their exact handlers. - Dedicated /settings/navigation page: move/reorder options, choose rail behavior, Reset to Standard with undo; linked from the Settings slide-out (top) and /settings. - ⌘K / Ctrl-K command palette to jump to any option. - Desktop/tablet only (gated on the md breakpoint); mobile keeps the static nav. - Deletes the superseded nav plumbing (NavPriItemWithPanel, NavPriLayout, NavPriPanel, NavInfo, NavPanelLink, NewDocumentButton).

  23. · kamo-shared-library

    **************** 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 party — even for loans created before the link hooks shipped.

  24. · kamo-internal

    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); staff accept/reject received submissions; status + waiting-on at a glance. - memberDocsApi client + **************** catch-all proxy (JSON + multipart upload) to SecurityService. - Replaces the Documents tab 'coming soon' placeholder in AccountViewClient.

  25. · SecurityService

    Proxy the vault-backed requirement surface

    - MlosDocClient: POST verbs (generate, satisfy, accept, reject, satisfy-across) + enriched loan/party reads over X-Internal-Auth. - MortgageAppController /{uid}/document-requirements: enriched loan requirements (self-heals — mints the baseline checklist on first view), generate, satisfy (loan-party gated), accept/reject (steward write only). - MemberDocumentController: account parties list, party requirements (across loans), satisfy, satisfy-across, accept/reject — the account/party vault surface for staff (LOS rights) and borrowers (party membership). - MemberDocumentService: listPartiesForAccount, resolveAccountUidForMember, isMemberOfAccount.

  26. · kamo-shared-library

    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.primaryMember, else create; enrich existing on new facts. - Hooks: BorrowerSectionService (create/createPair/update) + AppMortgageService .stampOwnershipAndGet backfill (authoritative relink once the account exists). - **************** DocumentRequirementRepository .findByBorrowerUidIn + **************** (vault cross-loan reach). - **************** surfaced.

  27. · kamo-internal

    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 loan; a single-loan deal opens its loan directly. Fetches GET **************** ****************

  28. · SecurityService

    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 the deal (isMemberPartyToTransaction).

  29. · SecurityService

    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 **************** hashes computed server-side) + MemberDocument catalog row; list by party/account. Fail-closed loan-party guard (isMemberPartyToPartyAccount). - MemberDocumentController /api/security/member-documents (POST upload multipart, GET list): operators manage any party's vault (LOS_VIEW_PIPELINE); a borrower only their own account's parties. The vault Img is the reuse anchor RequirementSatisfier(imgId) points at to satisfy per-loan requirements across many loans (satisfy-wiring is the next slice). Compiles clean; no schema change (P1 entities).

  30. · kamo-internal

    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' column showing the derived group status chip, an N-loans chip for multi-loan deals, and a denied-exception flag. Fetches **************** (+ TransactionSummaryDTO type) and joins to the loan rows. Buckets/filters/journey re-based onto the transaction-representative rows.

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