Skip to content
KAMOUniverse

Changelog

What's new.

Every improvement to the platform, as it ships.

  1. · kamo-shared-library

    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 predicate logic. DRY refactor (non-regressive — evaluator bodies byte-identical): - PredicateCondition interface **************** - MlosAdjustmentCondition + MlosGuidelineRuleCondition both implement it. - AdjustmentConditionEvaluator generalized to PredicateCondition; adjustmentMatches -> allConditionsMatch (List<? extends PredicateCondition>). Slice-4 test re-runs green (9), both prior HIGH fixes intact. New: - MlosGuidelineRule (mlos_guideline_rule): guidelineVersionId FK, productId FK, ruleCode (unique per version), verdict (RuleVerdict ELIGIBLE/INELIGIBLE/STIPULATED §10.3 vocab), requirementKind **************** requirementValue, severity, sourceSectionRef, unconditioned flag. + MlosGuidelineRuleCondition (implements PredicateCondition). - GuidelineRuleEvaluator (ungated @Component) + GuidelineEvaluation + GuidelineOutcome: a rule fires when all its conditions hold (via the shared evaluator); INELIGIBLE iff any fired INELIGIBLE rule; stipulations collected. 8 GuidelineRuleEvaluatorTest green. Adversarially reviewed (2-agent): refactor confirmed byte-identical/non-regressive; fixed MEDIUM over-block hazard — a non-blanket rule with zero conditions now fails SAFE (does not fire) so a half-authored/dangling-FK INELIGIBLE rule can't silently block every borrower (mirrors value-set fail-closed); explicit `unconditioned` flag for intentional blanket rules. NO KamoInitializer code change.

  2. · InitializerService

    Guideline-version no-overlap partial-unique index (Phase-2 Slice 7)

    SchemaCleanupRunner: ux_guideline_version_active partial-unique ON mlos_guideline_version (organization_id, product_id) WHERE status='ACTIVE' AND effective_until IS NULL — one open/current ACTIVE guideline version per (org, product); mirrors ux_rate_sheet_version_active (doc 02 §6.5). Catalog repo pkg already registered (Slice 1).

  3. · kamo-shared-library

    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 of the reviewed Slice-1 MlosRateSheetVersion spine, keyed per product (vs per investor). - MlosGuidelineVersion (mlos_guideline_version): productId FK, revisionLabel, effective_from/until, sequence_no, supersedes_id self-FK, status, source_document_id FK, kb_article_guid + kb_article_version_no (§6.4 KB-prose drift-pin, immutable). App-layer partial-mutability WORM (@PostLoad snapshot + @PreUpdate diff): freezes identity/content, permits only DRAFT->ACTIVE, ACTIVE->SUPERSEDED, ACTIVE->RETIRED + write-once effective_until close. - GuidelineVersionStatus **************** - GuidelineVersionResolver (gated mlos.catalog.enabled): point-in-time window resolution, never latest-row, throws on overlap. Mirrors EffectiveVersionResolver. - 17 tests green (6 GuidelineVersionResolverTest + 11 **************** KamoInitializer adds ux_guideline_version_active partial-unique (one open ACTIVE per org+product).

  4. · kamo-shared-library

    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_matrix): per **************** effective-dated; REUSES locked URLA **************** via @Enumerated(STRING) on new columns (FK-free, never edits them); guidelineVersionId soft-FK (nullable until guidelines). - MlosEligibilityCell (mlos_eligibility_cell): typed eligibility window — fico_low/high, property_type (locked PropertyTypeUrla), units_low/high, loan_amount_low/high, state_set_id (FK MlosValueSet), limit_value. Pricing/limit numbers raw BigDecimal (catalog convention). - MlosMatrixType {MAX_LTV,MAX_CLTV,MAX_DTI} — discriminator for which ratio limit_value caps. - EligibilityCellMatcher (ungated @Component) + ScenarioFacts reuse + EligibilityOutcome **************** + EligibilityResult: locate the containing cell across **************** RATIO-DISPATCH by matrix_type (ltv/cltv/dti) tested vs limit; missing required attr → CANNOT_PRICE (hoisted before coverage); state fail-closed; overlap → most-restrictive (surfaced in detail). 12 EligibilityCellMatcherTest green. Enum-reuse + spec from research workflow; adversarially reviewed (2-agent): fixed matrix_type ratio dispatch + hoisted-ratio CANNOT_PRICE + overlap observability + dropped unhonored OTHER. NO KamoInitializer code change (catalog repo pkg registered Slice 1) — re-run only.

  5. · kamo-shared-library

    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, productId (null=all), marginType, loanAmountLow/High band, value (raw BigDecimal), compBasis (BORROWER_PAID|LENDER_PAID). - CompBasis enum — the comp BASIS convention (how margin is paid), NOT an LO comp-plan amount; LO comp is never a scoring input (doc 13 §8.5). - MarginScheduleResolver (ungated @Component): applicable(schedules, loanAmount, compBasis) = band contains amount (inclusive, null=open) AND comp matches; totalMargin = Σ values (ZERO if none). 5 MarginScheduleResolverTest green. Pricing numbers raw BigDecimal (Slice-3 correction). NO KamoInitializer code change (catalog repo pkg registered Slice 1; indexes entity-declared) — re-run only.

  6. · InitializerService

    Value-set platform-owned ownership CHECK (Phase-2 Slice 4)

    SchemaCleanupRunner: ADD CONSTRAINT mlos_value_set_ownership_chk CHECK (platform_owned = (organization_id IS NULL)) — doc 02 §6.2: a platform taxonomy is platform_owned with a null org; an org-specific set is org-scoped. Biconditional `= … IS NULL` shape survives the enum-whitelist sweep. Catalog repo pkg already registered (Slice 1).

  7. · kamo-shared-library

    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"). - MlosPriceAdjustment (mlos_price_adjustment): rateSheetVersionId FK, productId (null=all), adjustmentGroup, operation (ADDITIVE|MULTIPLICATIVE), value, stackOrder, capValue, label. - MlosAdjustmentCondition (mlos_adjustment_condition): priceAdjustmentId FK, attribute, operator **************** numLow/numHigh, valueSetId FK. - MlosValueSet (mlos_value_set) + MlosValueSetMember (mlos_value_set_member): named categorical sets; the doc 02 §6.2 platform-owned exception (organizationId nullable + platformOwned flag on the SET only; member carries no orgId mirror — ownership via the set, no drift surface). - AdjustmentConditionEvaluator (ungated @Component) + ScenarioFacts: numeric ops vs num_low/high, set ops vs resolved members; missing fact → no match; SET OPS FAIL CLOSED on empty/null member set (a dangling soft-FK value set never silently matches everyone) and null-resolver-safe (no NPE). 9 **************** green. Adversarially reviewed (2-agent workflow): fixed 2 HIGH evaluator bugs (NOT_IN fail-open on empty set; NPE on null resolver) + dropped the redundant member orgId mirror per the review. Pricing numbers raw BigDecimal (Slice-3 correction). KamoInitializer adds the value-set ownership CHECK.

  8. · kamo-shared-library

    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. - MlosBasePriceGrid (mlos_base_price_grid): rateSheetVersionId FK, productId FK, noteRate, lockPeriodDays, basePrice (price-to-100), basePoints, min/maxLoanAmount, ioFlag. Composite UNIQUE (version, product, note_rate, lock_period_days, io_flag) entity-declared (io_flag NOT NULL → full unique, no raw DDL). - NoteRateLadder (ungated @Component): par = cell nearest price-to-100; nearestToPrice(target); ties -> lower note rate (doc 02 §8.1 step 5). 5 NoteRateLadderTest green. CODE-VERIFIED CORRECTION: doc 02 §6 says EmbMoney/EmbPercent, but the locked LoanPricingSnapshot (the reproducibility anchor) uses RAW BigDecimal — interestRate DECIMAL(9,6), points DECIMAL(9,4), no embeddables; EmbPercent(9,4) can't match a 6-decimal rate. So snapshot-mirrored grid pricing numbers use raw BigDecimal matching LoanPricingSnapshot (note_rate 9,6 / base_price+points 9,4 / loan amounts 18,2). No KamoInitializer code change (catalog repo pkg registered Slice 1; unique index entity-declared) — re-run only.

  9. · InitializerService

    Mlos_product ARM-consistency CHECK (Phase-2 Slice 2)

    SchemaCleanupRunner: ADD CONSTRAINT **************** CHECK ((amortization_type = 'ARM') = (arm_fixed_period_months IS NOT NULL)) — a fixed period is declared IFF the product is an ARM (doc 02 §6.6). `= … IS NOT NULL` shape (not a bare enum IN-list) survives the generic enum-whitelist CHECK sweep. Catalog repo pkg already registered in Slice 1.

  10. · kamo-shared-library

    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. - MlosProduct (mlos_product): per-investor product — investorId FK, productCode, amortizationType (REUSES locked URLA AmortizationType), termMonths, armFixedPeriodMonths, armIndexId FK, loanClass, documentationType, conforming, losProgramCode (REUSES locked 17-value LoanProgramCode, §6.4), guidelineVersionPointer (real FK-by-id to future MlosGuidelineVersion.uid, nullable), active. assertStructurallyValid(): arm_fixed_period_months set IFF amortization_type=ARM. - MlosArmIndex (mlos_arm_index): indexName, marginBps, initial/periodic/lifetime caps + floor as EmbPercent (doc 02 §6 rate-via-EmbPercent), adjustMonths. - 2 new enums LoanClass / DocumentationType (catalog-specific; DocumentationType is the §3.5 non-QM doc-program class, distinct from Slice-1 MlosDocType). 2 repos. Base = BaseUuidEntity; orgId=Long @JsonSerialize(ToString). 5 MlosProductInvariantTest green. KamoInitializer adds the mlos_product ARM-consistency DB CHECK (catalog repo pkg already registered in Slice 1). Deferred: price **************** + the writer.

  11. · InitializerService

    Register catalog repos + rate-sheet-version no-overlap index (Phase-2 Slice 1)

    - @EnableJpaRepositories += com.kamo.z.shared.mlos.catalog (the new MlosInvestor/ **************** repos; entities already covered by @EntityScan). - SchemaCleanupRunner: ux_rate_sheet_version_active partial-unique index ON mlos_rate_sheet_version (organization_id, investor_id) WHERE status='ACTIVE' AND effective_until IS NULL — backstops the "one open ACTIVE version per (org, investor)" no-overlap invariant (doc 02 §6.5; CRDB has no range-exclusion constraint).

  12. · kamo-shared-library

    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 effective-dated versioning spine with point-in-time resolution. Substrate-first (no MLOSCatalogService writer yet); this is the immutable-catalog-PK foundation DecisionInput will FK to. New pkg com.kamo.z.shared.mlos.catalog: - MlosInvestor (per-org registry; short_code unique per org), MlosSourceDocument (thin annotation over locked ImgDat; soft-FK img_dat_id, never re-stores bytes, doc 02 §6.4). - MlosRateSheetVersion: immutable effective-dated version (effective_from/until window, supersedes self-FK, sequence_no, status lifecycle, source_document FK, cutoff_time) with an app-layer partial-mutability WORM guard (@PostLoad snapshot + @PreUpdate diff): freezes priceable/identity cols, permits only DRAFT->ACTIVE, ACTIVE->SUPERSEDED, ACTIVE->RETIRED and the write-once close of effective_until. No DB trigger (CRDB can't finalize to 24.3). - EffectiveVersionResolver (gated mlos.catalog.enabled): point-in-time resolution — the version whose [effective_from, effective_until) window CONTAINS priced_as_of, never a "latest row" join; throws on effective-window overlap (defense-in-depth, doc 02 §6.5/§8.1). - 6 enums **************** RateSheetVersionStatus) + 3 repos. Base = BaseUuidEntity (doc 02 §6.1); orgId=Long @JsonSerialize(ToString) (code-verified: Organization.id is unique_rowid, not doc 02's "UUID"). 17 tests green (6 resolver point-in-time + 11 WORM guard). KamoInitializer adds the catalog repo pkg + the ux_rate_sheet_version_active partial-unique no-overlap index.

  13. · kamo-shared-library

    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 **************** stage, floor). The legal wall stays absolute and the override is STILL floored by the non-tunable safety floor (autonomy can never auto-act below it). Null override falls back to the platform default; the existing 3-arg evaluate() delegates with null, so the shipped gate/DecisionSpine behavior + their tests are unchanged. Added safetyFloor() getter so a caller resolves the tenant threshold against the same floor. This connects the Phase-1 config foundation to the decision gate: an engine can now do gate.evaluate(stage, conf, legal, **************** stage, **************** 9 DecisionGateTest (4 new) + 5 DecisionSpineTest + 6 MlosActivationServiceTest green.

  14. · InitializerService

    Partial unique indexes + servicing invariants (Phase-1 config completion)

    SchemaCleanupRunner DDL for the new mlos.config domains (mlos.config already in @EnableJpaRepositories; Hibernate ddl-auto:update creates the tables): - one-active partial unique indexes (WHERE is_active=true AND effective_to IS NULL) on mlos_pricing_policy / mlos_capital_policy / mlos_servicing_policy (lender_profile_id) + mlos_product_enablement (lender_profile_id, program_id) — Hibernate can't emit WHERE indexes. - ServicingPolicy immutable invariants: CHECK scra_enforced=true + fdcpa_enforced=true (=-CHECKs, survive the enum-whitelist sweep).

  15. · kamo-shared-library

    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 (ppeSourcePriority List<String> — typed MortgageVendorType deferred to the §5 vendor domain; NO LO-comp), CapitalPolicy (NO pullThroughPct) + CapitalConcentrationLimit child, ServicingPolicy (scra/fdcpa immutable invariants). Partial unique indexes + scra/fdcpa CHECKs go in KamoInitializer. - ProductEnablement (single-active per program; channelRestriction @ElementCollection; programId UUID — Program.id is UUID, doc's 'Long' is a code-verified error). - Investor family: InvestorConfig + InvestorOverlay + DeliveryRule (reuses **************** — no dup) + CommitmentRule (reuses CommitmentType). - RiskOverlay (ruleExpression JSONB String). 11 new enums. - MlosActivationService @Component (gated mlos.config.enabled): resolveProfile(orgId) + **************** stage, floor) — ties LenderProfile + autonomy config + AutonomyResolver (the per-tenant source for the gate's confidence wall). 23 mlos.config tests green (MlosActivationService 6 new). Config-entity base pattern throughout (manual @Id UUID + @Embedded EmbRecordState; children no EmbRecordState). Plan: **************** (extended). Deferred: full screen/module/vendor activation matrix + validateProfile + SecurityService self-heal; *.config.history append-only tables; predicate evaluators.

  16. · kamo-shared-library

    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}. - ChannelApplicabilityRule entity: **************** conditionExpression(JSONB String, Program.rulesetJson precedent)/outcome/ **************** dates + EmbRecordState. priority DERIVED from scope (not stored). Same config base pattern. - 5 enums: RuleScope(+priority() Investor=0..Tenant=3), Channel, Applicability, **************** (HYBRID resolved per-loan to these), FundingBehavior(5, incl PORTFOLIO_HOLD — DeliveryRule's 4-value unify deferred). - ChannelApplicabilityResolver @Component (ungated, stateless): empty/any-DISALLOWED => DISALLOWED (safe most-restrictive reading of the §8.2 ambiguity); else ALLOWED with attrs from the strongest scope. ChannelResolution record. 5 **************** green (17 mlos.config tests). conditionExpression predicate evaluator + effective-dating filter + AiDecision pinning + MlosActivationService deferred. mlos.config already in KamoInitializer scan — re-run only. Plan: ****************

  17. · kamo-shared-library

    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_LAPP,USDA,NONE} via @ElementCollection (collection table mlos_authority_govt_delegation) — gates internal govt UW vs agency referral. hasGovtDelegation() helper (HYBRID/channel resolution deferred). - UnderwritingAuthority + GovtDelegation enums + AuthorityConfigRepository. - Same config base pattern (manual @Id UUID + @Embedded EmbRecordState); UNIQUE(lender_profile_id) singleton. First @ElementCollection in mlos.*. 3 AuthorityConfigTest green (12 mlos.config tests). mlos.config already in KamoInitializer scan — re-run creates mlos_authority_config + the collection table.

  18. · kamo-shared-library

    AI autonomy config + safety-floor resolver (Phase-1 Slice 2)

    - AiAutonomyConfig (singleton per LenderProfile; autonomyLevel **************** globalDefaultThreshold DECIMAL(4,3), autoExecuteEnabled) + AutonomyStageOverride (per (profile,stage); stageKey reuses LifecycleStage — no separate PipelineStage enum exists; confidenceThreshold + autoExecuteEnabled). Same config-entity base pattern (manual @Id UUID + @Embedded EmbRecordState); UNIQUE(lender_profile_id) singleton + UNIQUE(profile,stage_key). - AutonomyResolver @Component (ungated, stateless like DecisionGate): effectiveThreshold = max(stageOverride?:global, safetyFloor) — autonomy tunes ONLY the confidence wall and can NEVER lower the non-tunable platform floor (doc 13 §8.7); autoExecuteEnabled override-then-global. The per-tenant source for the gate's confidence wall (wiring deferred). 5 AutonomyResolverTest + 4 LicensingResolverTest green (TDD). Indexes entity-declared. mlos.config already in KamoInitializer scan — re-run creates the 2 new tables.

  19. · InitializerService

    Register mlos.config repo pkg (Phase-1 Slice 1)

    Add com.kamo.z.shared.mlos.config to @EnableJpaRepositories so KamoInitializer creates mlos_lender_profile + mlos_licensing_entry. Indexes (incl. UNIQUE market_id) are entity-declared via @Table — no SchemaCleanupRunner DDL needed.

  20. · kamo-shared-library

    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 (Long) + CommerceMarket (UUID) by id. NOTE marketId is UUID (CommerceMarket.id is gen_random_uuid; doc 04's 'Long FK' is a code-verified error, same case as AiDecision.loanFileId). profileVersion for replay. - LicensingEntry (per-state COMPANY licensing, distinct from member StewardLicense) — licenseType 8-value enum; stateCode ISO-3166-2; NO stored status, computed from effective/expiry dates via isEffectiveOn() (doc 04 §7.3). - LicensingResolver @Component (gated mlos.config.enabled): isTenantLicensed( profile, state, type) date-based; uncovered jurisdiction => false (act blocked). - Config-entity base pattern: manual @Id UUID + @Embedded EmbRecordState (NOT BaseUuidEntity — its timestamps would collide; doc 04 §3). 4 LicensingResolverTest green (TDD). Indexes entity-declared (UNIQUE market_id). Deferred: **************** singletons; MlosActivationService + SecurityService boot self-heal.

  21. · DaemonService

    DaemonService compliance-timer SLA sweep (timer adopter)

    First adopter of the MLOS compliance timers: a Quartz job (every 5 min) calls **************** to flip ARMED-but-past-deadline ECOA (AdverseActionTimer) + Reg X (RegXTimer) clocks to EXPIRED so a BLOCKED borrower cannot silently blow a regulatory deadline. - ComplianceTimerSweepJob (Quartz Job) + QuartzConfig JobDetail/Trigger; timer service is @Autowired(required=false) + a default-off enable flag, so the job is crash-safe regardless of config. - @EnableJpaRepositories += **************** - configmap: mlos.compliance.enabled=true (activates the shared-lib service) + **************** {enabled:true, cron:'0 */5 * * * ?'}. Safe no-op while timer tables are empty (no engine arms timers yet).

  22. · kamo-shared-library

    **************** 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 emission to a Compliance queue is a follow-up). Returns the count; empty timer tables are a safe no-op. 2 new tests (12 ComplianceTimerServiceTest green).

  23. · kamo-shared-library

    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: - DecisionRequest gains optional subjectStateCode (ISO-3166-2) + actType (LicensedActType). When both present AND a StewardAssigner bean exists (mlos.legal.enabled), the routed task is assigned to a steward licensed in that state for that act; otherwise it opens unassigned (a steward claims it). - StewardAssigner injected as an OPTIONAL Docstor via ObjectProvider, so a spine running without mlos.legal.enabled is unaffected. Back-compat 6-arg constructor retained — the 4 existing DecisionSpineTest pass unchanged. 29 mlos tests green (DecisionSpine 5, StewardAssigner 5, LegalRegistry 9, ComplianceTimer 10). Code-only — no schema change, no KamoInitializer run.

  24. · kamo-shared-library

    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 type in the borrower's state, load-balanced to fewest open StewardTasks (tie -> lowest memberId); empty when none covers the jurisdiction (caller escalates). - StewardAssigner @Component (gated mlos.legal.enabled) over StewardLicense + StewardTask repos — reads the MLOS gate registry, NOT locked-core orgs.License (no donotmodify deps; avoids the Member->(orgId,userId)->License join). - StewardLicense.isValidOn(date) — single source of truth for date-based licensure (status computed, never stored); **************** refactored to it. - **************** (candidate pool). 5 StewardAssignerTest green; 9 LegalRegistryTest still green (14 total). No schema change (no KamoInitializer run). Substrate-first — wiring into DecisionSpine.record() ROUTE_TO_HUMAN to stamp assignedMemberId is a follow-up.

  25. · InitializerService

    Register mlos.compliance repo pkg (Slice 2c-i)

    Add **************** to @EnableJpaRepositories so KamoInitializer creates mlos_adverse_action_timer + mlos_regx_timer. Indexes entity-declared via @Table — no SchemaCleanupRunner DDL needed.

  26. · kamo-shared-library

    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 (ECOA/Reg B 30-day clock; noticeKind ECOA_AA/COUNTEROFFER/ INCOMPLETE_NOA) + RegXTimer (affirmative servicing duties; dutyKind **************** Mutable **************** soft loanFileId ref, +orgId for tenant isolation. Breach-sweep index (status, deadline_at). - ComplianceTimerStatus enum + 2 repos with **************** - ComplianceTimerService @Component (gated mlos.compliance.enabled): arms timers, encodes the regulatory day-counts (30/36/120/5, locked by tests), CONTINUITY needs an explicit deadline, breach detection via injected Clock, sweep finders. 10 ComplianceTimerServiceTest green (TDD). Indexes entity-declared via @Table. DaemonService SLA-escalation + BLOCKED->STALE deferred (calls the sweep finders). Excluded this slice: ComplianceFinding (FK donotmodify.TridTimer), RBPN/FCRA notices, ChangedCircumstance.

  27. · InitializerService

    Register mlos.legal repo pkg (Slice 2b)

    Add com.kamo.z.shared.mlos.legal to @EnableJpaRepositories so KamoInitializer creates mlos_licensed_act_registry / mlos_ron_eligibility / mlos_steward_license. All indexes are entity-declared via @Table — no SchemaCleanupRunner DDL needed.

  28. · kamo-shared-library

    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 yet: - LicensedActRegistry (platform ref, per act+state) — does this regulated act legally require a licensed human? Unique(act_type, state_code). - RonEligibility (platform ref, per state) — ronAllowed/ipenRequired + the commissioning/signer/property alignment rule tokens. - StewardLicense (tenant-scoped, keyed to memberId) — NMLS-by-state licensure. NO stored status column: computed from effectiveDate<=today<=expiresAt (doc 13 §4.3 corrections ledger overrides doc 03's inline status field). - LegalRegistry @Component (gated mlos.legal.enabled, default off): fail-closed legallyRequiresHuman / stewardLicensedFor (date-based) / ronAllowedIn. stateCode is ISO-3166-2 String (international-ready; USStateType is dead code). Indexes entity-declared via @Table. 9 LegalRegistryTest pass (TDD). Composes the shipped DecisionGate by contract — no decision/steward edits. License-aware StewardTask assignment deferred to the next slice.

  29. · InitializerService

    Register mlos.steward + mlos.orchestration repos; Slice-2a schema

    - KamoInitializerApp @EnableJpaRepositories: add the accumulated MLOS repo packages **************** plus esign/personal_loans so KamoInitializer owns their schema. - SchemaCleanupRunner: generic @Enumerated whitelist-CHECK sweep; partial/ unique indexes + FKs for **************** **************** Decision-spine Slice-2a indexes are now entity-declared (@Table) so the Slice-2a block is a no-op comment.

  30. · kamo-shared-library

    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): composes the shipped DecisionGate + AiDecision WORM ledger + transactional outbox in one tx — ROUTE_TO_HUMAN opens a task + BLOCKs the stage; resolve() writes a HUMAN_OVERRODE decision + unblocks. Mutable state entities (no @PreUpdate). 4/4 Mockito tests green.

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