Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· kamo-internal
Construa o console mortgage hospede vindo-soon recursos
Substitui os canhotos por painéis reais e apoiados no endpoint + corrige um erro de escrita morto: - Subscrição: Painel de cálculo dos rendimentos (qualificação: DTI/PITIA/reservas/TVL) + pílula AUS) e painel Fraude/4506-C (carril de venda: lugar/lista/cancela/eventos para FRAUD + TAX@ netcabo. pt - Preços: Comparação de cenários (a preços laterais) e melhor execução explicador (base→ajustamentos→caminhada final + razões de escolha/inelegíveis); apagou o chip reverso-LLPA velho (já em AjusteDrawer). - Documentos: roll-up de desobstrução ao vivo (fãs empréstimo-clearability sobre o pipeline, agregados depurados/bloqueados/desactivados); chip (já enviado). - Capital: FIX os mercados de capitais Seguinte rota – sua lista de licenças POST realizada apenas um caminho, então o Loan Sale Desk / lock-lifecycle escreve 404'd. Substituido o conjunto de cordas exatas com padrões RegExp ancorados enumerando o 9 real rotas (verificadas 1:1 vs o controlador), ainda com falhas em qualquer outra coisa. - Boletim: um cartão "Promover como boletim" (docType=BULLETIN) com produto/tipo/parâmetros propostos por IA editáveis, postando no novo relé. Nova cópia UI é simples strings (i18n follow-up); tsc --noEmit clean.
· SecurityService
Relé Gateway para promover um boletim revisto
MlosCatalogController/Client ganho promote-bulletin, espelhando promote-guideline (portão elegível para Deus, servidor de orgs). Baselined promover Bulletin no teste de pontos sem guarda (delegado-guarda, como seus 14 irmãos).
· SecurityService
Persist SecurityService PHI access log
A trilha §164.312(b) ia para a plataforma Slf4jPhiAccessLogWriter: 14 dias a manutenção de uma obrigação de seis anos, e nada que possa ser interrogado. A leads leads e CSV/HMDA exporta estes registros de serviço são os acessos a §164.528 contabilidade é montado de, por isso a trilha tem que sobreviver em uma tabela. Swaps no JpaPhiAccessLogWriter via um bean PhiAccessRecorder pega através ObjectProvider.getIfUnique — nenhum site de chamadas no PhiAccessAuditor muda. A com.kamo.z.shared.phi.audit entrada em @EnableJpaRepositórios envia em o bean não pode ser construído sem o repositório, e declarar um sem o outro é o que CrashLooped login mais cedo hoje.
· kamo-login
Complete um login que parou no segundo fator
SecurityService agora fecha login em um segundo fator (§164.312(d)). Quando um é devido cria a sessão, mas retém a sua chave única, retornando um token de desafio de curta duração em vez disso — uma sessão que ninguém detém um OTK para é inatingível. Este BFF esperava um oneTimeKey incondicionalmente, então um desafio MFA caiu em o branch "nenhuma chave de sessão recebida" e emergiu para o usuário como um 500. Agora. reconhece o desafio e passa mfaRequired/mfaToken para o cliente. /api/login/mfa completa. A partir do OTK, ele reutiliza o login existente route's handoff verbatim - resolver *** de Redis, limpar cookies obsoletos, definir o nova — porque duas implementações de transferência de sessão se desvaneciam e a utilizada menos frequentemente seria o que apodrece. Um código errado retorna 401 com mfaRequired ainda true e o mesmo mfaToken: SecurityService deliberadamente não consome o desafio sobre o fracasso, então o O usuário repete o código ao invés da senha. Forçando uma nova palavra sobre uma É assim que as pessoas acabam por desligar o MFA. Inerte até alguém se inscrever; ninguém o fez.
· VOIPService
Persista na trilha do PHI VOIP para o phi access log
Gravações de chamadas, áudio de correio de voz e transcrições foram auditadas no log fluxo, que mantém 14 dias contra uma obrigação de seis anos §164.528 e não pode ser interrogado por recursos — assim, "quem ouviu esta chamada" permaneceu irresponsável mesmo enquanto estava a ser gravado. Wiring JpaPhiAccessLogWriter como o escritor bean desloca o backback Slf4j que PhiAccessRecorder resolve através ObjectProvider.getIfUnique, então CallRecordingOs sites de chamadas existentes do Auditor são inalterado. Os navios de entrada @EnableJpaRepositórios neste mesmo commit por necessidade: o Feijão precisa PhiAccessLogRepository, e a lista de varredura explícita é a única coisa Isso cria-o. Declarar um sem o outro falha na inicialização do contexto.
· AIService
Persistir a conversa sobre IA PHI access log
Conversas de assistente armazenadas são as leituras menos capazes de pagar 14 dias, fluxo de log inquestionável: o módulo fica fora do limite de conformidade, então os pedidos sobre os mutuários são persistidos indefinidamente e um §164.528 Tem de ser montado exactamente deste rasto seis anos depois. registroDivulgação já falha fechada em uma escrita que não pode fazer, o que só significa algo Uma vez que a escrita cai em algum lugar durável. Declara o Feijão JpaPhiAccessLogWriter e adiciona com.kamo.z.shared.phi.audit para @EnableJpaRepositórios no mesmo commit. A biblioteca deixa o escritor unannotated para que ~40 serviços não todos construí-lo, o que faz o feijão e a entrada de varredura uma única mudança indivisível — o feijão sozinho deixa PhiAccessLogRepository sem definição de feijão e CrashLoops o serviço.
· MediaService
Persist MediaService PHI access log
As leituras das mensagens de chat foram gravadas através do gravador padrão Slf4j, que coloca o percurso §164.312(b) num fluxo de 14 dias de registo contra uma retenção de seis anos obrigação — e deixa "quem leu esta conversa" sem resposta, desde um log O stream não pode ser consultado por membro ou por recurso. A entrada JpaPhiAccessLogWriter bean e com.kamo.z.shared.phi.audit @EnableJpaRepositórios enviam juntos deliberadamente: @ComponentScan("com.kamo") capta o @Configuration, mas a lista de repositórios é explícita, então o bean sem a entrada de digitalização significa PhiAccessLogRepository não tem feijão e o contexto falha ao iniciar. ChatMessageAccessAuditor não precisa de mudança — PhiAccessRecorder resolve seu escritor via ObjectProvider.getIfUnique, então o escritor JPA desloca o retorno Slf4j em cada local de chamada existente.
· SecurityService
Injetar a chave de criptografia secreta TOTP
KAMO MFA SECRET KEY mapeia para kamo.mfa.secret-key pela ligação relaxada de Spring, e é o que o MfaEnrollmentService usa para criptografar segredos TOTP armazenados em repouso. Sem ele o serviço ainda começa — deliberadamente, de modo que a implantação do código e configurar a chave não é uma operação atómica através da plataforma — mas a inscrição lança em vez de escrever um segundo fator secreto no claro. Isso. degrada o recurso, nunca o serviço. Chave gerada on-cluster (32 bytes aleatórios, base64) como o segredo `mfa-enc-key`; o valor existe apenas em Kubernetes e nunca foi impresso ou comprometido. Rodando invalida as inscrições existentes, razão pela qual é o seu próprio segredo em vez de sendo dobrado em um existente.
· DocsService
Persista na trilha de auditoria do PHI deste serviço para o banco de dados
DocsService serve bytes de documentos, então sua trilha é o que uma contabilidade de divulgações em §164.528 é realmente montado a partir de. Estava a escrever para 14 dias. fluxo de log contra uma obrigação de seis anos, sem superfície de consulta. O feijão e o terreno de entrada @EnableJpaRepositórios no mesmo commit deliberadamente. JpaPhiAccessLogWriter não é anotado na biblioteca precisamente assim serviços opt em um de cada vez; declarar o feijão sem a verificação correspondente é o que levou cada login na plataforma para baixo mais cedo hoje, e separando estes dois as edições entre commits reproduziriam essa falha exatamente.
· kamo-shared-library
Trilha de auditoria durável — acesso PHI persistente, apenas apêndice
Transforma §164.312(b) de uma linha de tronco em evidência. A camada de captura foi ligada através de sete serviços por um tempo, mas escreveu através do Slf4jPhiAccessLogWriter — 14 dias de retenção contra uma obrigação de seis anos, e inquestionável. O controle foi arquitetônicamente presente e evidentemente inútil. O PhiAccessLog é somente para anexos: @PreUpdate e @PreRemove reject mutation, porque um trilha de auditoria o aplicativo pode editar não é evidência. A metade da base de dados (REVOKE UPDATE/DELETE) está na migração KamoInitializer. Ele carrega identificadores e nunca conteúdo, e um teste afirma que a entidade não tem campo em forma de conteúdo. Uma trilha que reproduz o que ele auditoria simplesmente mudou o PHI em uma segunda loja — uma que por design nunca é excluído. JpaPhiAccessLogWriter não é deliberadamente anotado como um feijão. Cada serviço component-scans com.kamo, então um estereótipo faria todos ~40 construí-lo, e uma vez que precisa de um repositório cada um teria que adicionar este pacote ao seu próprio explicit @EnableJpaRepositórios lista ou não iniciar. Esse mesmo erro levou Cada login na plataforma para baixo hoje cedo. Um serviço que quer auditoria duradoura declara o feijão e adiciona a varredura; o resto mantém o padrão Slf4j não afetado. SharedLibBeanSafety O teste obriga isto. Os campos são truncados em vez de autorizados a lançar. Num tipo de acesso fechado por falhas e exceção aqui recusa a leitura do usuário, então um URL patológico ou 4KB user-agent perder a linha também negaria acesso legítimo — a camada de auditoria nunca deve ser a coisa que quebra o produto. A tabela já existe no cluster (KamoInitializer fb89b3d), então nada está armado.
· InitializerService
Criar phi access log — a trilha de auditoria durável §164.312(b)
Até agora, o acesso ao PHI foi registrado apenas para um fluxo de log com retenção de 14 dias contra uma obrigação de seis anos, e sem superfície de consulta. Uma contabilidade de divulgações no §164.528 é uma consulta; stdout não pode ser consultado. Os índices são escolhidos para as três perguntas realmente feitas: tudo o que tocou um disco, tudo que um membro da força de trabalho tocou em uma janela, e tudo em Um locatário numa janela [a revisão da atividade §164.308, alínea a), n.o 1, alínea ii), subalínea D)]. REVOGAR ATUALIZAÇÃO/DELETO é a base de dados metade do anexo somente; @ PreUpdate/@ PreRemove on a entidade é a metade da aplicação. Ou só é fraco — a entidade guarda é bypassed by raw SQL, uma subvenção pode ser re-adicionada — mas em conjunto a aplicação em execução não pode reescrever silenciosamente uma linha de auditoria. Melhor esforço: BarataDB permite um proprietário de mesa manter privilégios, então uma falha é registrada em vez de fatal. Tabela verificada presente com todas as 14 colunas e todos os três índices antes do entidade foi empurrada, assim nenhum serviço pode construir contra um mapeamento sem tabela.
· kamo-shared-library
Mint the Universal Loan Identifier (ULI) + store the org LEI
Adiciona o HMDA ULI à exportação LAR. UliMinter constrói a ULI = org LEI(20) + Número do empréstimo + dois dígitos de verificação ISO 7064 MOD 97-10 (Mod97CheckDigit — IBAN algoritmo, transcrito da Reg C 12 CFR 1003 apêndice C e fixado contra a sua Trabalhou exemplo, NÃO a variante MERS Luhn). Nova coluna nullable Organization.lei (KI-applicado) com um caminho de escrita org-patch; HmdaLarService emite o ULI quando o org tem um LEI válido + um número de empréstimo, caso contrário DEGRADES para o número de empréstimo nu assim um ULI mal formada a plataforma PCPB rejeitaria nunca é escrita. Tipo de Identificador de Empréstimos Ganhos UNIVERSAL LOAN IDENTIFIER (derivado: org LEI + LoanFile.loanNumber + check).
· kamo-internal
Definir o org LEI em Informações da Empresa (ativa o HMDA ULI)
O cartão de informação da empresa ganha um campo de identificação da entidade jurídica (20-char, superior- cased), enviado através da organização existente PUT — OrganizationController serializa ele em Organization.lei e OrganizationService aplica-lo. Com um conjunto LEI, HmdaLarService menta o identificador de empréstimo universal do mutuário; sem ele Degrada-se para o número de empréstimo nu, então é isso que torna a ULI ligada por org.
· kamo-internal
Promover uma versão de orientação ingerida do console
Para um documento fonte GUIDELINE, o painel de ingestão mostra um "Promover como cartão de versão diretriz" (selecionar produto + rótulo de revisão). O cartão da folha de taxa está agora escondido para doutores diretriz também. ingestãoApi.promoteGuideline posts to O novo relé.
· SecurityService
Relé Gateway para promover uma diretriz ingerida em uma versão
MlosCatalogController/Client ganho promover-guia, espelhamento promover- elegibilidade: god-elegible gate, organizationId server-stamped via write().
· kamo-register
Auto- login após verificação por e- mail através de uma chave única
Quando /verify-email responde com o aditivo otk + autoLoginHost campos (mintado pelo SecurityService na primeira verificação), deep-link directamente para https://<host>/validate?otk=... — o mesmo consumidor entrada-como usos de fluxo – desembarque do novo membro na casa interna (FirstOrgCta) em vez de os colocar no formulário de login para um retype credencial e um terceiro ***. - PostCompletionScreen (caminho de código + cartão verificado): sessão automática redirecionar com o redirecionamento da página de login mantido como recurso sempre que o OTK está ausente; dispara primeiro o evento verificado por e- mail existente, mais um novo evento de análise de auto-sessão no caminho OTK. - /verificação (caminho e-mail-link): a resposta token-verify é o um que carrega o OTK, então ele redireciona da mesma forma; o registro guia de observação sobre o SSE mantém seu backback de login (o OTK é único use e viva na guia link). - registerApi: verifique chamadas agora digitadas como VerifyEmailResponse.
· kamo-marketing
Fase 3+4 – converter o tráfego que já chega
- changelog ( destino # 2) recebe um bloco de conversão; as carreiras mostram o estado honesto sem aberturas - /subscribe página: intenção de plano de pós-registo terras em algum lugar real (era um 404 na intenção de pagamento) - preços: live-priced FindYourPlanQuiz, meio-página CTA, faixa de segurança, divisão CTA externa/interna, contato empresarial usa ?topic=Venda (sujeito foi deixado em silêncio) - homepage: Recentemente-shipped tira do real changelog, Características / UseCases em frente links, JumpToBar corresponde às seções reais e ofertas Inscreva-se - /parceiros página de projeto-parceiro de programa; sobre recebe um fundador / built-in-the-open seção - SEO: todos os canônicos → www + locale-prefixed 200-serving URLs; por-locale hreflang + x-default no 4 modelos programáticos; locais não traduzidos noindexed; mapa do site loc/alternates fixos (apenas em +es); robots.txt solta o sitemap do JSON + /bloco de cálculo; metadados do blog lê traduções reais (cada publicação anteriormente indexada como «Artigo Não Encontrado») - llms.txt/llms-full.txt: preços reais, URLs marcadas com UTM (referências de IA tornam-se um canal medido) - a página de integração do icewarp aprofundou-se em uma landing page real (a entrada orgânica #2)
· SecurityService
Menta auto- login OTK na primeira verificação de e- mail
Completar a verificação de e- mail do assistente de registo (6 dígitos de código ou link de email) já prova posse de caixa de entrada, mas o novo usuário foi saltou para a página de login para redigir credenciais e resolver um terceiro ***. Reutilizar o enter- como primitivo: no primeiro sucesso verificação, quando o usuário verificado detém uma associação elegível em sua org registro, menta um login equivalente *** via PostAuth***Service e embrulhe-o no mesmo OTK 180 de uso único que a página do kamo-internal /validate já consome. - Verificação por Email Serviço: verificar métodos agora retornar VerificaçãoResultado( userId, firstVerification) Uma conta já verificada (por exemplo, após uma reenviação) nunca poderá re-minta; resoluçãoRootDomain exposto pacote-estático para resolução host. - Não, não, não. Inelegível adesão (registro / equipe PROSPECTs manter o login redirecionamento), domínio não resolvido, configuração SSL de domínio personalizado incompleto, ou erro — o sucesso da verificação em si nunca é afetado. - /verify-email response ganha otk aditivo + campos autoLoginHost; forma inalterada quando a cunhagem é ignorada.
· kamo-marketing
Módulos de conteúdo relacionados + inscrição CTA reorientando em modelos programáticos
Soluções, integrações, alternativas e modelos de glossário eram orgânicos becos sem saída: sem links internos relacionados e "Iniciar livre" CTAs apontando para Privando em vez de se inscrever. - Novo bloco de conteúdo relacionado compartilhado (variantes de cartão/pílula) usando o link i18n assim locale é preservado; cada link relacionado fogos relacionados-clique com o alvo href como item de evento. - Soluções: 3-4 indústrias de irmãos da INDUSTRY CATERGORIES mais até 2 integrações da indústria copiar nome-drops. - Integrações: 3-4 integrações de mesma categoria, recarregadas para pequenas categorias; tira borrão de conversão acima do rodapé CTA. - Alternativas: "Também comparar" fichas para os outros 8 concorrentes, até 2 páginas /soluções com curadoria, CTA final em ângulo de migração (switchFrom key), e uma tira de conversão. - Glossário: termos relacionados preenchidos para 3-4 através de uma mesma categoria ligação glossária. - Todos os CTAs primários sem início agora atingidos **************** com instrumentação cta-start-free / location; /pricing permanece acessível como uma link secundário do View-pricing em cada modelo.
· SecurityService
O login da porta no segundo fator - §164.312(d)
Completa o MFA. O núcleo aterrou na biblioteca de kamo-shared; este é o fio que gira configuração armazenada em um portão real. O portão é pequeno porque o login já tinha a forma certa: cria o *** sessão e entregá-lo ao cliente APENAS como uma chave única no corpo de resposta — não cookie está definido no login. Então o mecanismo inteiro é reter o OTK até que o o segundo fator está comprovado. Uma sessão para a qual ninguém tem um OTK é inacessível, que significa que a própria criação da sessão não precisava de nenhuma cirurgia. MfaChallengeService mantém o ***Id sob um token de 5 minutos opaco, de uso único. O cliente nunca recebe o ID da sessão, e o token é inútil sem Código. Curto de propósito: um estado meio-autenticado sobrevive a um compromisso de senha. POST /api/security/mfa/desafio completa o login, lançando o OTK para que o O cliente retoma exactamente o fluxo que teria tido sem o MFA. Um código errado Não liberta nada e — deliberadamente — NÃO queima o desafio, porque forçar um usuário de volta através da senha sobre um erro de digitação é como MFA é desligado. A O próprio bloqueio da matrícula conta essas falhas. Um sucesso consome o desafio assim Não pode ser reproduzido. Códigos de recuperação completá-lo também, e nunca são tentados como um TOTP. Os endpoints de inscrição (/inscrição, /confirmação, /status) requerem uma sessão — se inscrever fator é uma ação autenticada por conta própria. /desafio deliberadamente faz não, porque o seu chamador é mid-login por definição. INERT HOJE: o portão só dispara em tem confirmadoFactor, e ninguém está matriculado, então o caminho de login existente é bytes idênticos. Este é o ponto — isto pode ser utilizado antes que qualquer cliente o apoie. A catraca do endpoint apanhou os meus próprios três manipuladores de matrícula como desprotegidos. Eles são. guardada, através de um usuárioIdFromSession helper a varredura de um método profundo não pode seguir, Assim, a solução era ensinar GUARD que ajudante em vez de baseá-los. Eu também. documentou a limitação inversa o mesmo exercício exposto: completo Desafio limpa a digitalização apenas porque acontece tocar no kSessionService.
· kamo-marketing
Fase 0+1 — instrumento do funil real, desbloquear a primeira pintura
- dados avançados-* adereços através de MagneticButton/RippleButton (eventos nunca chegaram ao DOM) - instrumento SharedNavigation, Hero, PreviewBanner, seção CTAs; ?ref= em cada link de registro - Apaga o morto. + 16 outros componentes órfãos - homepage: no preloader gate, seções SSR'd, 16→10 seções, live catalog prices in Prices - inscrição honesta: um campo de e-mail deep-linking registro com prefill; termos reais / links de privacidade - kill 10MB favicon.svg + logo.svg, drop react-world-flags (3.7MB) para bandeiras emoji, drop three.js deps - geração estática (sem dinâmica de força), cabeçalhos de cache longo para /img /logos /favicon - analytics: data-performance vitals on, DNT drop removed; chat widget prezyOnload; pré-conexões - heroi: local bgs render imediatamente (tema swap não-bloqueamento), Assista Demo → /demo, Fale conosco CTA, estatísticas honestas
· kamo-shared-library
TOTP segundo fator — §164.312, alínea d)
A avaliação da conformidade chamou a ausência de qualquer segundo fator desqualificante por si só, e nos termos da regra de segurança de 2025 NRM MFA deixa de ser endereçado em Todos. O utilizador único+senha foi o único caminho de autenticação interactivo na plataforma. O TOTP é verificado contra os vetores de ensaio RFC 6238 do apêndice B, em vez de contra valoriza essa implementação produzida. Essa distinção é todo o jogo: a home-grown TOTP que concorda apenas consigo mesmo autentica Google de ninguém Autenticador, e as superfícies de falha na implantação com cada usuário bloqueado para fora. Escrevendo esses testes imediatamente pegou que eu tinha passado Unix segundos onde o HMAC quer um contador — off por um fator de trinta — assim gera. Divisão e ninguém tem de se lembrar. Propriedades que separam MFA real da aparência dele, cada um preso por um ensaio: - Os códigos são de uso único. Um TOTP permanece válido durante todo o seu passo de 30 segundos, portanto sem o últimoUsedTimeStep um código interceptado ou ombro-surfed funciona novamente dentro da sua própria janela. Um passo anterior ainda dentro da tolerância é recusado também, uma vez que um posterior foi aceito. - As matrículas não confirmadas não contam. Começar a matrícula e abandoná-la Antes de provar a posse não deve satisfazer uma exigência MFA. - Lockout é real: um código correto é recusado enquanto bloqueado, caso contrário, o lockout é decorativo. - StartInrollment se recusa a substituir um fator confirmado. Silenciosamente sobrescrevê-lo Deixaria qualquer um que chegasse ao ponto final trocar o autenticador da vítima por Os seus. - O segredo é criptografado em repouso e retornado exatamente uma vez; códigos de recuperação são Hashed e utilização única. Nem é recuperável pela equipe, então um dispositivo perdido significa re-inscrição — a correta troca por uma credencial que ignora a senha. - A verificação compara-se em tempo constante. String.equals retorna no primeiro dígito diferente, que vaza quantos dígitos principais estavam certos e colapsa um 10^6 espaço em aproximadamente 60 palpites. Códigos de recuperação são SHA-256 em vez de bcrypt deliberadamente: 80 bits de entropia gerada por máquina não tem dicionário para esticar, e um hash lento apenas compraria uma negação de serviço no caminho de login. Mesas já existem no cluster (KamoInitializer c65a233), então nada está armado Por este empurrão. Inscrição e objetivos de desafio são o próximo passo; nada chama Isto ainda.
· kamo-login
Adicionar análise analítica + ?registrado=1 aviso de boas-vindas
- Montagem analítica Componente do cliente de análise no layout root: next/script loader for analytics.kamocrm.com escopo através de domínios de dados para login.kamocrm.com somente (o local é marcado em branco; domínios de org de inquilino deve nunca ser rastreado), com window.analytics guardada?.track digitação. - Rastreie um evento de login-sucesso antes do pós-login redirecionar incêndios. - Lidar ?registrado=1 do site de registro com um aviso de sucesso ("Sua conta foi criada. Iniciar sessão para continuar."), Preencher o campo de e-mail de ?email= — o mesmo padrão que email verified/linked.
· InitializerService
Criar as tabelas de segundo fator
Backs UserMfaEnrollment and MfaRecoveryCode in kamo-shared-library — §164.312(d) Autenticação da pessoa ou entidade, a lacuna da avaliação da conformidade designada Desqualificação por si só. Ambas as tabelas verificadas presentes no cluster com a forma esperada antes do entidades foram empurradas, assim nenhum serviço pode construir contra um mapeamento cuja tabela faz não existe. Três detalhes que valem a pena não perder para uma simplificação posterior: - SECRET CIPHERTEXT contém texto cifrado. O serviço recusa-se a escrever uma inscrição em tudo quando nenhuma chave está configurada, em vez de degradar o texto simples. - LAST USOUSE TIME STEP é o que faz um código de uso único. Um TOTP é válido para a sua passo inteiro de 30 segundos, então sem ele um código interceptado replays dentro de seu próprio Janela. - Códigos de recuperação obter uma linha cada vez mais do que uma lista serializada, então redefinir um é uma atualização direcionada em vez de uma leitura-modify-write sobre o conjunto – que em concorrência é exatamente como um código de "uso único" é usado duas vezes.
· VOIPService
Requer VER CALL LOGS para reprodução de chamadas em orgs de manuseio de PHI
Gravação e reprodução de correio de voz verificado arrendamento e nada mais: qualquer membro de a própria org poderia puxar qualquer chamada nele, transcrição incluída, em extensões que não eram deles. Requerer VER CALL LOGS sem rodeios não era uma opção — um direito pode existem na enum e ser concedido a ninguém, por isso liga-lo para todos leva o softphone longe dos membros que o usam hoje. Por conseguinte, a execução é abrangida pelo limite de conformidade que o torna necessário. Para uma org com alçasPhi set, gravação de áudio, faixas per-leg, voicemail áudio e a transcrição dentro dos metadados de gravação requer o direito; a recusa é 403 e aterra na pista de auditoria do PHI através dos gravadores de vias negadas existentes, então a sondagem é visível. Para cada outra org — todos eles hoje — nada muda, o que É o que os casos de... Consequência conhecida: a sessão ?st= stream-token carrega apenas (orgId, memberId), então sob um inquilino PHI o caminho audio-tag falha fechado até que o token carrega o subsídio. Gravado num teste em vez de deixado para ser descoberto.
· kamo-internal
Desativação automática após inatividade (HIPAA 164.312(a)(2)iii)
Uma sessão deixada aberta em uma estação de trabalho não vigiada permaneceu disponível indefinidamente. Isto termina após 15 minutos sem interação, com um aviso de 60 segundos Então, ninguém é dispensado no meio da tarefa. As regras de tempo vivem em app/lib/idleTimeout.ts como um controlador puro (unidade testado com temporizadores falsos); o componente é apenas uma camada de entrada. Três decisões vale a pena saber sobre: - Apenas os eventos ponteiro, chave, roda, rolagem, toque e visibilidade contam como presença. Quadros, sondagens e temporizadores de Websocket não — ecrãs internos kamo refrescar-se constantemente, e tratar que como um humano na mesa seria tornar o controle decorativo. - A presença é medida em toda a origem, porque o sujeito do controle é uma máquina sem assistência, não uma aba sem assistência. O trabalho numa página mantém a sua irmãos vivos; quando cada aba fica quieto eles expiram juntos, então não o arranjo das abas deixa uma sessão utilizável em uma tela abandonada. - O fim de uma sessão é anunciado nas páginas. O *** id vive em cada sessão de tabStorage sobre uma sessão de Redis compartilhada, então um irmão que nunca é told continua a mostrar um espaço de trabalho autenticado numa sessão que já não existe. Tanto o logoff automático quanto a página /logout comum agora transmitem. Terminação passa pela página existente / logout — SecurityService logout, Remoção da chave Redis, limpeza de cookies, encaminhamento para o kamo-login — porque limpeza o estado do cliente sozinho deixa a sessão do servidor viva e não é um logoff. Cópia enviada antes disso no dicionário kamo-tradução (c39dfb9).
· DocsService
Endpoints de conteúdo WOPI de auditoria e fechar as últimas lacunas de serviço de byte
O WOPI serve documentos inteiros aos Docs e não gravou nada. GET /wopi/files/{id}/contents é a mesma divulgação que /download, retransmitiu o da mesma forma através do APIService, sem nenhuma trilha em tudo — abrindo um documento em O editor era indetectável. A identidade vem do token de acesso WOPI, não de uma sessão ***: DocumentController menta-o com org do membro de abertura e IDs de membro e Os médicos devolvem-no em todas as chamadas, por isso essas alegações são a única identidade esses endpoints têm, e o um checkFileInfo já autoriza contra. O auditor leva-os diretamente em vez de resolver um membro uma segunda maneira que poderia discordar do símbolo que o pedido foi autorizado por. Um símbolo que não pode ser lido registros contra o sentinela não resolvido-org em vez de a ser abandonado. PutFile registra como View, não DOWNLOAD: um save envia bytes em vez de fora, Chamando-lhe uma revelação, contaria duas vezes o GetFile que abriu o sessão, e VIEY falha em abrir para que um dissipador de auditoria doente não possa destruir por salvar Trabalho. CheckFileInfo e as operações de bloqueio permanecem sem registro — sem conteúdo, e Docs chama ambos repetidamente através de uma sessão, que iria enterrar a linha isso significa que os bytes se moveram. A varredura para os caminhos remanescentes dos byte-serving encontrou mais dois: - /api/docs/binders/{id}/render funde cada documento em um PDF. É volume-download em uma embalagem diferente e não registrou nada; agora um evento por documento incorporado, separadores e páginas geradas excluídas. Escreveu apenas uma fila do ImgLogDownload. Isso. é um registro de domínio de imagem lido pelo painel de download-história, não o trilha transversal – assim, a contabilidade das divulgações mostrou fluxos, exporta e template PDFs enquanto omite o byte mais usado do serviço caminho. Ambos os registros são agora escritos; eles respondem perguntas diferentes. Nenhuma entidade, @Column ou mudança de biblioteca compartilhada.
· kamo-internal
Promover uma matriz de elegibilidade ingerida do console
Para um documento fonte ELEGIBILITY MATRIX, o painel de ingestão mostra agora um Cartão "Promover como matriz de elegibilidade": escolha o produto, tipo limite (MAX LTV/CLTV/DTI), ocupação e finalidade, e cada linha FICO→limit aprovada torna-se uma célula de elegibilidade — a porta que permite o preço do produto. A taxa-folha publicar cartão está agora oculto para LLPA e documentos de elegibilidade (cada tem o seu próprio caminho de promoção). ingestãoApi.promotePontos de elegibilidade para o novo relé.
· SecurityService
Relé Gateway para promover uma matriz de elegibilidade ingerida
************* *** Ganhar promoção-eligibilidade, espelhamento promoção-ajustes: portão de Deus-elegível, organização write(), a jusante 4xx retransmitido verbatim.
· kamo-internal
Criação de UI — lista, editor de itens de linha, gerenciamento de links de compartilhamento
Completa o sistema de aspas/estimativas: a equipa pode agora construir uma cotação, priçá-la, menta um link de compartilhamento e e-mail, tudo do pipeline. app/lib/quotesApi.ts cliente digitado para a superfície do SecurityService **************************** proxy, espelha o POS um (X-***-Token passethrough) PipelineQuotesTab list + status filter, com fio como um sub-tab RETAIL rota de detalhe app/commerce/quotes/[uid] CitaçãoEditor PipelineRecordLayout com abas de detalhes/compartilhamento/atividade QuoteLineItemEditor reusable line-item grid QuoteShareLinkPanel ment, copy, email, revogue, view contages QuoteLineItemEditor é deliberadamente seu próprio componente. O oleoduto já carrega cinco editores de linha laminados à mão (ordens/novos, OrderEditDialog, o grade de ordem de assinatura, a tabela de compras, trabalho-ordem de trabalho/partes) sem nada compartilhado entre eles; novo trabalho deve construir sobre isso em vez de adicionar um sexto. Os totais do editor são um PREVISÃO LOCAL e são rotulados como tal enquanto sujos. Eles Mirror QuoteTotals exatamente — descontos linha primeiro, em seguida, o nível de desconto cotação, em seguida, imposto e transporte — de modo que a pré-visualização nunca discorda do documento salvo, e a resposta do servidor substitui-os em cada gravação. Nada aqui pode definir um total. Imposto permanece honesto na UI também: modo ENGINE renderiza "Não configurado" em vez de um Figura fabricada, correspondente ao que a API relata. Um link de compartilhamento recentemente cunhado é mostrado uma vez com um aviso de copy-now, porque só SHA-256 é persistente e o URL genuinamente não pode ser recuperado. A lista pode mostrar um prefixo e nada mais. Direitos-abertos em todo: MANAGEM QUOTES para criar/editar, SEND QUOTES para cunhar ou revogar links. Aspas de terminal Tranca o editor e... oferecer uma revisão em vez disso. Fio ao vivo para a API desde o início — sem gerar acessórios Mock, ao contrário de vários tabulações de gasodutos de irmãos. Se as tabelas de citações ainda não existem, as superfícies de erro honestamente em vez de ser mascarado por filas de placeholder.

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