Complete Phase-1 config domains + MlosActivationService (Slice 5)
Completes doc 04's config entity inventory **************** - Policy singletons (one-active-per-profile, effective-dated/append-only): PricingPolicy (ppeSour...
Channel Applicability engine (Phase-1 Slice 4)
The deterministic most-restrictive resolver (doc 04 §8) — Product x Channel x Investor -> {ALLOWED|DISALLOWED, executionPath, authorityModel, fundingBehavior}. ...
AuthorityConfig (underwriting authority + govt delegations) — Phase-1 Slice 3
- AuthorityConfig (singleton per LenderProfile): underwritingAuthority DELEGATED/NON_DELEGATED/HYBRID + manualUwAllowed + govtDelegation Set {FHA_DE,VA_SAR_...
AI autonomy config + safety-floor resolver (Phase-1 Slice 2)
- AiAutonomyConfig (singleton per LenderProfile; autonomyLevel **************** globalDefaultThreshold DECIMAL(4,3), autoExecuteEnabled) + AutonomyStageOver...
LenderProfile + LicensingEntry config foundation (Phase-1 Slice 1)
New com.kamo.z.shared.mlos.config tenant-config foundation (doc 04 §3): - LenderProfile (root, UNIQUE per MORTGAGE marketId) — soft-FKs locked Organization (...
**************** for the DaemonService SLA sweep
Flips every ARMED-but-past-deadline AdverseActionTimer + RegXTimer to EXPIRED (the durable escalation signal the Compliance steward screen surfaces; event emiss...
Wire license-aware assignment into DecisionSpine (Slice 2b-ii)
DecisionSpine.record() now stamps StewardTask.assignedMemberId from the StewardAssigner when a routed decision carries the loan's jurisdiction: - DecisionReque...
License-aware StewardAssigner (decision-spine Slice 2b-ii)
Adds the license-aware steward selector (doc 03 §3.2; doc 01 §6 #9) — picks a steward whose MLOS StewardLicense is valid TODAY for the act's required license ty...
ECOA + Reg X timer substrate (decision-spine Slice 2c-i)
New **************** package (doc 03 §2.8) — kamo-owned compliance-timer analogues of the locked donotmodify.TridTimer. Substrate-first: - AdverseActionTimer (...
State-aware legal registry substrate (decision-spine Slice 2b)
New com.kamo.z.shared.mlos.legal package — the greenfield producer of the DecisionGate's absolute legal-wall input (doc 03 §3.2). Substrate-first, no adopter ye...
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...
Decision-spine Slice 2a — OrchestrationState + StewardTask + DecisionSpine BLOCKED-state machine
OrchestrationState (per-loan-stage GREEN/BLOCKED/COMPLETE) + StewardTask (exception record) + enums + DecisionSpine (@ConditionalOnProperty mlos.spine.enabled):...
LoanIdentifier registry substrate — 42 typed ids (keystone 0.5, slice 1)
New pkg com.kamo.z.shared.mlos.identity (the inbound-webhook routing key): LoanIdentifierType (42 first-class typed ids, each carrying Cardinality + Ownership; ...
PublishAck is in io.nats.client.api, not io.nats.client
Test-only import fix that was breaking shared-lib compilation (caught by the now-required local mvn install). Main code was unaffected (OutboxRelay ignores the ...
StewardFeedback flywheel — capture every steward verdict (keystone 0.11)
New pkg **************** append-only StewardFeedback ground-truth row (FK ai_decision.uid; verdict CONFIRM/OVERRIDE/MODIFY; Reg-B-aligned reasonCode; correctedV...
Immutable AiDecision WORM ledger + two-wall DecisionGate (keystone 0.3, slice 1)
New pkg com.kamo.z.shared.mlos.decision (greenfield decision spine, never edits donotmodify): immutable append-only AiDecision (WORM via @PreUpdate guard; loanF...
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)
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.