Resolve cid: inline images at sanitize time to stop signature flicker
Cid: rewriting was happening in a post-commit useEffect, so the sanitized HTML hit the DOM with literal src="cid:..." and the effect mutated each img on the nex...
Expose Prometheus metrics endpoint
Adds micrometer-registry-prometheus and configures management.endpoints to expose /actuator/prometheus alongside health/info. Required so the counters/timer add...
Micrometer counters/timer for transitions, conditions, webhooks
LoanPipelineService increments los_transitions_total{from,to} per successful transition. LoanConditionService increments **************** for cleared/waived. We...
Surface previousMilestoneSha256 in pipeline timeline
The hash-chain link is rendered as a small monospaced 'prev <hash>' chip next to the existing snapshot hash, with the full value in the title tooltip. No new tr...
Hash-chain LoanPipelineMilestone rows for tamper detection
LoanPipelineMilestone gains PREVIOUS_MILESTONE_SHA256. On every transition, LoanPipelineService computes the SHA-256 of the previous milestone's canonical form ...
Surface HMDA LAR validation issues in the UI
HmdaLarRecordDTO now carries an issues array; HmdaLarClient renders: - an amber banner above the table summarising rows-with-issues (Σ errors / Σ warnings) ...
GET /mortgage-apps/hmda/lar/issues count summary
Aggregates validation issues across the LAR for the given year and returns {errors, warns, rowsWithIssues} so the UI can render a one-line banner before the ope...
HMDA LAR pre-export validation
New HmdaLarValidationIssue DTO (ERROR/WARN severity, field name, message). HmdaLarService now annotates each row in buildLar() with a list of issues covering th...
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...
Surface preTransitionLint warnings in TransitionDialog
Both TransitionDialog implementations (detail Pipeline section + kanban board) now fire the lint endpoint when the user picks a target status and render an ambe...
Expose GET ****************
Surfaces **************** as an advisory pre-flight check the TransitionDialog fires when the user picks a target status.
PreTransitionLint advisory for APPLICATION_TAKEN
New @Transactional(readOnly) method on LoanPipelineService returning a list of human-readable warnings for the APPLICATION_TAKEN target: missing SSN (last 4), D...
Global toast queue with provider + useToast hook
New ToastProvider at the layout level renders a Framer Motion stack of context-managed toasts and exposes a typed useToast() API (success/error/info/warn). Pipe...
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 ...
Merge partial DTOs into local state, drop refetch-after-patch
Every edit-style autosave (name fields, employment, assets, liabilities, REO, declarations, military, HMDA demographics, originator) used to issue a full mortga...
Collapse pipeline kanban N+1 to a single grouped count query
listForOrganization() used to issue one condition-fetch per loan (201 queries at 200 loans). Now a single grouped JPQL aggregate keyed by loanFile.uid projects ...
Webhook consumer + worker config in configmap
Backs the JetStream durable consumer in WebhookDeliveryWorker. Env-var overrides for the durable name, deliver-policy (set to All to replay backlog one-time), m...
Durable JetStream consumer, executor isolation, timestamped signatures
Three changes bundled because they all live in WebhookDeliveryWorker and make sense together: 1. Switch from core NATS dispatcher to a JetStream durable push ...
Recover gracefully from CONCURRENT_MODIFICATION on transitions
Promotes API error handling to a MortgageApiError class that preserves the backend error code; transition handlers in PipelineSection and the pipeline kanban de...
Translate concurrent-modification IllegalStateException to 409 with code
Pairs with the shared-lib optimistic-lock change: when LoanPipelineService throws "Concurrent modification: refresh and retry", surface a structured {error, cod...
Optimistic-lock LoanFile.status to prevent racing transitions
Concurrent "Advance" clicks could both write milestones. Adds @Version to LoanFile and an explicit flush in LoanPipelineService.transition so the OptimisticLock...
Name display, REO lien editor, webhook admin, string cleanup
Polish pass aligning the frontend with the corresponding backend changes: - Components now render the resolved *MemberName fields from the backend (PipelineS...
REO lien endpoints + webhook subscription controller
- MortgageAppController: POST /{uid}/reos/{reoId}/liens, PATCH /{uid}/reo-liens/{id}, DELETE /{uid}/reo-liens/{id} — delegating to the new BorrowerSectionSe...
Name resolution, REO liens, TRID holidays, webhook delivery, ESignTemplate link
Cross-cutting polish pass across all LOS sub-projects: Member display name resolution (MemberNameResolver): - Single shared resolver service that follows the s...
Pricing, disclosures, HMDA LAR UI
Three more sub-projects shipped end-to-end: Sub-project 5 — Pricing & AUS section on the detail page: - Pricing snapshots list with add dialog (program, invest...
Controllers for pricing, disclosures, HMDA LAR
Three new REST controllers under /api/security/mortgage-apps: - MortgagePricingController: pricing snapshots, rate locks, AUS findings CRUD ({uid}/pricing, {...
Pricing snapshots, rate locks, AUS findings, disclosures, TRID timers, HMDA LAR
Sub-projects 5, 6, and 7 backend shipped together: Sub-project 5 (pricing & locks): - LoanPricingSnapshot — append-only quotes (program, investor, rate, APR,...
LOS pipeline UI — kanban, detail section, template admin
Sub-project 4 frontend, end-to-end: - /applications/pipeline (PipelineBoardClient): kanban grouped by LoanFileStatus with off-ramp lanes below the happy-path...
MortgagePipelineController + LOS_PIPELINE configmap entry
Exposes the LOS pipeline backend under /api/security/mortgage-apps: - GET /pipeline — kanban summary - GET /{uid}/pipe...
Pipeline state machine, conditions, templates, NATS events
Sub-project 4 (LOS pipeline & workflow) backend: - New enum LoanConditionStatus (OPEN/CLEARED/WAIVED) - New entities: LoanPipelineMilestone (append-only transi...
Originator & Submissions sections UI
Closes out Sub-project 3: the originator route gets a two-block editor (individual NMLS + organization NMLS + org address) wired to patchOriginator with the sta...
HMDA Demographics section UI
Replaces the Coming-Soon placeholder for the hmda route. Ethnicity uses the tri-state lookup with an inline sub-checkbox block when Hispanic is selected (Mexica...
Military Service section UI
Replaces the Coming-Soon placeholder for the military route. The everServed switch upserts via mortgageAppsApi.putMilitary; toggling it off also clears the serv...
Real Estate Owned section UI
Replaces the Coming-Soon placeholder for the REO route. Each property card edits the address, occupancy/status/intended-use, market value, monthly insurance+tax...
Liabilities & Expenses section UI
Replaces the Coming-Soon placeholder for the liabilities route. Section 2c liabilities track unpaid balance, monthly payment, months remaining, and the three UR...
Assets & Credits section UI
Replaces the Coming-Soon placeholder for the assets route. Splits the borrower's asset list into Section 2a (bank/retirement/other accounts, type id < 50) and S...
Employment & Income section UI
Replaces the Coming-Soon placeholder for the employment route with a full URLA Section 1d-1g editor. Per-borrower chip selector mirrors the declarations pattern...
URLA 2021 mortgage application UI
Adds the new /applications route group, the typed mortgageAppsApi client that talks to SecurityService /api/security/mortgage-apps, full TS types mirroring the ...
MortgageAppController for URLA 2021 REST surface
New REST controller exposing the full URLA application lifecycle: GET /api/security/mortgage-apps list (summary) GET ***************...
URLA service layer (repos, DTOs, services, lookups)
Adds the full backend service layer for the URLA package introduced in the previous commit: repos/applications/ 20 JpaRepositories scoped per entity ...
URLA 2021 schema foundation for residential mortgage
Refactor AppMortgage into a full URLA package root supporting multiple 1003s per loan with up to two borrowers per pair (married/joint or unmarried). Replaces t...
Resolve subdomain-tenant org bucket to its own MinIO folder
getThemePath() was reducing the hostname to apex+tld for both the themed host and the bucket folder, so subdomain tenants like gnosia.demo.kamocrm.com loaded th...
Resolve subdomain-tenant org bucket to its own MinIO folder
getThemePath() was reducing the hostname to apex+tld for both the themed host and the bucket folder, so subdomain tenants like gnosia.demo.kamocrm.com loaded th...
Route NavTop picker through /me/language
The picker called the generic member PUT, which SystemUserGuard 403s for the System User signed into a sub-org. The catch logged silently, so the kamo-locale co...
Add /me/language endpoint that bypasses SystemUserGuard
The NavTop language picker did nothing for the System User signed into a sub-org: PUT **************** runs SystemUserGuard first, which 403s every System-User ...
Resolve subdomain-tenant org bucket to its own MinIO folder
getThemePath() was reducing the hostname to apex+tld (mainDomain.tld) for both the themed host AND the bucket folder. For subdomain tenants like gnosia.demo.kam...
Stop clipping dark-variant color inputs in ModernColorGroup
Color picker rows had a hardcoded 280px wrapper inside a 1fr 1fr grid with overflow:hidden, so the input was chopped on narrow columns. Use flex:1 + minWidth:0 ...
Treat thrown subscription stub as no-subscription, not error
The legacy getCurrentSubscription stub throws by design so callers fall back to the ungated path. StatsManager was surfacing the throw as "Could not load subscr...
Return empty meters instead of null from getCurrentUsage
StatsManager rendered <UsageMeters usage={null}> when the legacy stub resolved to null, crashing on usage.meters. Return { meters: [] } so the component takes t...
Je, unaona nini kuhusu usafiri?
Kila moja ya hizi updates ardhi katika nafasi yako ya kazi moja kwa moja. Kuanza bure na kuangalia kukua wiki baada ya wiki.