Delivery coverage, pricing sign-off, large-deposit panels
Replaces the final Coming-soon chips (Hedge & coverage, Pricing sign-off, Large-deposit) with live panels wired to the new steward proxies.
Steward console round 2 — exception queues, governance, MERS recon
- Capital + Underwriting: StewardExceptionQueue (shared panel) wired to the real steward-tasks endpoint — lock exceptions **************** and guideline exc...
Build out the mortgage steward console coming-soon features
Replaces stubs with real, endpoint-backed panels + fixes a dead-write bug: - Underwriting: Income calculation panel (qualification: DTI/PITIA/reserves/LTV + A...
Surface quotes in every vertical, not just retail
The Quotes tab was only wired into the RETAIL sub-tab set, so on an org whose active markets are SUBSCRIPTION / MORTGAGE / PERSONAL_LOANS there was no way to re...
Set the org LEI in Company Info (activates the HMDA ULI)
The Company Info card gains a Legal Entity Identifier field (20-char, upper- cased), sent through the existing org PUT — OrganizationController deserializes it ...
Resolve the org from the real request host, not the internal address
checkAccess resolves the tenant by looking up `org:domain:<hostname>`, and was being handed request.nextUrl.hostname — which behind Traefik is 127.0.0.1. That k...
Promote an ingested guideline version from the console
For a GUIDELINE source document the ingestion panel shows a "Promote as guideline version" card (product select + revision label). The rate-sheet card is now hi...
Apply the image policy to every page, not just the authenticated ones
The policy was attached only at the final `NextResponse.next()`, so /logout and /validate — both real, browser-rendered documents — were served with no img-src ...
Automatic logoff after inactivity (HIPAA 164.312(a)(2)(iii))
A session left open on an unattended workstation stayed usable indefinitely. This terminates it after 15 minutes of no interaction, with a 60-second warning so ...
Restore theme assets — CSP derived the wrong host and SVG was disabled
Avatars, org logos and backgrounds stopped loading for every tenant. Two separate regressions I introduced in 36ad904b, both live for hours. 1. The per-request...
Promote an ingested eligibility matrix from the console
For an ELIGIBILITY_MATRIX source document the ingestion panel now shows a "Promote as eligibility matrix" card: pick the product, limit type (MAX_LTV/CLTV/DTI),...
Authoring UI — list, line-item editor, share-link management
Completes the quote/estimate system: staff can now build a quote, price it, mint a share link and email it, all from the pipeline. app/lib/quotesApi.ts ...
Close the /_next/image open proxy
remotePatterns was [{ protocol: "https", hostname: "**" }]. That made the image optimizer a general-purpose fetcher: any caller could ask this server to retriev...
Show a facepile for group conversations
A thread with five people on it was represented by one arbitrary face, which reads as a message from one person. Up to three participants now overlap, so "sever...
Promote an ingested LLPA matrix into adjustments from the console
The ingestion panel could only publish a rate sheet. For an LLPA_MATRIX source document it now shows a "Promote as LLPA adjustments" card: pick the existing rat...
Show the other party in Sent, not the reader's own face
Both list views keyed a row on its sender, so every row of the reader's own outbox showed the reader — their photo, their name, their address. The message list ...
Commit outstanding work in progress
Staged and committed as-is so nothing is left uncommitted in the working tree. 5 files changed, 4879 insertions(+), 12 deletions(-)
Harden the kubectl download against flaky egress [skip ci]
dl.k8s.io over the runner's egress intermittently drops mid-transfer: curl: (56) OpenSSL SSL_read: decryption failed or bad record mac which fails the deploy ...
Show sender and recipient photos
The mailbox rendered a single letter on a single shared gradient for everyone, so every row looked the same and the circle carried no information. It now shows ...
Delete /api/set-token and /api/get-jwt-token; add route guards
Both routes were dead — no caller anywhere in kamo-internal, kamo-login or kamo-register — and both leaked credentials. /api/set-token built its upstream URL f...
Resolve template images from kept sources, not neighbouring slots
The composer re-resolved a template's image sources whenever the template config changed, and for 'member-avatar' it guessed the URL from whichever of signature...
Blink the mail icon while an unread indicator is showing
The unread badge alone was easy to miss in the top bar. NavItemButton gains a blinkIcon prop that pulses the icon (and its badge) — kept distinct from the exist...
Clarify MeridianLink market secret is the inbound-sync service credential (per-LO logins on member profile)
Double vertical scrollbar width for easier dragging
Bump the nav options scroll container from a 6px to a 12px webkit scrollbar and widen the thumb radius to match, giving members a larger drag target. The collap...
MeridianLink loan-officer credential card on member profile + lead-button LO pre-warn
Phase L3 of the MeridianLink LOS loan-officer mapping (per §3.4-3.6 of the design spec): - New member-scoped LOS-credential proxy **************** and type...
Drop redundant "+" — pen now sets the balance both ways
The credit-balance pen is now an absolute set-to-N editor (backend mints when the value is raised, invalidates the excess when lowered), so the separate "+" dis...
Re-trigger build for Bulk Email i18n (run 338 failed transiently)
Local `next build` compiles clean with the full dictionary (a95bc92); the prior CI build failed on a transient step, not on content. Re-triggering to bundle the...
Rebuild to bundle completed Bulk Email i18n strings
No code change — triggers CI to re-clone kamo-translation-dictionary (a95bc92) so the deploy bundles the 208 new **************** strings into messages/en.json ...
Add 'desktopMaster' to NavActionKey union — unblocks next build
The Master Machine launcher (navRegistry + NavOptionView + CommandPalette) references actionKey 'desktopMaster' but it was missing from the NavActionKey union, ...
Bulk Email campaigns UI — grid, editor, provider tab, leads action
Adds the org-level bulk email marketing surface under /marketing/email: - Bulk Email tab (after Social Media) + campaigns AG Grid workspace with live status/s...
Add Master Machine remote-desktop launcher (god-gated)
Third one-click desktop next to Linux/Windows: navRegistry entry (ComputerIcon), 'master' target through openKamoDesktop + the SSO proxy route, and dispatch in ...
Date-of-birth on lead view + create form
Adds a "Date of Birth" field under Primary Contact on /leads/view/[id] using a MUI DatePicker that opens to the year grid first (openTo=year, disableFuture, min...
Author document-requirement overlay rules from the steward console
The "what documents does this loan need" rule matrix had no authoring surface. This adds a Document-requirement rules section to the Documents & Conditions scre...
Author conditional LLPAs from the catalog panel
Adjustments could not vary by borrower: MlosAdjustmentCondition had no writer, and the pricing engine treats an adjustment with no conditions as always-applies,...
Confirm email when reassigning a lead from the lead-view
The Assignment card now reassigns via leadsApi.reassignLead, which surfaces the server's assigneeNotified flag. On a reassignment to a new member the toast read...
Bulk-reassign selected leads to a team member
The grid already had multi-select checkboxes but nothing to do with a selection. Checking rows now reveals a Reassign action beside the other lead actions, gate...
Render member photos on avatars inside the chat window
The small avatar icons in a chat popup — the per-message sender avatar (MessageBubble) and the seen-receipt list (SeenIndicator) — all read SessionMember.avatar...
Show member avatars in chat tool window title bars
The tool-window title bar renders its icon from the window STORE props — ToolDock passes `avatarSrc={w.toolId === 'chat' ? w.props.avatarSrc : undefined}` and f...
Surface real upload errors, sync god mode to session
"Save failed: Full logo upload failed" discarded the status and body, so a 403 from the branding gate read identically to a MinIO outage. The server's own messa...
Author eligibility matrices from the catalog panel
Without a matrix covering a scenario's occupancy and purpose, pricing returns NO_COVERAGE — so before this, only a purchase of a primary residence could be pric...
Rebuild the agent studio as a full-width workspace
Removing the width cap was not the fix; the layout itself needed to be designed for the space rather than tolerated in it. The studio is now three zones side b...
Author lock policies — without one, no rate can be locked at all
RateCommitmentService refuses a lock whenever the priced result carries no lockPolicyVersionId ("lock-policy version is required"), and a result only carries on...
Stop the promote preview overcounting rows the server will reject
The "N approved row(s) will publish" caption counted a row whenever an APPROVED note_rate and base_price candidate existed for it, ignoring the values. A price ...
Use the full page width; make renaming an agent visible
Two things I got wrong. **Width.** The brief was explicit — use the full width of the page, do not waste real estate — and I capped the studio at a centred 880...
Stop the lead view crashing on a lead with no name
/leads/view/{id} died with "Cannot read properties of null (reading 'preferredName')". LeadDTO.toDTO() only builds primaryContact inside `if (lead.getName() != ...
Show how each agent is doing
Adds a performance section to the top of the agent studio: conversations, how often a person took over and what triggered it, outreach outcomes, and cost. Writ...
Retry an upload with the MIME type the server actually detected
The upload validates the multipart part's Content-Type against the type the server detects from the bytes, and that part type comes from the browser's File.type...
Edit what each model costs
Adds per-model price editing to the provider setup screen. Prices are seeded from each vendor's published list price where we know it, and blank where we do not...
Show the AI handoff context to the agent taking over
Renders an AI_HANDOFF system event as a card with the reason, the AI's summary, and a collapsible transcript of the conversation so far - so the borrower does n...
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
