Tenant-isolation gate for the event backbone (Slice 3)
Roadmap 0.10: **************** (the per-tenant consumer subscription seam) + belongsToTenant(subject,orgId) token-wise matching that mirrors NATS filtering; for...
Consumer-side idempotency, DLQ + steward replay (Slice 2)
Adds the reliability core that any MLOS consumer plugs into: ProcessedEvent dedup ledger (unique consumer_name+event_id) + MlosDeadLetter DLQ + MlosDeadLetterSt...
Transactional outbox event backbone (Phase-0 keystone B)
Money/compliance-grade producer path in NEW sibling pkg **************** (never edits donotmodify): MlosEventEnvelope DTO + MlosOutboxEvent outbox entity/repo +...
Add case-insensitive findByEmailEmailIgnoreCase
Emails are stored with inconsistent case (e.g. Sage@KamoCRM.com) and CockroachDB string equality is case-sensitive, so findByEmailEmail misses on case alone. Ne...
Add ACCESS_KAMOWORLD right (145, GAMES) for KamoUniverse access
Canonical e-sign signer templates (verification + invite)
Add two platform-wide canonical email templates seeded lazily per org: - esign.signer_verification (step-up OTP: {{code}}, {{name}}) - esign.signer_invite (sign...
API_SIGNATURE api-key scope + EsignGenericEnvelope.origin
Additive, no version bump: - ApiKeyScope.API_SIGNATURE — gates the programmatic e-signature API (Business) - EsignGenericEnvelope.origin (EsignUsageOrigin, null...
Explicit Organization.isPlatformProduct as entitlement-root signal
Replace the derived 'owns a SUBSCRIPTION market' heuristic with an explicit, admin-set ownership flag. A platform product (e.g. sign.pink) is a white-label prod...
Product root = owns SUBSCRIPTION market, not any market
A customer org (e.g. BluEleven) owns its OWN business markets (RETAIL/MORTGAGE) to run its company while remaining a customer of the KamoCRM platform — its memb...
Resolve entitlements by product-root org, not platform top-level
Introduce EntitlementRootResolver: the nearest market-owning ancestor-or-self of an org (its product root), falling back to the platform top-level. This decoupl...
Add envelope recipient, field value, recipient status entities
Check in the in-progress esign model: EsignEnvelopeRecipient (+repo), EsignFieldValue (+repo), EsignRecipientStatus, and an ESignSignerType update. Additive; no...
Add EsignUsageRecord for per-signature usage metering
New append-only usage entity (mirrors AiUsageRecord) emitted at signature completion. Only API-origin signatures count toward a plan's monthly included quota + ...
Rename LoanRepository → PersonalLoanRepository
Spring Data JPA derives the repository bean name from the interface's simple class name, not from the @Repository("...") qualifier value, so the prior workaroun...
Avoid Loan / LoanRepository collision with mortgage app
KamoInitializerService failed to boot because two @Entity classes named 'Loan' and two repository classes named 'LoanRepository' both wanted to register the sam...
LoanChargeOffReasonCode (IRS 1099-C box 6) + audit search
- New LoanChargeOffReasonCode enum (A_BANKRUPTCY..H_OTHER) per IRC §6050P - Loan.chargeOffReasonCode column - **************** multi-filter @Query for regulator...
****************
Used by **************** to reactivate an existing PAUSED plan instead of creating a duplicate row that orphans the paused one.
Paged repo queries + countByStatus for hot paths
- LoanRepository: countByStatus / countByOrganizationAndStatus + Page<Loan> findByStatus(...) / **************** / **************** + **************** for...
LoanOrgStripeConnect + Loan tax/accrual fields + hot indexes
- New LoanOrgStripeConnect entity (one-per-org, holds stripeConnectedAccountId + Connect onboarding capabilities) + repository - Loan: stripeCustomerId (lazy-...
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...
Add PERSONAL_LOANS commerce type + entity package
- CommerceType.PERSONAL_LOANS + parallel EngagementType + vocabulary - BuiltinVendorCategories entries for personal-loan vendors - 15 personal_loans JPA entitie...
Bootstrap mortgage program offerings on market create + boot backfill
When the user creates a CommerceMarket with commerceType=MORTGAGE — via the Markets & Fields settings tab — the market needs program Offerings under it for down...
Per-org enable/disable + deprecate legacy commerce-only mortgage path
- **************** upserts an OrgProgramOverride row with recordState.isActive=desired; listForOrg now AND's the base program's active flag with the overrid...
Polish — backfill, delete cleanup, amount sync, appUid links
- **************** heals AppMortgages predating the wiring; called from SecurityService DataLoader. - AppMortgageService.delete cancels the engagement+intent ...
Wire URLA mortgage into Engagement/Intent/Commitment
Mortgage is one vertical of the commerce system — alongside retail, rental, service, subscription, and procurement. This wires the URLA-fidelity mortgage stack ...
Add Binder/BinderItem/BinderShare entities and repositories
Adds the persistence layer for the new doc-manager Organizer feature: - Binder (Long id, owner member, org-scoped, isTemplate, binder-wide modifierJson) - Binde...
Add borrower-facing brand + disclosure fields to Organization
Seven new nullable columns powering the lender-branded surfaces in kamo-los's borrower app: - TAGLINE — marketing line shown on the brand-intro spl...
Connection + VerifiedFact foundation for connect-first capture
Adds the M3a backend foundation for vendor connections and provenance-tracked verified facts. Stub-only end-to-end — real vendor SDK wiring (Plaid, Persona, ATT...
Repositories, DTOs, ProgramService (read-only catalog with naive overlay merge)
Add lenderModel column (additive; null = BROKER default at app layer)
Add Program + OrgProgramOverride entities (catalog + per-org overlay)
Revert "feat(los): introduce LOS entity package marker"
This reverts commit ****************
Add LOS enum types (status, role, persona, program, lender model)
Micrometer counters/timer for transitions, conditions, webhooks
LoanPipelineService increments los_transitions_total{from,to} per successful transition. LoanConditionService increments **************** for cleared/waived. We...
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 ...
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...
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...
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 ...
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 ...
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 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 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,...
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.
