Changelog
What's new.
Every improvement to the platform, as it ships.
· kamo-internal
MLOS Capital & Risk Command Center steward console
Add the AI-native mortgage steward console under /commerce (MORTGAGE market tab), replacing the placeholder intents/commitments sub-tabs with MortgageStewardSection + inner steward-screen tabs. First screen: the Capital & Risk Command Center on the shipped MLOSCapitalMarketsService reads (locks by status/scenario + pipeline-funding P(fund) p5/p50/p95), currently fixture-backed behind a typed client (a one-file swap to the live read-path). - Reusable full-width console kit: ConsoleShell, SectionCard, KpiTile, StatusPill + motion wrappers (CountUp, Stagger, Crossfade) — reduced-motion aware, white-label via --color-primary. - Signature Funding Probability Fan (p5/median/p95), filterable lock pipeline with expiry-tone countdowns, lock-detail drawer (lifecycle timeline + AI decision rationale), segment breakdown, honest "coming soon" strip. - Keyboard/ARIA on all interactive rows, WCAG-AA contrast, next-intl throughout.
· kamo-internal
System Wide toggle + credit-balance editor + cascade filter; history member filter/links/pagination; inject icon+INJECT confirm
- /leads/credits: right-aligned 'System Wide:' Active/Suspended dropdown; Credit Balance uses the ∞-capable InfinityCell (lowering invalidates, ∞ leaves as-is); Product filter cascades from Vendor (disabled/reset when vendor = All). - /leads/history: manager-only Member filter (VIEW_LEADS holders, alphabetical), Lead ID + contact name link to the lead, full server-side pagination. - /leads/available: Inject Test Lead is now an icon-only button with a tooltip. - ConfirmationDialog: optional challengeWord prop (Inject uses 'INJECT'); removal flows keep the random word unchanged.
· SecurityService
System-wide toggle, lead-viewers, credit-balance edit, history pagination
- /credits/system-wide GET+PATCH (org credit-suspend), /credits/lead-viewers (VIEW_LEADS holders incl. grant-all) for the History member filter. - Credit-balance edit on PATCH /allotments/{id}: number lowers via invalidation, null = ∞. - /leads/history now paginated (page/size/total) + returns lead contactName. - availableSummary + available() gate credit acceptance on the org System Wide switch.
· kamo-shared-library
System-wide credit suspend, credit-balance invalidation, paginated history
- OrgLeadConfig (new ORG_LEAD_CONFIG table): org-wide 'System Wide' switch that suspends CREDIT-BASED lead auto-assignment (FFA unaffected); gated in acceptNextLead (new SYSTEM_SUSPENDED result). - **************** + repo invalidateCreditsByIds: reduce a member's available balance to a target by invalidating the excess oldest-first. - CreditAssignmentHistoryService: server-side pagination (getHistoryPage/PagedHistory) + per-entry lead contactName (batch-resolved for the visible page only).
· kamo-internal
Split Lead Credits into Available/History/Manage Credits actions
Reorders the /leads top-right actions to: Add New Lead, Leads Available (→/leads/available, Bolt icon + live availability indicator, shown with Spend/Receive), History (→/leads/history, History icon), Manage Credits (→/leads/credits, Credit Card icon, managers only). Replaces the single 'Lead Credits' button that pointed at the /leads/allotments redirect.
· kamo-internal
Inject Test Lead action on /leads/available (managers only)
Adds an 'Inject Test Lead' button beside Accept for each vendor/product, shown only to members with MANAGE_CREDITS. Opens a confirmation dialog, then POSTs to the new inject endpoint; the synthetic lead lands in the pool and the grid refreshes live.
· SecurityService
Inject test lead + fix Manage-Credits list for grant-all admins
- New POST **************** (MANAGE_CREDITS): creates a synthetic 'Void > Test Lead' (John Doe / 555-555-5555 / noreply@<org base domain>) with requiresAssignment=true into the given market/vendor/product auto-assignment pool so the Accept flow can be exercised end-to-end; publishes availability for live updates. - Manage-Credits eligible-member list now unions grant-all members (owners/admins whose *** is populated with every right) with the explicit-rights query, so a grant-all admin who holds SPEND_RECEIVE in-session but has no explicit MemberRightsApplied row now appears in the list. - Extracted the session's grant-all detection into GrantAllRoleResolver and reuse it in both PostAuth***Service (no behavior change) and LeadCreditController.
· kamo-shared-library
Store original uploaded file key on LeadImport run
Adds SOURCE_FILE_KEY + SOURCE_FILE_CONTENT_TYPE columns so a run references the original file archived in MinIO (KamoInitializer adds the columns on next run).
· kamo-internal
Archive & download the original imported file
On Start Import the raw file is uploaded (best-effort) and its key passed to the import POST; Past Imports shows a Download button for runs with an archived file. +2 proxy routes (source-file upload + download), +2 i18n keys.
· SecurityService
Archive original file to MinIO + download endpoint
Injects MinIOStorageService; POST /source-file stores the raw upload in the private internal bucket; GET /{id}/source-file streams it back (org-checked); the key is threaded through the import POST and persistImportRun; GET history now returns hasSourceFile.
· kamo-internal
Import Templates + Past Imports sub-tabs, auto-detect, re-import
- Sub-tab bar in LeadManualImportManager: Import Leads | Import Templates | Past Imports - LeadImportTemplateManager: template list/create/edit/delete + upload-against-template (import-as-is or adjust mapping); reuses FieldMappingInterface in file-agnostic mode - LeadImportHistoryManager: run list with imported/total + error icon, error report, re-import failed rows (optional mapping adjust) - Auto-detect: on file parse, POST headers to /detect; pick a matched template or make new; save-as-template at the end of a fresh import - FieldMappingInterface: parsedData optional + headers prop for template-edit mode - Next proxy routes for lead-import-templates/* and ****************
· SecurityService
Persist runs/records, template CRUD, header auto-detect & re-import
- LeadImportPersistenceService: header normalize+SHA3 fingerprint (ordered/unordered), mapping/row JSON round-trips, persist run + non-success records, template detect (Jaccard) - LeadImportTemplateController: **************** CRUD + /detect (org-scoped) - LeadImportController: real paged GET history; POST persists the run + non-success rows and returns the real importId (fileName/templateId via query param); +GET /{id}/records and POST /{id}/reimport-failed; processImport refactored to emit per-row RowOutcomes (global row index, createdLeadUid) while keeping the Phase-0 correctness fixes
· kamo-internal
Live availability indicator on the Lead Credits button
Mirror the NavPri Leads indicator on the /leads 'Lead Credits' action: a green/red status dot (green = a lead is acceptable now via FFA or credit, red = none) and a green pulse/glow when an acceptable credit lead is waiting. Gated on the SPEND_RECEIVE_LEAD_CREDIT signal (leadAlert.active). Green is fixed here (this is the credits action), unlike the theme-agnostic white NavPri blink.
· kamo-internal
Live NavPri lead alert — green/red dot, blink, fire popup, edge trim
- LeadAlertProvider (global, mounted at NavPri level): WS-driven /available-summary; drives all state - NavPri Leads icon: green dot (can accept) / red (cannot); noticeable blink when a credit lead is acceptable. Gated entirely on SPEND_RECEIVE_LEAD_CREDIT — no indicator/popup without the right. - NewLeadPopup: center-screen fire popup (flame + animated flames), Accept Lead / Not Now (both disabled 1s), auto-closes with a 1s fade if the pool is drained, no backdrop-close. Fires only on a NEW acceptable credit lead when nav-top status is AVAILABLE. - LiveEdgeTrim: kamo-marketing LIVE shimmer wrapped around all 4 screen edges while the popup is up. All live over NATS->STOMP.
· SecurityService
GET /leads/available-summary for the live NavPri lead alert
Aggregates the caller acceptability across all active markets (comment gate + credit/FFA/ daily-spend rules). Returns hasAcceptable / hasAcceptableCredit / blockedByComments / topCredit. Returns all-false for members without SPEND_RECEIVE_LEAD_CREDIT.
· kamo-shared-library
Persistence spine for import templates, runs & per-row records
Replaces the empty stub entities with real @Entity classes (modeled on the LeadIntake* precedent: UUID id, gen_random_uuid, DB-default timestamps, statusId + @Transient enum) plus repositories, so manual-import templates, past-import history and failed-row re-import can persist: - LeadImportTemplate (+ headerHashOrdered/Unordered fingerprint, usageCount, soft-delete) - LeadImportTemplateMapping **************** JSON) - LeadImport (run header: counts, mappings snapshot, template/source lineage) - LeadImportRecords (per non-success row: rawRowJson, status, errorMessage) - LeadImportRecordStatus enum + 4 repositories Tables are created by KamoInitializer (ddl-auto) on next run; services stay ddl-auto:none.
· kamo-internal
/account-style header+tabs, /leads Card containers, right gating
- LeadsCreditLayout: gradient hero header + underline tabs (matches /account); filters+grid in rounded /leads-style Card; Available tab gated by SPEND_RECEIVE_LEAD_CREDIT - Manage Credits grid populated from members holding SPEND_RECEIVE (member x product matrix, create-on-edit); /leads-style filter container - /leads/available guards on the right; /leads/allotments redirect is right-aware - Lead view: Mark-as-Requires-Reassignment action (MARK right) + assignment reassign gated by REASSIGN_LEADS_MANUALLY - RoleRightType.ts: 3 new rights
· SecurityService
Mark-reassignment gated by MARK right; Manage-Credits returns members with Spend/Receive right
LeadAcceptController: mark-reassignment requires MARK_LEADS_REQUIRES_ASSIGNMENT. LeadCreditController.manage: returns eligibleMemberIds (SPEND_RECEIVE_LEAD_CREDIT holders).
· kamo-shared-library
3 CRM rights + members-with-right query
RoleRightType: SPEND_RECEIVE_LEAD_CREDIT(147), **************** REASSIGN_LEADS_MANUALLY(149) under CRM. **************** for listing members holding a right. Self-heals on SecurityService boot; no schema change.
· InitializerService
Codify §4.2 requirement-writer single-live partial-unique backstop
At most ONE LIVE requirement per (loan_file_uid, img_doc_type_id, party) obligation cell. **************** app-layer idempotency read cannot catch a concurrent double-instantiate (both read zero-live; condition + requirement INSERT to different tables → no CRDB conflict). This partial-unique makes single-live structural. Mirrors **************** DocumentRequirementStatus is @Enumerated(STRING). Idempotent CREATE IF NOT EXISTS.
· kamo-shared-library
**************** (Accepted-Today column)
Counts leads a member accepted via credit/FFA for a vendor product since a UTC instant (member local start-of-day). Consumed by LeadAcceptController /leads/available.
· kamo-internal
Credit-based lead assignment UI (available/history/credits)
- /leads/available: real-time vendor/product grid, atomic Accept (routes to the lead), comment-gate blocked state, rows animate the moment a lead is claimable - /leads/history: live credit + assignment timeline with event-type filter - /leads/credits: MANAGE_CREDITS-gated grouped grid; ∞-capable Daily Allotment / Max Balance / Max Daily Spend / Credit Balance, Active/Suspended toggle, distribute, live blink - Shared LeadsCreditLayout (nav tabs + market sub-tabs + 'CRM not configured' states + Quick Tips) - STOMP hook (useCreditAssignmentWebSocket) over MediaService; useLeadMarkets - 10 proxy routes; **************** /leads/allotments now redirects tsc --noEmit: 0 errors in new files.
· kamo-shared-library
Add **************** for the registry decision half
doc 11 §5.3 step 4 / §10 audit completeness — every registry mint/receipt/supersede emits a paired WORM AiDecision + LoanIdentifierEvent. This adds the AiFunction the **************** column was reserved for. Additive enum constant only (no version bump, no DDL: ai_function has no whitelist CHECK — the generic enum-CHECK sweep applies).
· DaemonService
Daily-allotment forfeit audit job (hourly, per-member timezone)
Records FORFEITED rows for members with drip allotments who did not sign in on their completed local day. Idempotent, yields to GRANTED rows. Compiles clean (mvn).
· MediaService
Relay credit/lead-assignment NATS events to STOMP
Subscribes security.leads.> and security.credits.>, mirrors each to /topic/... so the CRM front-end updates the Leads-Available grid, Manage-Credits fields, and history live. Compiles clean (mvn).
· SecurityService
Credit lead-assignment API ****************
- LeadAcceptController: GET /leads/available, POST /leads/accept (atomic, comment-gated, FFA + credit), GET /leads/uncommented, POST /leads/{id}/mark-reassignment, GET /leads/history - LeadCreditController (MANAGE_CREDITS): GET /credits/manage grid, POST /credits/distribute, POST/PATCH /credits/allotments, POST /credits/daily-grant - CreditAssignmentPublisher: org-scoped NATS events **************** - PostAuth***Service: grant daily allotment on first sign-in of member's local day Compiles clean (mvn).
· kamo-shared-library
Credit-assignment orchestration services (shared-lib)
- LeadAllotment.isInfiniteBalance (∞ credit balance → mint-on-the-fly at accept) - CreditLeadAssignmentService: atomic Accept-Lead (select→lock→recheck→claim, multi-instance safe), FFA bypass, comment gate, mark-for-reassignment (MARKED_FOR_REASSIGNMENT history) - DailyAllotmentService: per-member-timezone daily grant (idempotent) + forfeit audit - CreditAssignmentHistoryService: unified assignment + credit lifecycle timeline - **************** (org-wide credit history) Composes existing Lead*Service; no logic duplicated. Compiles clean (mvn).
· kamo-shared-library
Credit-assignment shared-lib helpers
- **************** — powers the 'must comment before accepting another lead' gate (comment = member's non-removed MediaObj in lead stream) - **************** — per-vendor-product credit spend for the credit-based Accept Lead flow Compiles clean (mvn). Additive; consumed by the accept-orchestration service (next).
· kamo-shared-library
Credit lead-assignment data model (shared-lib)
- Lead: requiresAssignment flag + markedForReassignmentAt/By (nullable; null actor = vendor/API import) - **************** + eventTypeForKey routing + registry descriptor - **************** (org-wide history via shared predicate builder) - RoleRightType.MANAGE_CREDITS (146, CRM group) — self-heals on SecurityService boot - DailyAllotmentGrant entity + repository (once-per-local-day grant, idempotent) - **************** per-member day boundary - LeadRepository: assignable-pool count/fetch + pessimistic-lock claim (multi-instance safe) - LeadCreditRepository: per-vendor-product balance + daily-spend counts Additive schema only (new nullable/defaulted columns + new table). Reuses existing **************** Compiles clean (mvn).
· kamo-internal
Drop Vendor Products column from Markets & Fields table

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