Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· kamo-shared-library
Regras de orientação + condições + avaliador, partilhando o motor de predicação LLPA (Fase-2 corte 8)
A regra-diretriz predica o conjunto de §8.1 passo-2. Críticamente, RECUSA a condição revisada Slice-4 avaliador em vez de duplicar a lógica do predicado crítico de segurança. Refactor DRY (não regressivo — organismos de avaliação bytes idênticos): - Predicar interface de condicionalidade. - MlosAdjustmentCondition + MlosGuidelineRuleCondition ambos implementá-lo. - AjusteCondiçãoAvaliador generalizado para PredicarCondição; ajusteMatches -> allConditionsMatch (List<? extende PredicateCondition>). O teste Slice-4 re-executa verde (9), ambas as correções HIGH anteriores intactas. Novo: - MlosGuidelineRule (mlos guideline rule): guidelineVersionId FK, productId FK, ruleCode (unique per version), veredito (Regra Veredict ELEGÍVEL/INELIGÍVEL/SIPLULADO §10.3 vocab), requisição **************************** requisito Valor, gravidade, fonteSectionRef, + MlosGuidelineRuleCondition (implementos PredicateCondition). - OrientaçãoRegraAvaliador (ungado @Componente) + OrientaçãoAvaliação + OrientaçãoResultados: uma regra dispara quando todas as suas condições se encontram (através do avaliador compartilhado); inelegível se houver alguma regra inelegível; estipulações Recolhido. 8 OrientaçãoRegraAvaliadorTeste verde. Revisado adversamente (2-agente): refator confirmado byte-identical/non-regressive; MÉDIO fixo perigo de sobrebloco — uma regra não-blanquete com condições zero agora falha SAFE (não dispara) assim um Regra inelegível não pode bloquear silenciosamente todos os mutuários Fail-closed); bandeira explícita `incondited` para regras de cobertura intencional. NO KamoInitializer mudança de código.
· InitializerService
Índice unico parcial sem sobreposição da orientação-versão (Fase-2 corte 7)
EsquemaLimpezaRunner: ux guideline version active parcial- unique ON mlos guideline version (organization id, product id) ONDE status='ACTIVE' E eficaz até IS NULL — uma versão aberta/corrente da orientação activa por (org, produto); espelhos ux rate sheet version active (doc 02 §6.5). Repor catálogo pkg já registrado (Slice 1).
· kamo-shared-library
MlosGuidelineVersion (WORM) + GuidelineVersionResolver (Fase-2 7)
As matrizes de elegibilidade dos contentores E as futuras regras da diretriz são válidas. Replicação fiel do Slice-1 revisado MlosRateSheetVersion espinha, chaveado por produto (vs por investidor). - MlosGuidelineVersion (mlos guideline version): productId FK, revisionLabel, effective from/til, sequence no, suplanta id self-FK, status, source document id FK, kb article guid + kb article version no (§6.4 KB-prose drift-pin, imutável). WORM de mutação parcial da camada de aplicação (@PostLoad snapshot + @PreUpdate diff): congela identidade/conteúdo, permite apenas DRAFT-> Ativos, ACTIVO-> SUPERIOR, ACTIVO->RETIR + gravação- uma vez eficaz até fechar. - DiretrizVersionStatus - GuidelineVersionResolver (gated mlos.catalog.enabled): resolução de janela ponto-em-tempo, nunca última linha, lança sobreposição. Espelhos EffectiveVersionResolver. - 17 testes verdes (6 OrientaçãoVersãoResolverTest + 11 ************* KamoInitializer adiciona ux guideline version active parcial-unique (um ativo aberto por org+produto).
· kamo-shared-library
Elegibilidade matriz + células + fósforo celular (Fase-2 corte 6)
O substrato §8.1 passo-2 de elegibilidade-primeiro filtro (o conjunto de células; guideline rule + AUS gate AND mais tarde). - MlosEligibilidadeMatrix (mlos eligibilidade matriz): por **************** Effective-dated; REUSAS locked URLA **************** via @Enumerado(STRING) em novas colunas (sem FK, nunca as edita); diretrizVersionId soft-FK (nulable até diretrizes). - MlosEligibilityCell (mlos eligibility cell): janela de elegibilidade digitada — fico low/high, property type (Locked PropertyTypeUrla), unidades low/high, loan amount low/high, state set id (FK MlosValueSet), valor limite. Preços/números-limite brutos BigDecimal (convenção de catálogo). - MlosMatrixType {MAX LTV, MAX CLTV, MAX DTI} — discriminador para o qual a relação limite valor caps. - ElegibilidadeCellMatcher (ungado @Component) + CenárioFactos reutilização + Elegibilidade Resultado **************************** + Elegibilidade Resultado: localizar a célula que contém **************************** RATIO-DISPATCH por tipo matriz (ltv/cltv/dti) testado vs limite; falta attr → CANNOT PRICE (alojado antes da cobertura); estado de falha fechada; sobreposição → mais restrito (superior em detalhe). 12 ElegibilidadeCellMatcherTest green. Enum-reuse + spec do fluxo de trabalho de pesquisa; revisado adversamente (2-agent): razão de tipo matricial fixa expedição + ratio içado CANNOT PRICE + sobreposição observação + derrubado sem honra OUTROS. NÃO Alteração de código KamoInitializer (catalog repo pkg registered Slice 1) — apenas re-run.
· kamo-shared-library
MlosMarginSchedule + MargemScheduleResolver (Fase-2 corte 5)
A camada de margem do investidor — o termo "+ margin schedule" da montagem de preços §8.1 step-4. - MlosMarginSchedule (mlos margin schedule): rateScheetVersionId FK, productId (null=all), marginType, empréstimoAmountLow/High band, value (braw BigDecimal), compBasis (BORROWER PAID) LENDER PAID. - CompBasis enum — a convenção comp BASIS (como a margem é paga), NÃO um montante LO comp-plan; LO comp é nunca uma entrada de pontuação (doc 13 §8.5). - MargemScheduleResolver (ungado @Component): aplicável(agendas, empréstimoAmount, compBasis) = banda contém quantidade (inclusive, null=open) E correspondências de comp; totalMargin = ‡ valores (ZERO se nenhum). 5 MargemScheduleResolverTest green. Números de preços brutos BigDecimal (correcção Slice-3). NO KamoInitializer mudança de código (catalog repo pkg registado Slice 1; índices declarados pela entidade) — apenas re-run.
· InitializerService
Propriedade de uma plataforma de valores (Fase-2 Slice 4)
SchemaCleanupRunner: ADD CONSTRINT mlos value set propriety chk (platform own = (organization id IS NULL)) — doc 02 §6.2: uma taxonomia de plataforma é platform owned com uma org nula; um conjunto específico de org é org-scoped. Bicondicional `= ... IS NULL` A forma sobrevive à varredura enum-whitelist. Repor catálogo pkg já registrado (Slice 1).
· kamo-shared-library
Ajustamentos LLPA + conjuntos de valores + avaliador de condições (Fase-2 corte 4)
A camada LLPA/ajustamento + o motor de predicação determinística para a correspondência do passo 4 §8.1 ("uma Ajustar correspondências iff TODAS as suas condições estão satisfeitas"). - MlosPriceAdjustment (mlos price adjustment): rateSheetVersionId FK, productId (null=all), ajustmentGroup, operation (ADDITIVE), value, stackOrder, capValue, label. - MlosAdjustmentCondition (mlos adjustment condition): priceAdjustmentId FK, atributo, operador **************************** Numlow/numAlto, valorSetId FK. - MlosValueSet (mlos value set) + MlosValueSetMember (mlos value set member): nomeado categórico conjuntos; a exceção do doc 02 § 6.2 (organizaçãoId nullable + plataformaOwned flag on apenas o SET; o membro não carrega nenhum espelho orgld — propriedade através do conjunto, nenhuma superfície de deriva). - AjusteCondiçãoAvaliador (ungado @Component) + CenárioFactos: ops numéricos vs num low/high, definir ops vs membros resolvidos; facto em falta → nenhuma correspondência; SET OPS FAIL FECHADO no membro vazio/null definido (um conjunto de valor soft-FK pendurado nunca corresponde silenciosamente a todos) e null-resolver-safe (sem NPE). - Sim. Revisado inversamente (flowflow de 2 agentes): corrigido 2 erros de avaliador ALTO (NOT IN fail-open no vazio) set; NPE no resolvedor nulo) + deixou cair o membro redundante orgld mirror de acordo com a revisão. Preços números em bruto BigDecimal (correção de corte-3). KamoInitializer adiciona o valor definido de propriedade CHECK.
· kamo-shared-library
MlosBasePriceGrid + NoteRateCélulas de preço mais elevado (Fase- 2 corte 3)
A taxa de preços / células de preço — primeira entidade de catálogo para FK ATH uma versão de taxa-folha (Slice 1) E um produto (Slice 2); a base da montagem do preço §8.1. - MlosBasePriceGrid (mlos base price grid): rateSheetVersionId FK, productId FK, noteRate, lockPeriodDays, basePreço (preço-a-100), basePontos, min/maxLoanAmount, ioFlag. UNIQUE Composto (versão, produto, nota rate, lock period days, io flag) entidade-declarada (io flag NOT NULL → full único, sem DDL em bruto). - NotaRateLadder (ungado @Component): par = célula mais próxima preço- para- 100; mais próximaToPrice( alvo); laços -> taxa de notas mais baixa (doc 02 §8.1 passo 5). 5 NotaRateLadderTest green. CÓDIGO VERIFIADO CORRECÇÃO: Doc 02 §6 diz EmbMoney/EmbPercent, mas o empréstimo bloqueadoPricingSnapshot (a âncora de reprodutibilidade) utiliza RAW BigDecimal — interestRate DECIMAL(9,6), pontos DECIMAL(9,4), nenhum embeddables; EmbPercent(9,4) não pode corresponder a uma taxa de 6-decimal. Então, o preço da grade de imagem os números usam o BigDecimal correspondente ao Empréstimo PricingSnapshot (note rate 9,6 / base price+points 9,4 / montantes do empréstimo 18,2). Sem alteração de código KamoInitializer (catálogo repo pkg registrado corte 1; único índice declarado pela entidade) — apenas re-run.
· InitializerService
Verificação de coerência do produto ARM (fase 2 ponto 2)
ADD CONTRAINT VERIFICAÇÃO ((Amortização tipo = 'ARM') = (arm fixed period meses IS NOT NULL)) — um período fixo é declarado IFF o produto é um ARM (doc 02 §6.6). `= ... NÃO É NULL` forma (não é um enum nu na lista) sobrevive à varredura genérica de verificação enum-whitelist. Catalog repo pkg já registrado em Slice 1.
· kamo-shared-library
MlosProduto + MlosArmIndex camada produto-taxonomia (Fase-2 corte 2)
A coluna do produto do catálogo (doc 02 § 6.3): tudo a jusante (preço de base) grelhas, matrizes de elegibilidade, regras de orientação) FKs to MlosProduct.uid. - MlosProduto (mlos produto): produto por investidor — investidorId FK, productCode, amortização Tipo (REUSES locked URLA AmortizationType), termoMês, armFixedPeriodMonths, armIndexId FK, loanClass, documentaçãoType, conforme, losProgramCode (REUSES locked 17-value LoanProgramCode, §6.4) diretrizVersionPointer (real FK-by-id para futuro MlosGuidelineVersion.uid, nullable), ativo. assertStructurallyValid(): arm fixed period meses set IFF amortization type=ARM. - MlosArmIndex (mlos arm index): índiceNome, margemBps, inicial/periódico/vivos + piso como EmbPercent (doc 02 §6 taxa-via-embPercent), ajusteMonths. - 2 novos enums LoanClass / Documentação Tipo (específico do catálogo; DocumentaçãoType is the §3.5 non-QM 2 repos. Base = BaseUuidEntity; orgId=Long @JsonSerialize(ToString). 5 MlosProductInvariantTest green. KamoInitializer adiciona o mlos product ARM-consistência DB CHECK (catálogo repo pkg já registrado na fatia 1). Adiado: preço **************** + o escritor.
· InitializerService
Reembolsos de catálogo de registro + índice de taxa-folha-versão sem-sobreposição (Fase-2 corte 1)
- @EnableJpaRepositórios += com.kamo.z. shared.mlos.catalog (o novo MlosInvestor/ ******************* ***repos; entidades já cobertas por @EntityScan). - SchemaCleanupRunner: ux rate sheet version active parcial- unique index ON mlos rate sheet version (organização id, investidor id) ONDE status='ACTIVE' E effective til IS NULL — backstops the "one open ACtive version per (org, investidor)" invariante sem sobreposição (doc 02 §6.5; CRDB não tem restrição de exclusão de intervalo).
· kamo-shared-library
Origem do catálogo + versionamento eficaz-datado espinha (Fase-2 corte 1)
A menor fatia carregável do catálogo de Fase 2 (doc 02 §6): a cadeia de proveniência ImgDat -> MlosSourceDocument -> MlosRateSheetVersion e o imutável eficaz-datado versionamento da coluna vertebral com resolução ponto-em-tempo. Substrate- first (sem MLOScatalogService escritor ainda); este é o imutável-catalog-PK fundação DecisionInput irá FK para. Novo pkg com.kamo.z.shared.mlos.catalog: - MlosInvestor (registro por-org; código short único por org), MlosSourceDocument (fino anotação sobre ImgDat; soft-FK img dat id, nunca re-stores bytes, doc 02 §6.4). - MlosRateSheetVersion: versão imutável e eficaz (effective from/til window, substitui self-FK, sequence no, status lifecycle, source document FK, corte time) com um protetor WORM de mutação parcial da camada de aplicativos (@ PostLoad snapshot + @PreUpdate diff): congela Colos de valor/identidade, permite apenas o PROJETO->ACTIVO, ACTIVO->SUPÉRIDO, ACTIVO->REPARTIDO e a escrita-uma vez perto de eficaz até. Nenhum gatilho DB (CRDB não pode finalizar para 24.3). - EffectiveVersionResolver (gated mlos.catalog.enabled): resolução ponto-em-tempo — o version cuja janela [effective from, effective til) CONTINGS priced as of, nunca a "última fileira" junta-se; lança sobreposição de janela eficaz (defesa em profundidade, doc 02 §6.5/§8.1.). - Seis enumerações. RateSheetVersionStatus) + 3 acordos. Base = BaseUuidEntity (doc 02 §6.1); orgId=Long @JsonSerialize(ToString) (código verificado: Organization.id é unique rowid, não é "UUID" do Doc 02. 17 testes verdes (6 resolução ponto-em-tempo + 11 WORM guard). KamoInitializer adiciona o repo do catálogo pkg + o ux rate sheet version active índice parcial único sem sobreposição.
· kamo-shared-library
Sobrecarga da porta de limiar de confiança por doador (configuração do cablagem)
Decisão AditivaGate.avaliar (estágio, confiança, legalmenteRequerHumanos, BigDecimal locatárioThresholdOverride) — o muro per-tenant sintonizado com autonomia resolvido Estágio, andar. A parede legal permanece absoluta eo sobreposição ainda é pisou pelo não-tunable piso de segurança (autonomia nunca pode auto-agir abaixo dele). A sobreposição nula volta para a plataforma padrão; o existente 3-arg assessment() delegados com null, assim o Porta/DecisionSpine behavior + seus testes estão inalterados. Adicionado safetyFloor () Então, um chamador resolve o limite do inquilino contra o mesmo andar. Isso conecta a fundação de configuração de Fase-1 à porta de decisão: um motor pode agora Faça gate.avaliar (estágio, conf, legal, ******************* Estágio, **************** 9 DecisionGateTest (4 new) + 5 DecisionSpinest + 6 MlosActivationServiceTest green.
· InitializerService
Índices únicos parciais + invariantes de manutenção (completação de configuração Phase-1)
EsquemaCleanupRunner DDL para os novos domínios mlos.config (mlos.config já em @EnableJpaRepositórios; Hibernate ddl-auto:update cria as tabelas): - índices únicos parciais de uma actividade (quando é activo=verdadeiro E eficaz para IS NULL) em mlos pricing policy / mlos capital policy / mlos servicing policy (lender profile id) + mlos product enablement (lender profile id, program id) — Hibernate não pode emitir índices ONDE. - Invariantes imutáveis da política de serviço: CHECK scra enforced=true + fdcpa enforced=true (=-CHECKs, sobreviver à varredura enum-whitelist).
· kamo-shared-library
Completar os domínios de configuração de Fase-1 + MlosActivationService (Slice 5)
Completa o inventário de entidades do Doc 04. - Singletons de política (um-ativo-por-per-perfil, eficaz-datado/apenas apêndice): Política de preços (ppeSourcePriority List<String> — tipo de hipotecas diferido para o domínio do fornecedor §5; NO LO-comp), Capital Policy (NO pullThroughPct) + Concentração de Capital Limite de criança, ServicingPolítica (scra/fdcpa imutável invariantes). Índices exclusivos parciais + scra/fdcpa CHECKs ir em KamoInitializer. - ProductEnablement (single-active por programa; canalRestriction @ElementCollection; programId UUID — Program.id é UUID, 'Long' do Doc é um erro verificado por código). - Família de investidores: InvestorConfig + InvestorOverlay + DeliveryRule (reusas ******************* - no dup) + CommitmentRule (reusa CommitmentType). - RiskOverlay (ruleExpression JSONB String). - MlosActivationService @Component (gated mlos.config.enabled): resolveProfile(org Id) + * **************** fase, andar) — gravatas LenderProfile + autonomia config + AutonomyResolver (a fonte per-tenant para a parede de confiança do portão). 23 mlos.config testa verde (MlosActivationService 6 new). Padrão de base da entidade de configuração (manual @Id UUID + @Embedded EmbRecordState; children no EmbRecordState). Plano: **************************** (extendido). Deferido: matriz de ativação tela cheia/módulo/vendor + validaPerfil + SecurityService auto-cura; *.config.history app-only tabelas; predicate avaliadores.
· kamo-shared-library
Motor de aplicação do canal (fase-1 corte 4)
A resolução mais restritiva determinística (doc 04 §8) — Produto x Canal x Investidor -> {ALLOWADO, executionPath, autoridadeModelo, financiamentoComportamento}. - CanalAplicabilidadeRule entity: condiçãoExpressão(JSONB String, Program.rulesetJson precedente)/resultado/ ************************* EmbRecordState. prioridadeproveniente do escopo (não armazenado). O mesmo padrão de base de configuração. - 5 enums: RuleScope(+priority() Investor=0..Tenant=3), Channel, Applicability, **************************** (HYBRID resolveu por empréstimo para estes), FinanciamentoComportamento(5, incl. PORTFOLIO HOLD — DeliveryRule's 4-value unify adied). - CanalAplicabilidadeResolver @Component (ungado, apátrida): vazio/any-DISALLOWED => DESAPARECIDO (leitura mais restrita segura da ambiguidade do § 8.2); caso contrário, AUTORIZADO com attrs do escopo mais forte. Registo da Resolução do Canal. 5 * ************ *** verde (17 mlos.config testes). condiçãoExpressão avaliador predicado + filtro de datação eficaz + pinning AiDecision + MlosActivationService diferido. mlos.config já em KamoInitializer scan — apenas re-run. Plano: ****************************
· kamo-shared-library
AutoridadeConfig (autoridade de subscrição + delegações do Governo) — Fase-1
- AutoridadeConfig (singleton per LenderProfile): subscriçãoAutoridade DELEGADO/NÃO DELEGADO/HYBRID + manualUwPermitido + conjunto de delegação govt {FHA DE,VA SAR LAPP,USDA,NONE} via @ElementCollection (mesa de recolha) mlos autority govt delegation) — gates internal govt UW vs agência referência. helper (HYBRID/resolução do canal diferido). - SubscritaAutoridade + GovtDelegation enums + AuthorityConfigRepository. - Mesmo padrão de base de configuração (manual @Id UUID + @Embedded EmbRecordState); UNIQUE( lender profile id) singleton. Primeira @ElementCollection em mlos.*. 3 AutoridadeConfigTest verde (12 mlos.config testes). mlos.config já em KamoInitializer scan — re-run cria mlos autority config + a tabela de coleção.
· kamo-shared-library
Configuração da autonomia da IA + Resolução do piso de segurança (Fase-1 corte 2)
- AiAutonomyConfig (singleton per LenderProfile; autonomyLevel ****************########################################################################################################################################################################################################################################################## autoExecuteEnabled) + AutonomyStageOverride (por (perfile, stage); reaproveitamento de stageKey Ciclo de vidaStage — não existe pipelineStage enum separado; confiança autoExecuteEnabled). Mesmo padrão de configuração-entidade (manual @Id UUID + @Embedded EmbRecordState); UNIQUE( lender profile id) singleton + UNIQUE( profile, stage key). - AutonomyResolver @Component (ungado, apátrida como DecisionGate): eficaz Limiar = max(stageOverride?:global, safetyFloor) — autonomia sintoniza SOMENTE a parede de confiança e nunca pode baixar o piso da plataforma não-tunable (doc 13 §8.7); autoexecuteEnabled Ativar depois o globo. A fonte per-tenant para a parede de confiança do portão (ligação diferida). 5 AutonomiaResolverTest + 4 LicenciamentoResolverTest green (TDD). Índices declarados pela entidade. mlos.config já em KamoInitializer scan — re-run cria as 2 novas tabelas.
· InitializerService
Registre mlos.config repo pkg (Fase 1 corte 1)
Adicionar com.kamo.z.shared.mlos.config para @EnableJpaRepositórios assim KamoInitializer cria mlos lender profile + mlos licenciando entry. Índices (incl. UNIQUE market id) são declarados pela entidade via @Table — nenhum esquemaCleanupRunner DDL necessário.
· kamo-shared-library
LenderProfile + LicenciamentoFundação de configuração de entrada (Fase- 1 corte 1)
Nova fundação com.kamo.z.shared.mlos.config tenant-config (doc 04 §3): - LenderProfile (root, UNIQUE per MORTGAGE marketId) — soft-FKs bloqueados Organização (Long) + ComércioMarket (UUID) por id. NOTA MarketId é UUID (CommerceMarket.id é gen random uuid; 'Long FK' do Doc 04 é um código verificado erro, mesmo caso que AiDecision.loanFileId). PerfilVersão para repetição. - LicenciamentoEntry (licenciamento por Estado, distinto do membro StewardLicense) — licença Tipo 8-valor enum; stateCode ISO-3166-2; NO estado armazenado, calculado a partir de datas efetivas/expiração via isEffectiveOn() (doc 04 §7.3). - LicenciamentoResolver @Component (gated mlos.config.enabled): isTenantLicensed( perfil, estado, tipo) baseado em data; jurisdição descoberta => false (act blocked). - Padrão de base de configuração: manual @Id UUID + @Embedded EmbRecordState (NOT BaseUuidEntity — suas datas colidiriam; doc 04 §3). 4 LicenciamentoResolverTest green (TDD). Índices declarados pela entidade (Unique market id). Deferido: singletons; MlosActivation Serviço + SegurançaServiço de inicialização auto-cura.
· DaemonService
DaemonService compliance-timer SLA varrimento (timer adopter)
Primeiro adotante dos timers de conformidade da MLOS: um trabalho de Quartzo (a cada 5 min) chama **************** para virar ECOA ARMED-mas-passado-morto (Horário de Ação Adversa) + Relógios Reg X (RegXTimer) para EXPIRED para um mutuário BLOCADO não pode silenciosamente estragar um prazo regulamentar. - ComplianceTimerSweepJob (Quartz Job) + QuartzConfig JobDetail/Trigger; timer service is @Autowired(required=false) + a default-off enable flag, assim o trabalho é seguro para falhas, independentemente da configuração. - @ EnableJpaRepositórios += **************************** - configmap: mlos.compliance.enabled=true (ativa o serviço de compartilhamento de lib) + **************************** {permitido: verdadeiro, cron:'0 */5 * * * ?'}. No-op seguro enquanto as tabelas do temporizador estão vazias (sem temporizadores dos braços do motor ainda).
· kamo-shared-library
**************** para a varredura da DaemonService SLA
Inverte todos os Temporizadores de Action Adversos ARMED-but-past-deadline + RegXTimer para EXPIRED (o sinal de escalonamento durável das superfícies da tela de bordo de conformidade; evento emissão para uma fila de conformidade é um acompanhamento). Devolve a contagem; temporizador vazio As mesas são um seguro. 2 novos testes (12 ComplianceTimerService Teste verde).
· kamo-shared-library
Cessão de licenças de fios na DecisionSpine (Slice 2b-ii)
DecisionSpine.record() agora carimba StewardTask.atribuídoMembro do StewardAssigner quando uma decisão roteada carrega a jurisdição do empréstimo: - DecisãoPedidos ganhos opcionais subjectStateCode (ISO-3166-2) + actType (LicensedActType). Quando ambos presentes E um bean StewardAssigner existe (mlos.legal.enabled), a tarefa roteada é atribuída a um administrador licenciado em Estado para esse ato; caso contrário, abre sem atribuição (um administrador o reivindica). - StewardAssigner injetado como um Docstor OPTIONAL via ObjectProvider, assim um coluna que corre sem mlos.legal. habilitado não é afetado. Retrocompactar 6-arg O construtor retido — a 4a Decisão existenteSpineTest passa inalterada. 29 mlos teste verde (DecisionSpine 5, StewardAssigner 5, LegalRegistry 9, ComplianceTimer 10). Somente código — nenhuma mudança de esquema, nenhuma execução do KamoInitializer.
· kamo-shared-library
Assigner Steward (Decision-spin Slice 2b-ii)
Adiciona o selector de administrador consciente da licença (doc 03 §3.2; doc 01 §6 #9) — escolhe um administrador cujo MLOS StewardLicense é válido hoje para a licença exigida do ato tipo no estado do mutuário, carga-equilibrada a menos aberto Stewardtarefas (tie -> membroId mais baixo); vazio quando nenhum cobre a jurisdição (a chamada aumenta). - StewardAssigner @Component (gated mlos.legal.enabled) sobre StewardLicense + StewardTask repos — lê o registo de portas da MLOS, NÃO são orgs de núcleo bloqueado. Licença (no donotmodify deps; evita o Member->(orgId, userId)->License join). - StewardLicense.isValidOn(data) — fonte única de verdade para licenças baseadas em datas (estatuto calculado, nunca armazenado); **************************** Reafectado a ele. - Está bem. (piscina candidata). 5 StewardAssignerTest green; 9 Legal Registry Teste ainda verde (14 total). Sem esquema mudança (sem execução KamoInitializer). Substrate-first — fiação na DecisionSpine.record() VIA TO HUMAN para carimbar atribuídoMembro é um acompanhamento.
· InitializerService
Registo mlos.compliance repo pkg (Slice 2c-i)
Adicione **************** para @EnableJpaRepositórios assim KamoInitializer cria mlos adverse action timer + mlos regx timer. Índices declarados pela entidade através @Table — nenhuma DDL SchemaCleanupRunner necessária.
· kamo-shared-library
ECOA + Substrato do temporizador Reg X (Spin Slice 2c-i)
Novo pacote **************** (doc 03 §2.8) — propriedade de kamo Análogos do temporizador de conformidade do bloqueio não modificar. TridTimer. Substrato-primeiro: - Temporizador de ação adversa (ECOA/Reg B relógio de 30 dias; aviso INCOMPLETE NOA) + RegXTimer (afirmativo serviço de manutenção; dever **************************** Mutável * * * * * * * * * * * * isolamento dos inquilinos. Índice de violação-sweep (estado, prazo at). - ComplianceTimerStatus enum + 2 acordos de recompra com... - ComplianceTimerService @Component (gated mlos.compliance.enabled): temporizadores de armas, codifica os dias de regulação (30/3/120/5, bloqueados por testes), CONTINUIDADE precisa de um prazo explícito, detecção de violação via Relógio injetado, localizadores de varredura. 10 ComplianceTimerServiceTest green (TDD). Índices declarados pela entidade via @Table. DaemonService SLA-escalation + BLOCKED->STALE adiado (chama os localizadores de varredura). Excluiu esta fatia: ComplianceFind (FK donotmodify. TridTimer), RBPN/FCRA Avisos, Mudança de Circunstância.
· InitializerService
Register mlos.legal repo pkg (Slice 2b)
Adicionar com.kamo.z.shared.mlos.legal ao @EnableJpaRepositórios para KamoInitializer cria mlos licensad act registry / mlos ron eligibilidade / mlos steward licença. Todos os índices são declarados por entidade via @Table — não é necessário SchemaCleanupRunner DDL.
· kamo-shared-library
Substrato de registo legal com conhecimento de Estado (Corte 2b)
Novo pacote legal com.kamo.z.shared.mlos — o produtor de campo verde do DecisãoGate's absolute legal-wall input (doc 03 §3.2). Substrato-primeiro, não adotante ainda: - LicenciadoActRegistry (plataforma ref, por acto+estado) — faz este acto regulamentado legalmente requer um humano licenciado? Unique(act type, state code). - RonEligibility (plataforma ref, por estado) — ronAllowed/ipenRequired + the Comissionamento/signer/property alinhamento regras tokens. - StewardLicense (tenant-scoped, keyed to memberId) — NMLS-by-state licencisure. Coluna de estado armazenada NO: calculada a partir de Data efetiva<=today<=expiratsAt (doc 13 §4.3 correções livro de registros sobrepõe o campo de status em linha doc 03). - LegalRegistry @Component (gated mlos.legal.enabled, default off): fail-closed legalmenteRequerHumano / administradorLicensedFor (date-based) / ronAllowedIn. stateCode é ISO-3166-2 String (pronto internacionalmente; USStateType é código morto). Índices declarados pela entidade via @Table. 9 Registro Jurídico Passagem de teste (TDD). Compõe o DecisionGate enviado por contrato — nenhuma decisão/edições deateward. Assunção de StewardTask com licença diferida para a próxima fatia.
· InitializerService
Register mlos.steward + mlos.orchestration repos; esquema Slice-2a
- KamoInitializerApp @EnableJpaRepositórios: adicione o repositório MLOS acumulado pacotes **************************** mais esign/personal loans assim KamoInitializer possui seu esquema. - SchemaCleanupRunner: genérico @Enumerado whitelist- CHECK varrimento; parcial/ índices únicos + FKs para ******************* **************************** Os índices Slice-2a de decisão são agora entidade-declarado (@Tabela) assim que o bloco Slice-2a é um comentário no-op.
· kamo-shared-library
Decision-spin Slice 2a — OrchestrationState + StewardTask + DecisionSpin BLOCKED-state machine
OrchestrationState (GREEN/BLOCKED/COMPLETE por estágio) + StewardTask (registro de exceção) + enums + DecisionSpine (@ConditionalOnProperty mlos.spine.enabled): compõe o DecisionGate enviado + AiDecision WORM bookger + transational outbox in one tx — VIA TO HUMAN abre uma tarefa + BLOCKs the stage; resolve() escreve uma decisão HUMAN OVERRODE + desbloqueia. Entidades de estado mutáveis (sem @PreUpdate). 4/4 Mockito testa verde.

Seu universo está esperando.
Comece gratuitamente em minutos.Adicione produtos sempre que estiver pronto — sem migração, sem novos logins.
Gratuito para sempre — não é necessário cartão de crédito