Guideline rules + conditions + evaluator, sharing the LLPA predicate engine (Phase-2 Slice 8)
The guideline-rule predicate conjunct of §8.1 step-2. Critically, REUSES the reviewed Slice-4 condition evaluator instead of duplicating the safety-critical pre...
MlosGuidelineVersion (WORM) + GuidelineVersionResolver (Phase-2 Slice 7)
The immutable effective-dated guideline VERSION — the container eligibility matrices **************** and future guideline rules hang off. Faithful replication ...
Eligibility matrix + cells + cell matcher (Phase-2 Slice 6)
The §8.1 step-2 eligibility-first filter substrate (the cell conjunct; guideline_rule + AUS gate AND in later). - MlosEligibilityMatrix (mlos_eligibility_matri...
MlosMarginSchedule + MarginScheduleResolver (Phase-2 Slice 5)
The investor margin layer — the "+ margin_schedule" term of §8.1 step-4 price assembly. - MlosMarginSchedule (mlos_margin_schedule): rateSheetVersionId FK, pro...
LLPA adjustments + value sets + condition evaluator (Phase-2 Slice 4)
The LLPA/adjustment layer + the deterministic predicate engine for §8.1 step-4 matching ("an adjustment matches iff ALL its conditions are satisfied"). - MlosP...
MlosBasePriceGrid + NoteRateLadder priceable cells (Phase-2 Slice 3)
The priceable rate/price cells — first catalog entity to FK BOTH a rate-sheet version (Slice 1) AND a product (Slice 2); the base of the §8.1 price assembly. -...
MlosProduct + MlosArmIndex product-taxonomy layer (Phase-2 Slice 2)
The product spine of the catalog (doc 02 §6.3): everything priceable downstream (base price grids, eligibility matrices, guideline rules) FKs to MlosProduct.uid...
Catalog provenance + effective-dated versioning spine (Phase-2 Slice 1)
Smallest shippable slice of the Phase-2 catalog (doc 02 §6): the provenance chain ImgDat -> MlosSourceDocument -> MlosRateSheetVersion and the immutable effecti...
Per-tenant confidence-threshold gate overload (config↔gate wiring)
Additive DecisionGate.evaluate(stage, confidence, legallyRequiresHuman, BigDecimal tenantThresholdOverride) — the autonomy-tuned per-tenant wall resolved by ***...
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...
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.
