Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· kamo-shared-library
Regole guida + condizioni + evaluatore, condivisione del motore predicato LLPA (Phase-2 Slice 8)
Il predicato guida-rule congiunto di §8.1 step-2. Criticamente, REUSES la condizione recensione di Slice-4 evaluatore invece di duplicare la logica del predicato critico della sicurezza. DRY refactor (non regressivo — evaluator bodies byte-identical): L'interfaccia PredicateCondition e'... - MlosAdjustmentCondition + MlosGuidelineRuleCondition entrambi lo implementano. - Condizione di regolazioneEvaluator generalizzato a PredicateCondizione; regolazioneMatches -> allCondizioniMatch (List <? estende PredicateCondition>). Il test Slice-4 viene eseguito in verde (9), entrambi i precedenti HIGH si fissano intatti. Nuovo: - MlosGuidelineRule (mlos guideline rule): guidelineVersionId FK, productId FK, ruleCode (unique per versione), verdetto (RuleVerdict ELIGIBLE/INELIGIBLE/STIPULATED §10.3 vocab), requisitoKind Non e' vero. requisito Valore, gravità, fonteSectionRef, bandiera incondizionata. + MlosGuidelineRuleCondition (implementi PredicateCondition). - Linee guidaRuleEvaluator (ungated @Component) + Linee guidaValutazione + Linee guidaOutcome: una regola incendi quando tutte le sue condizioni detengono (tramite l'evaluatore condiviso); INELIGIBLE iff qualsiasi regola INELIGIBLE licenziata; stipulazioni raccolti. 8 Linee guidaRuleEvaluatorTest verde. Rivisto individualmente (2-agente): refattore confermato date-identico/non regressivo; MEDIUM fisso pericolo di sovra-blocco — una regola non-blanket con zero condizioni ora fallisce SAFE (non spara) quindi una semi-autorizzato/dangling-FK INELIGIBLE regola non può bloccare silenziosamente ogni mutuatario (mirrors value-set fail-closed); esplicito `non condizionata` bandiera per regole di coperta intenzionali. N. cambio codice KamoInitializer.
· InitializerService
Indice di unità parziale (Phase-2 Slice 7)
SchemaCleanupRunner: ux guideline version active par-unique ON mlos guideline version (organization id, product id) DOVE stato='ACTIVE' E effettivo until IS NULL — una versione di guida ACTIVE aperta / corrente per (org, prodotto); specchi ux rate sheet version active (doc 02 §6.5). Catalogo repo pkg già registrato (Slice 1).
· kamo-shared-library
MlosGuidelineVersione (WORM) + Linee GuidaVersioneRisolvente (Phase-2 Slice 7)
La linea guida efficace immutabile VERSION — le matrici di idoneità del contenitore E le regole della futura linea guida sono spente. Fedele replicazione della colonna vertebrale Slice-1 MlosRateSheetVersion, con chiave per prodotto (vs per investitore). - MlosGuidelineVersione (mlos guideline version): prodottoId FK, revisioneLabel, efficace da/fino, sequence no, supersedes id self-FK, stato, source document id FK, kb article guid + kb article version no (§6.4 KB-prose drift-pin, immutabile). WORM parziale a strati (@PostLoad snapshot + @PreUpdate diff): congela l'identità / il contenuto, consente solo DRAFT-> ACTIVE, ACTIVE->SUPERSED, ACTIVE->RETIRED + write-once Effect until close. Traduzione: - GuidelineVersionResolver (gated mlos.catalog.enabled): risoluzione delle finestre point-in-time, mai più recente, getta su sovrapposizione. Specchi EfficaceVersionResolver. - 17 test green (6 GuidelineVersionResolverTest + 11 ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** KamoInitializer aggiunge ux guideline version active par-unique (un ACTIVE aperto per org+product).
· kamo-shared-library
Matrice di ammissibilità + celle + fiammifero cellulare (Phase-2 Slice 6)
§8.1 step-2 primo substrato filtrante eleggibilità (congiunzione cellulare; guideline rule + AUS gate AND in seguito). - MlosEligibilityMatrix (mlos eligibility matrix): Efficace, REUSES ha bloccato l'URLA. via @Enumerated(STRING) su nuove colonne (senza FK, mai le modifica); guidaVersionId soft-FK (nullable fino alle linee guida). - MlosEligibilityCell (mlos eligibility cell): finestra di idoneità digitata — fico low/high, property type (TipeUrla chiusa), unit low/high, prestito amount low/high, state set id (FK MlosValueSet), Limit value. Prezzo/limiti numeri grezzi BigDecimal (convenzione del catalogo). - MlosMatrixType {MAX LTV,MAX CLTV,MAX DTI} — discriminatore per il quale rapporto limit value caps. - AmmissibilitàCellMatcher (ungated @Component) + ScenarioRiutilizzo degli effetti + Ammissibilità Risultato E' il momento giusto. + Ammissibilità Risultato: individuare la cella contenente attraverso E' il momento giusto. RATIO-DISPATCH da matrix type (ltv/cltv/dti) testato vs limit; mancante attr richiesto → CANNOT PRICE (hoisted before coverage); stato non chiuso; sovrapposizione → più restrittivo (superato in dettaglio). 12 AmmissibilitàCellMatcherTest verde. Enum-reuse + spec dal flusso di lavoro di ricerca; inversarially review (2-agent): rapporto matrix type fisso dispacciamento + hoisted-ratio CANNOT PRICE + sovrapposizione osservabilità + abbassato non omologato ALTRI. No. KamoInitializer codice di cambiamento (catalogo repo pkg registrato Slice 1) — solo re-run.
· kamo-shared-library
MlosMarginSchedule + MarginScheduleResolver (Phase-2 Slice 5)
Lo strato di margine dell'investitore — il termine "+ margin schedule" dell'assemblea dei prezzi §8.1 step-4. - MlosMarginSchedule (mlos margin schedule): tassoSheetVersionId FK, prodottoId (null=all), marginType, prestitoAmountLow/High band, valore (raw BigDecimal), compBasis (BORROWER PAID|LENDER PAID). - CompBasis enum — la convenzione di comp BASIS (come è pagato il margine), NON un importo comp-plan LO; non è mai un input di punteggio (doc 13 §8.5). - MarginScheduleResolver (ungated @Component): applicabile(scheduli, prestitoAmount, compBasis) = banda contiene l'importo (incluso, null=open) E corrispondenze comp; totaleMargin = valori Σ (ZERO se nessuno). 5 MarginScheduleResolverTest verde. Numeri di prezzo grezzi BigDecimal (Slice-3 correzione). NO KamoInitializer codice cambiamento (catalogo repo pkg registrato Slice 1; indici dichiarati entità) — solo re-run.
· InitializerService
Valore di proprietà della piattaforma CHECK (Phase-2 Slice 4)
SchemaCleanupRunner: ADD CONSTRAINT mlos value set ownership chk CHECK (platform owned = (organization id IS NULL) — doc 02 §6.2: una tassonomia della piattaforma è platform owned con un org null; un set specifico org è org-scoped. Bicondizionato `= ... IS NULL` la forma sopravvive alla spazzata enum-whitelist. Catalogo repo pkg già registrato (Slice 1).
· kamo-shared-library
Regolazioni LLPA + set di valori + evaluatore di condizione (Phase-2 Slice 4)
Lo strato LLPA/adjustment + il motore predicato deterministico per la corrispondenza §8.1 step-4 ("an tutte le sue condizioni sono soddisfatte"). - MlosPriceAdjustment (mlos price adjustment): tassoSheetVersionId FK, prodottoId (null=all), regolazioneGruppo, funzionamento (ADDITIVE|MULTIPLICATIVE), valore, stackOrder, capValue, etichetta. - MlosAdjustmentCondition (mlos adjustment condizione): prezzoAdjustmentId FK, attributo, operatore Non e' vero. numLow/numHigh, valoreSetId FK. - MlosValueSet (mlos value set) + MlosValueSetMember (mlos value set member): nominato categorico set; il doc 02 §6.2 eccezione della piattaforma (organizzazioneId nullable + piattaformaOwned flag on il solo SET; il membro non porta specchio orgId — la proprietà tramite il set, nessuna superficie di deriva). - RegolazioneCondizioneEvaluator (ungated @Component) + ScenarioFatti: ops numerici vs num low/high, set ops vs membri risolti; fatto mancante → no match; SET OPS FAIL CLOSED su membro vuoto/null set (un abbagliante soft-FK valore impostato non corrisponde mai silenziosamente a tutti) e null-resolver-safe (no NPE). Nove... Rivisto inversamente (flusso di lavoro di 2 anni): fissato 2 bug di evaluator HIGH (NOT IN fail-open su vuoto set; NPE su null risolver) + ha lasciato cadere il membro ridondante orgId mirror per la recensione. Prezzo numeri grezzi BigDecimal (Slice-3 correzione). KamoInitializer aggiunge il valore-set di proprietà CHECK.
· kamo-shared-library
MlosBasePriceGrid + NoteRateLe celle a prezzo più basso (Phase-2 Slice 3)
Il tasso di prezzo / celle di prezzo - prima entità di catalogo a FK BOTH una versione del foglio di tasso (Slice 1) E un prodotto (Slice 2); la base dell'assemblaggio dei prezzi §8.1. - MlosBasePriceGrid (mlos base price grid): tassoSheetVersionId FK, prodottoId FK, noteRate, lockPeriodDays, basePrezzo (prezzo a 100), punti base, min/maxLoanAmount, ioFlag. UNICO composito (versione, prodotto, note rate, lock period days, io flag) entità dichiarata (io flag NON NULL → completo unico, senza DDL crudo). - NoteRateLadder (ungated @Component): par = cella più vicina al prezzo-100; più vicinaToPrice(target); cravatte -> tasso di nota inferiore (doc 02 §8.1 step 5). 5 NoteRateLadderTest verde. CODE-VERIFIED CORRECTION: doc 02 §6 dice EmbMoney/EmbPercent, ma il LoanPricingSnapshot bloccato (l'ancora di riproducibilità) utilizza RAW BigDecimal — interesseRate DECIMAL(9,6), punti DECIMAL(9,4), nessun embeddables; EmbPercent(9,4) non può corrispondere ad un tasso di 6-decimale. Così istantanea-mirrored griglia prezzi numeri utilizzare grezzo BigDecimal corrispondenza LoanPricingSnapshot (note rate 9,6 / base price+points 9,4 / Importo del prestito 18,2). No KamoInitializer codice cambiamento (catalogo repo pkg registrato Slice 1; unico indice entità dichiarata) — solo re-run.
· InitializerService
Mlos product ARM-consistency CHECK (Phase-2 Slice 2)
Traduzione: CHECK ((amortization type = 'ARM') = (arm fixed period months IS NOT NULL)) — un periodo fisso è ha dichiarato IFF il prodotto è un ARM (doc 02 §6.6). `= ... NON È NULL` forma (non un enum nudo IN-list) sopravvive al generico enum whitelist CHECK spazza. Catalogo repo pkg già registrato in Slice 1.
· kamo-shared-library
MlosProduct + strato di tossonomia del prodotto MlosArmIndex (Phase-2 Slice 2)
La colonna vertebrale del prodotto del catalogo (doc 02 §6.3): tutto a valle (prezzo base) griglie, matrici di idoneità, regole di linea guida) FK a MlosProduct.uid. - MlosProduct (mlos product): prodotto per-investor — investitoreId FK, prodottoCodice, ammortamento Tipo (REUSES bloccato URLA AmortizationType), termineMonths, braccioFixedPeriodMonths, braccioIndexId FK, prestitoClass, documentazioneTipo, conforme, losProgramCode (REUSES bloccato 17-valore LoanProgramCode, §6.4), guidelineVersionPointer (reale FK-by-id al futuro MlosGuidelineVersion.uid, nullable), attivo. assertStructurallyValid(): arm fixed period months set IFF amortization type=ARM. - MlosArmIndex (mlos arm index): indexName, marginBps, berretti iniziali/periodici/vitali + pavimento come EmbPercent (doc 02 §6 tasso-via-EmbPercent), regolareMonths. - 2 nuovi enums LoanClass / Documentazione Tipo (catalogo-specifico; DocumentazioneTipo è il §3.5 non QM Doc-program class, distinta da Slice-1 MlosDocType). 2 repos. Base = BaseUuidEntity; orgId=Long @JsonSerialize(ToString). 5 MlosProductInvariantTest verde. KamoInitializer aggiunge il mlos product ARM-consistency DB CHECK (catalogo repo pkg già registrato in Slice 1). Deferito: il prezzo e'...
· InitializerService
Repos del catalogo del registro + indice no-overlap di conversione del foglio di tasso (Phase-2 Slice 1)
- @EnableJpaRepositories += com.kamo.z.shared.mlos.catalog (il nuovo MlosInvestor/ ************************** repos; entità già coperte da @EntityScan). - SchemaCleanupRunner: indice ux rate sheet version active par-unique SU mlos rate sheet version (organization id, investor id) efficace until IS NULL — backstops "una versione ACTIVE aperta per (org, investitore)" no-overlap invariant (doc 02 §6.5; CRDB non ha vincoli di esclusione di gamma).
· kamo-shared-library
Catalog provenienza + colonna vertebrale di versione efficace (Phase-2 Slice 1)
La più piccola fetta spedibile del catalogo Phase-2 (doc 02 §6): la catena di provenienza ImgDat -> MlosSourceDocument -> MlosRateSheetVersione e l'immutabile efficace versione della colonna vertebrale con risoluzione puntuale. Substrate-first (no MLOSCatalogService) scrittore ancora); questo è l'immutabile-catalogo-PK fondazione DecisionInput sarà FK a. Nuovo pkg com.kamo.z.shared.mlos.catalog: - MlosInvestor ( registro per-org; short code Unique per org), MlosSourceDocument (penso annotazione sopra bloccato ImgDat; soft-FK img dat id, mai ri-store byte, doc 02 §6.4). - MlosRateSheetVersione: versione effettiva immutabile (efficaci da/finestra, supersedi auto-FK, sequence no, stato lifecycle, source document FK, cutoff time) con un app-layer parziale-mutabilità WORM guard (@PostLoad snapshot + @PreUpdate diff): congela Cols di identità/prezzi, consente solo DRAFT->ACTIVE, ACTIVE->SUPERSED, ACTIVE->RETIRED e la chiusura di scrittura di efficace until. Nessun trigger DB (CRDB non può finalizzare a 24.3). - EfficaceVersionResolver (gated mlos.catalog.enabled): risoluzione puntuale — la versione il cui [efficace dall'efficace until] finestra CONTAINS priced as of, mai un "l'ultima riga" si uniscono; getta su sovrapposizione effettiva della finestra (profondità, doc 02 §6.5/§8.1). 6 numeri. TassoSheetVersionStatus) + 3 repos. Base = BaseUuidEntity (doc 02 §6.1); orgId=Long @JsonSerialize(ToString) (Codice-verified: Organization.id è unico rowid, non doc 02 "UUUID"). 17 test verdi (6 punti di risoluzione in tempo + 11 WORM guard). KamoInitializer aggiunge il catalogo repo pkg + il ux rate sheet version active Indice parziale-unique no-overlap.
· kamo-shared-library
Sovraccarico della soglia di fiducia per-tenant (config↔gate cablaggio)
Decisione complementareGate.evaluate(stadio, fiducia, legalmenteRequiresHuman, BigDecimal inquilinoThresholdOverride) — la parete per-tenant regolabile in autonomia "Posizione, piano". The parete legale rimane assoluta e il override è STILL pavimentato dal non-tunable piano di sicurezza (l'autonomia non può mai auto-agire sotto di esso). Null override torna indietro a la piattaforma predefinita; l'attuale 3-arg valuta() delegati con null, quindi il spedizione gate/DecisionSpine comportamento + i loro test sono invariati. Aggiunta di sicurezzaFloor() getter così un chiamante risolve la soglia di inquilino contro lo stesso piano. Questo collega la fondazione Phase-1 config al cancello di decisione: un motore può ora ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** E' il momento giusto. 9 DecisionGateTest (4 nuovo) + 5 DecisionSpineTest + 6 MlosActivationServiceTest verde.
· InitializerService
Indici univoci parziali + invarianti di manutenzione ( completamento di configurazione Phase-1)
SchemaCleanupRunner DDL per i nuovi domini mlos.config (mlos.config già in @EnableJpaRepositories; Hibernate ddl-auto:update crea i tavoli): - indici unici parziali unattivi (WHERE is active=true AND Effect to IS NULL) su mlos pricing policy / mlos capital policy / mlos servicing policy (lender profile id) + mlos product enablement (lender profile id, program id) — Hibernate non può emettere QUI indici. - ServicingPolicy immutabile invarianti: CHECK scra enforced=true + fdcpa enforced=true (=-CHECKs, sopravvivere alla spazzata enum whitelist).
· kamo-shared-library
Domini di configurazione di fase-1 completi + MlosActivationService (Slice 5)
Completa l'inventario dell'entità di configurazione del doc 04 - Sintoni di politica (un-attivo-per-profilo, efficace-dated/append-only): Prezzo dellaPolizia (fontePriorità Elenco <String> — MortgageVendorTipo differito al dominio del fornitore §5; NO LO-comp), CapitalPolicy (NO pullThroughPct) + Concentrazione del capitale Limitare il bambino, ServicingPolicy (scra/fdcpa immutabile invarianti). Indici unici parziali + scra/fdcpa CHECKs andare in KamoInitializer. - ProductEnablement (single-active per program; canaleRestriction @ElementCollection; programId UUID — Program.id è UUID, doc 'Long' è un errore codificato). - Famiglia di investitori: InvestorConfig + InvestorOverlay + DeliveryRule (riutilizzo ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** - RiskOverlay (ruleExpression JSONB String). 11 nuovi enum. - MlosActivationService @Component (gated mlos.config.enabled): risolveProfile(org Id) + ********************} ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** } ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** config + AutonomyResolver (la fonte per-tenant per la parete di fiducia del cancello). 23 mlos.config test verdi (MlosActivationService 6 nuovo). Modello base Config-entity in tutto (manuale @Id UUID + @Embedded EmbRecordState; bambini no EmbRecordState). Piano: E' il momento giusto. (esteso). Deferito: matrice di attivazione a schermo intero/modulo/vendor + validateProfile + SecurityService self-heal; *.config.history append-only table; predicate evaluators.
· kamo-shared-library
Canale Applicabilità motore (Phase-1 Slice 4)
Il risolutore più restrittivo deterministico (doc 04 §8) — Prodotto x Canale x Indagine - > {ALLOWED|DISALLOWED, esecuzionePath,authorityModel, finanziamentoBehavior}. - ChannelApplicability. statoExpression(JSONB String, Program.rulesetJson precedente)/outcome/ # Date + # EmbRecordState. priorità DERIVED da campo (non memorizzato). Stesso modello base di configurazione. - 5 enums: RuleScope(+priority() Investor=0.Tenant=3), Canale, Applicabilità, Non e' vero. (HYBRID risolto per-loan a questi), FinanziamentoTrasporti(5, incl PORTFOLIO HOLD — Il valore 4 di DeliveryRule unificare differito). - ChannelApplicabilityResolver @Component (ungated, stateless): vuoto/qualsiasi-DISALLOWED => DISALLOWED (la lettura più restrittiva sicura dell'ambiguità §8.2); altrimenti ALLOWED con attriti dalla portata più forte. Registrazione ChannelResolution. 5 **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** condizioneEspressione predicato evaluator + filtro di abbattimento efficace + AiDecision pinning + MlosActivationService differito. mlos.config già in KamoInitializer scansione — eseguire solo. Piano: E' il momento giusto
· kamo-shared-library
AutoritàConfig (autorità di scrittura + delegazioni di govt) — Fase-1
- AuthorityConfig (singleton per LenderProfile): sottoscrizione DELEGATO/NON DELEGATO/HYBRID + manualeAllowed + govtDelegation Set {FHA DE,VA SAR LAPP,USDA,NONE} via @ElementCollection (tabella di raccolta mlos authority govt delegation) — cancelli interni govt UW vs agenzia referral. haGovtDelegation() helper ( risoluzione HYBRID/canale differita). - SottoscrizioneAuthority + GovtDelegation enums + AuthorityConfigRepository. - Stesso modello di base di configurazione (manuale @Id UUID + @Embedded EmbRecordState); UNIQUE(lender profile id) singleton. Prima @ElementCollection in mlos.*. 3 AuthorityConfigTest green (12 test mlos.config). mlos.config già in KamoInitializer scansione — re-run crea mlos authority config + la tabella di raccolta.
· kamo-shared-library
Autonomia AI config + risolutore a pavimento di sicurezza (Phase-1 Slice 2)
- AiAutonomyConfig (singleton per LenderProfile; autonomiaLevel ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** autoExecuteEnabled) + AutonomyStageOverride (per (profilo,stage); stageKey riutilizza Esercizio del ciclo di vita — nessun PipelineStage separato esiste; fiduciaThreshold + AutoExecuteEnabled). Stesso modello base di config-entity (manuale @Id UUID + @Embedded EmbRecordState); UNIQUE(lender profile id) singleton + UNIQUE(profilo,stage key). - AutonomyResolver @Component (ungato, senza stato come DecisionGate): efficace Soglia = max(stageOverride?:globale, sicurezzaFloor) — autonomia sintonizza SOLO la parete di fiducia e non può mai abbassare il pavimento della piattaforma non visibile (doc 13 §8.7); autoExecuteEnabled override-then-global. La fonte per-tenant per la parete di fiducia del cancello (cavo differito). 5 AutonomyResolverTest + 4 LicensingResolverTest verde (TDD). Indici delle entità dichiarate. mlos.config già in KamoInitializer scansione — re-run crea le 2 nuove tabelle.
· InitializerService
Registrare mlos.config repo pkg (Phase-1 Slice 1)
Aggiungi com.kamo.z.shared.mlos.config a @EnableJpaRepositories così KamoInitializer crea mlos lender profile + mlos licensing entry. Indici (incl. UNICA market id) sono dichiarati tramite @Table - nessun SchemaCleanupRunner DDL necessario.
· kamo-shared-library
LenderProfile + LicensingEntry config foundation (Phase-1 Slice 1)
Nuova fondazione com.kamo.z.shared.mlos.config inquiant-config (doc 04 §3): - LenderProfile (root, UNIQUE per MORTGAGE marketId) — soft-FKs bloccato Organizzazione (Long) + CommerceMarket (UUUID) di id. NOTA marketId è UUID (CommerceMarket.id è gen random uuid; doc 04 'Long FK' è un codice verificato errore, stesso caso di AiDecision.loanFileId). profiloVersione per replay. - LicensingEntry (concessione di licenze per lo Stato, distinta dal membro StewardLicense) — licenzaTipo 8-valore enum; statoCodice ISO-3166-2; NO stato memorizzato, calcolato dalle date effettive/espulsioni tramite isEffectiveOn() (doc 04 §7.3). - LicensingResolver @Component (gated mlos.config.enabled): isTenantLicensed( profilo, stato, tipo) data-based; giurisdizione scoperta => falso (atto bloccato). - Modello di base di conflitto: manuale @Id UUID + @Embedded EmbRecordState (NOT BaseUuidEntity — i suoi timestamp si scontrano; doc 04 §3). 4 LicensingResolverTest verde (TDD). Indici delle entità dichiarate (UNIQUE market id). Deferito: singletons; MlosActivation Servizio + Sicurezza Servizio di avvio self-heal.
· DaemonService
DaemonService compliance-timer SLA spazzata (adottatore del cliente)
Primo adottatore dei timer di conformità MLOS: un lavoro al quarzo (ogni 5 min) chiama ECOA ARMED- ma-past-deadline (AdverseActionTimer) + Reg X (RegXTimer) orologi a EXPIRED in modo da un mutuatario BLOCKED non può silenziosamente soffiare una scadenza regolamentare. - ComplianceTimerSweepJob (Quartz Job) + QuartzConfig JobDetail/Trigger; timer servizio è @Autowired(required=false) + un default-off abilitare la bandiera, quindi il lavoro è sicuro da crash indipendentemente dalla configurazione. - @EnableJpaRepositories += Non e' vero. - configmap: mlos.compliance.enabled=true (attiva il servizio condiviso-lib) + E' il momento giusto. Traduzione: Sicuro no-op mentre i tavoli timer sono vuoti (non c'è ancora il timer del motore).
· kamo-shared-library
Per il DaemonService SLA
Flips ogni ARMED-but-past-deadline AdverseActionTimer + RegXTimer a EXPIRED (il segnale di escalation durevole le superfici dello schermo di compensazione steward; evento emissione a una coda di conformità è un follow-up). Restituisce il conteggio; timer vuoto i tavoli sono un no-op sicuro. 2 nuovi test (12 ComplianceTimerService Prova verde).
· kamo-shared-library
Assegnazione di licenza via cavo in DecisionSpine (Slice 2b-ii)
DecisioneSpine.record() ora francobolli StewardTask.assignedMemberId dal StewardAssigner quando una decisione percorsa porta la giurisdizione del prestito: - DecisioneRichiesta guadagni soggetto facoltativoStateCode (ISO-3166-2) + actType (Tipo Licensed). Quando esiste un fagiolo di StewardAssigner (mlos.legal.enabled), l'attività instradata viene assegnata a uno steward concesso in licenza lo stato per quell'atto; altrimenti si apre senza firma (un amministratore lo sostiene). - StewardAssigner iniettato come Docstor OPTIONAL tramite ObjectProvider, quindi un la colonna vertebrale che scorre senza mlos.legal.enabled non è influenzata. Back-compat 6-arg costruttore mantenuto — il passaggio 4 DecisionSpineTest esistente invariato. 29 mlos test verdi (DecisionSpine 5, StewardAssigner 5, LegalRegistry 9, ComplianceTimer 10). Solo in codice — nessun cambiamento di schema, nessun run KamoInitializer.
· kamo-shared-library
StewardAssigner (decision-spine Slice 2b-ii)
Aggiunge il selettore di steward licenza-aware (doc 03 §3.2; doc 01 §6 #9) — sceglie un steward il cui MLOS StewardLicense è valido TODAY per la licenza richiesta dell'atto tipo nello stato del mutuatario, bilanciato dal carico al minimo aperto StewardTasks (tie -> membro più bassoId); vuoto quando nessuno copre la giurisdizione (caller escalates). - StewardAssigner @Component (gated mlos.legal.enabled) su StewardLicense + StewardTask repos — legge il registro delle porte MLOS, NON bloccata-core org. Licenza (non modificate le dep; evitate l'adesione all'Unione europea (orgId, userId)->License). - StewardLicense.isValidOn(data) — unica fonte di verità per la licensura a data (status calcolato, mai immagazzinato); Non e' vero. rifatto. - No, no. (piscina incandidate). 5 StewardAssignerTest green; 9 LegalRegistry Prova ancora verde (14 totale). Nessun schema cambiamento (no KamoInitializer run). Substrate-first — cablaggio nella decisioneSpine.record() ROUTE TO HUMAN timbrare assegnatoMemberId è un follow-up.
· InitializerService
Registrare mlos.compliance repo pkg (Slice 2c-i)
Aggiungi a @EnableJpaRepositories così KamoInitializer crea mlos adverse action timer + mlos regx timer. Indici entità dichiarate tramite @Table — no SchemaCleanupRunner DDL necessario.
· kamo-shared-library
ECOA + Reg X timer substrato (decisione-spina Slice 2c-i)
Nuovo **********************************************************************pacchetto (doc 03 §2.8) analoghi di conformità-timer del donotmodify bloccato. TridTimer. Substrate-first: - AdverseActionTimer (ECOA/Reg B orologio di 30 giorni; avvisoKind ECOA AA/COUNTEROFFER/ INCOMPLETE NOA) + RegXTimer (doveri di servizio assuativi; dutyKind E' il momento giusto. Muta # Id ref, +orgId for # isolamento inquilino. Breach-sweep index (status, scadenze at). - ComplianceTimerStatus enum + 2 repos con... - ComplianceTimerService @Component (gated mlos.compliance.enabled): timer di braccia, codifica i conti diurni regolamentari (30/36/120/5, bloccati dai test), CONTINUITÀ ha bisogno di una scadenza esplicita, violazione di rilevamento tramite orologio iniettato, ricercatori di spazza. 10 ComplianceTimerServiceTest green (TDD). Indici entità dichiarata tramite @Table. DaemonService SLA-escalation + BLOCKED->STALE differito (chiama i cercatori di spazza). Esclusa questa fetta: ComplianceFinding (FK donotmodify. TridTimer), RBPN/FCRA Avviso, ChangedCircumstance.
· InitializerService
Registrare mlos.legal repo pkg (Slice 2b)
Aggiungi com.kamo.z.shared.mlos.legal a @EnableJpaRepositories così KamoInitializer crea mlos licensed act registry / mlos ron eligibility / mlos steward license. Tutti gli indici sono dichiarati tramite @Table - nessun SchemaCleanupRunner DDL necessario.
· kamo-shared-library
Sostrato legale del registro di stato (decisione-spina Slice 2b)
Nuovo pacchetto com.kamo.z.shared.mlos.legal — il produttore greenfield del L'ingresso assoluto di DecisionGate (doc 03 §3.2). Substrate-first, no adottivo ancora: - L'ActRegistry concesso in licenza (ref di piattaforma, per atto+stato) — fa questo atto regolamentato legalmente richiedono un umano autorizzato? Unico(act type, state code). - Ammissibilità (rif, per Stato) — ronAllowed/ipen Richiesto + token della regola di allineamento di messa in servizio/signer/property. - StewardLicense (tenant-scoped, keyed to memberId) — NMLS-by-state licensure. Nessuna colonna di stato memorizzata: calcolata da efficaceDate <=al giorno (doc 13 § 4.3 correzioni a ledger overrides doc 03's inline status field). - LegalRegistry @Component (gated mlos.legal.enabled, default off): non chiuso legalmenteRequiresHuman / stewardLicensedPer (data-based) / ronAllowedIn. StateCode è ISO-3166-2 String (già internazionale; USStateType è codice morto). Indici entità dichiarata tramite @Table. 9 LegalRegistrati Passo di prova (TDD). Compone la decisione speditaGate per contratto — nessuna decisione / modifiche di coda. Assegnazione StewardTask con licenza differita alla prossima fetta.
· InitializerService
Registrare mlos.steward + mlos.orchestrazione repos; Slice-2a schema
- KamoInitializerApp @EnableJpaRepositories: aggiungere il repo MLOS accumulato pacchetti E' il momento giusto. più esign/personal loans così KamoInitializer possiede il loro schema. - SchemaCleanupRunner: generico @Enumerated whitelist-CHECK spazzamento; parziale/ Indici unici + FK per **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** Non e' vero. Gli indici Slice-2a della decisione-spina sono ora entità-dichiarata (@Table) quindi il blocco Slice-2a è un commento no-op.
· 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): compone il + Adecision WORM ledger + outbox transazionale in un tx — ROUTE TO HUMAN apre un compito + BLOCKs stadio; risolve() scrive una decisione HUMAN OVERRODE + sblocca. entità statali mutali (no @PreUpdate). 4/4 Mockito prova verde.

Il tuo universo ti sta aspettando.
Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.
Gratis per sempre — nessuna carta di credito richiesta