Make reads read-only, leaving one writer of the *** TTL
The expiration on the Redis record IS the session: when it lapses the member is signed out. Reading a session no longer touches it. Only genuine interaction ext...
Resolve deprecation through the app catalog
An app the operator retires has to disappear everywhere, not just from the apps page — otherwise it keeps showing up in the security-model editor and in entitle...
Make the accept-popup's judgement calls testable, and settle the deferred minors
Drop the Notes settings page and section
The Notes settings page was only a ComingSoonTab placeholder, so it gave members a nav entry and a landing card that led nowhere. Remove the route along with ev...
Consolidate the member surface onto ?tab=legal-compliance
The standalone **************** route rendered the same component as the settings tab behind a second URL. Delete it and keep the tab: one surface, one entrance...
Sign on (envelopeUid, recipientUid, orgId), not a SignerSession
**************** now take the triple. The public controller keeps resolving it from SIGNSESH, so the signer app is unchanged; a staff-authenticated member surfa...
Drive the remaining polled screens from NATS/WebSocket
Fifteen network polls across the app, replaced with the events that were already happening or with events added to the services that own the state. Mail — the ...
Put per-file upload settings inline to halve card height
The Description/Folder/Doc Type/Access Level fields sat on a second line under the file row, so every pending upload cost ~108px. Move them into the top row bet...
Remove the god-mode time-box
Checking in work left uncommitted in this working tree by a concurrent session. Not authored here; committed so it is not lost and so main is not left with a tr...
Move System Debug under Platform Administration
**************** diagnostics are operator tooling, not an access rule, so the tab now sits at **************** behind the platform-admin guard instead of MANAGE...
Rename cluster ratestack-scylla -> kamo-scylla, correct ownership docs
This instance is kamo's: it backs the `kamouniverse` keyspace (read/written by **************** through the scylladb-direct ExternalName) and the `audit` keyspa...
Move break glass into the primary rail
The activation control was a fixed pill anchored to the bottom-left of the viewport. That put a privileged action somewhere nothing else lives, which reads as a...
Drop the dead 'just extended' UI from the timeout popup
justExtended was never set to true — the popup closes on extension rather than showing a success state — so the CheckCircle2/Shield branches, the alternate titl...
Share the letterhead resolution between the public page and staff
The staff preview has to show exactly what the customer receives, so branding, the document term and the link host now resolve in one place. Two copies would dr...
Translate the steward console panels; drop the label escape hatch
Catalog, Identifiers, Ingestion, Loan Sale Desk and the Pipeline table rendered hardcoded English inside a console whose other screens were fully translated. Al...
Use next-intl keys for the Mobile Devices strings
Swaps the literal labels added with the Devices sub-tabs for **************** and .mobileDevices.* keys, now published in the translation dictionary (CI fans th...
Fold Document QC into Documents & Conditions; PDF ingest notices
Document QC had its own steward screen for work that is the same documents, on the same loans, done by the same reviewer. Splitting it across two tabs made some...
Consume @kamo/* shared libs, delete duplicated web copies
kamo-internal now imports the shared TS packages it originally seeded (one - avatarUrlTransform → re-exports @kamo/media-core (getAvatarSizedUrl, transformAva...
I18n the LabelManager software-identity labels via next-intl
Replace literal strings with **************** keys (added to the translation dictionary). English fallback covers locales pending translation.
Backward-compatible 6-arg LeadFieldPatch constructor (isVeteran defaults null)
Keeps existing 6-arg consumers (e.g. SecurityService LOS-apply tests) compiling on the shared-lib bump without a lockstep change.
Phase 2 review polish — drop dead prop, dedupe LTV/equity warn, guard 0-value mismatch checks
Split form into Loan / Borrower / Subject Property tabs
Splits the mortgage sub-form's mega-grid into four sub-tabs (Loan, Borrower, Subject Property, What-If Studio) and renames "Property Address" to "Subject Proper...
Use dictionary t() keys for MLOS integration UI strings
Replaces the `// i18n: dictionary key TODO` placeholder literals in LeadMarketManager (MLOS Integration select), MeridianLinkConfigDialog (field labels, Test Co...
Drop the collapsible box around upload + gallery
The "Your wallpapers" section was a collapsible SectionHeader + Collapse — no reason to hide the upload and gallery behind an expand toggle. Replace with a stat...
Drop the Background & Theme section from My Account
Completes the consolidation onto the dedicated wallpaper page: removes the org-vs-own switch, its handler, the "My Wallpapers" link and the now-unused backgroun...
Render the console background globally in the layout, not per page
The background switch stays on the home page, but the chosen background (plain gradient or org slideshow) should be behind EVERY page, not just the two landings...
Move status editor onto the tabs row; note callback auto-note
- Status/sub-status editor now shares the primary-tabs row: tabs left, status aligned right (removes the separate row under the action buttons). - Callback di...
Remove Vendor Product ID from mappable fields
The vendor product is selected once at the run/template level (Configure step) and applied to every row; the backend importer already ignores a mapped vendorPro...
Single Integrations tab replaces AUS-only tab (D40)
MortgageIntegrationsTab: all 15 vendor categories (credit, AUS, eSign, closing- docs, title, flood, …) in one tab, each an expandable section with add/remove co...
Single Integrations write surface — MortgageProviderConfig (D40)
Replaces the AUS-only write path with generic provider-connection CRUD keyed by VendorCategory+vendorKey: /provider-connections GET/POST/PUT, secret write-only ...
Generic MortgageProviderConfig replaces AUS-only config (D40)
One integration-credential store keyed by VendorCategory+vendorKey (credit, AUS, eSign, closing-docs, title, flood, …) behind a single Integrations tab — the Mo...
Use the simple entity name in the calibration-count JPQL (D32)
countCalibrationSamples referenced AiDecision by fully-qualified class name in the FROM clause; Hibernate resolves that, but every other @Query in the shared-li...
Drop redundant in-view titles on Templates/Past-Imports tabs
The sub-tab labels already name the view, so remove the h4 title + subtitle from LeadImportTemplateManager and LeadImportHistoryManager; keep the refresh action...
Drop the Import Leads tab; two sub-tabs + header button
- Remove the 'Import Leads' sub-tab; the import wizard now opens from an always-visible 'Import Leads' button in the page header. Only two sub-tabs remain: Im...
Remove the 2s intro/loading animation screen
Drop showIntro/introComplete state, the 2s intro timer effect, and the branded early-return loading screen. The page now renders straight into the background + ...
Declare Slice-2a indexes via @Table(indexes) on entities
Move the mlos_orchestration_state and mlos_steward_task index definitions from KamoInitializer's SchemaCleanupRunner onto the entities themselves (@Table(indexe...
Redesign new-offer page as two-column workspace + live preview
You asked for full real estate, modern, polished — last refactor put a single-column form inside a full-width shell, which is exactly the wide half-page-of-empt...
Full-width enterprise polish across 10 pages
Adopts the modern enterprise pattern (gradient header + breadcrumbs + back arrow + full-height flex shell + card-grouped content on light gray canvas) used else...
Loan.engagementUid → Long + originatingOrderUid
Engagement extends BaseEntity (Long PK) so engagementUid must be Long, not UUID — this is consistent with the existing AgreementDTO / WorkOrderDTO pattern of "L...
Clean up the session — bug fixes, dedupe, dead-code
Three-agent review surfaced real problems and copy-paste — addressing them: Bug fixes: - useEnsurePrimaryBorrower returned dead state (primaryUid, creating) an...
Retire the URLA wizard — waypoints now own the borrower journey end-to-end
Wires each connect-first waypoint to write through the existing /api/security/mortgage-apps/* endpoints, then redirects /apply/<section> to its matching /waypoi...
Unify all dashed empty-state boxes into <EmptyState />
A dozen inline copies of "rounded-xl border-dashed border-white/10 bg-white/[0.015] …" across the section files, the kanban column, the HMDA LAR list, and the a...
Promote ModalShell/ModalActions and SaveSpot to shared modules
Eight section files plus the webhooks admin page each defined their own copy of ModalShell + ModalActions and/or a SaveSpot save-state chip. All now live in [ui...
Consolidate controller session/rights/response helpers in BaseLosController
Six LOS-area controllers (MortgageApp, MortgagePipeline, MortgagePricing, MortgageDisclosure, MortgageHmda, WebhookSubscription) each copied the same ~80 lines ...
Collapse toolbar, remove ChatHeader, add members intro row
- Delete ChatHeader row from embedded chat; move Add Member icon into unified toolbar - Toolbar: search input on left, VideoCall icon + PersonAdd icon + scroll-...
Cache-only bulk translate, FE handles fills
Bulk message-fetch endpoints now return only translations that are already cached and tag missing rows with needsTranslation:true. The chat UIs (kamo-internal C...
Rewrite drag/cluster system with magnetic snap and gather gesture
Replace the monolithic HexHeadGroup (847 lines) with a modular cluster engine under app/components/chat/hexheads/. Single source of truth: every head lives in a...
Remove manual provision-comp endpoint — startup self-heals
COMP orders are now provisioned automatically on SecurityService startup via SubscriptionService @PostConstruct. Manual endpoint no longer needed.
Scope SettingsSearchBar to components.settings namespace
Use **************** with searchBar.* keys instead of global t() with full dotted paths.
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.