Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· kamo-internal
Rebuild the slideout as one continuous surface
Member rows now form the department body directly — no card-on-card nesting — and departments run full-bleed with sticky bands, reclaiming ~30px of row width and cutting the chrome before the first member from 228px to ~170px. Layout - Delete the card-in-card stack: rows are flat, hairline-separated, full width. - Sticky department band (ink on an 8% primary tint, never white-on-primary) carrying the disclosure chevron, a live presence meter, an online/total fraction and a Select toggle. Drops the identical per-department Group icon. - One background instead of three stacked gradients; one scroll-edge cue. - Status is carried by a dot on the avatar plus a word only when it adds information, replacing five per-row encodings of the same value. Behavior - Row click opens the 1:1 chat. It previously did nothing: MemberList never passed onClick, so a fully-styled clickable row was inert. - Restore the All/Online/Offline filter, which only existed inside MemberList's header — a branch the live panel never rendered (showHeader={false}), leaving statusFilter pinned to 'all'. Lifted into NavTopPanel beside the search field. - Multi-select gains real affordances: a Select toggle per band, ctrl/cmd-click, and touch long-press; a selection bar rises from the first selection. - One hoisted MeetingDialog instead of one mounted per row, and ownMemberId is threaded down instead of every row fetching /api/user-info. Motion - MotionConfig reducedMotion="user", plus prefers-reduced-motion guards on the CSS keyframes it cannot reach. - Staggered section entrance, framer height-collapse with a rotating chevron, layout-spring row reflow, odometer counts, unread pop, directional tab slides. Accessibility - Real disclosure semantics, ul/li rows, one stretched row button with sibling (not nested) actions, focus trap with focus restore, arrow-key navigation, a polite live region for selection, and >=24px targets. - The panel openers in NavTop were non-focusable Boxes; they are buttons now. - Chats rows were click-only divs with no keyboard path; they are list items with real buttons and accessible names. Theming - New --on-primary token so white text on a light tenant primary is fixable. - Shared availability palette ends the NavTop/MemberItem hue drift, and the hairlines stop referencing --color-primary-rgb, a variable never defined. - Relative timestamps go through Intl on the app locale instead of emitting hardcoded English, and last-active labels tick again via one shared 30s clock.
· SecurityService
Detecção e alerta sobre a pista de auditoria de acesso aos registos
phi access log vem acumulando evidências que ninguém olha. Isso satisfaz §164.312, alínea b) — existe a trilha — e não satisfaz nada sobre §164.308(a)(1)(ii)(D), que solicita revisão, ou §164.400-414, cujo relógio Não posso começar até alguém reparar. Isto é o que nota. Cinco detectores na hora fechada, por actor: BULK EXPORT 250 registos distintos exportados/download/divulgados MASS READ 200 registros distintos lidos REPETIDOS DENIAIS 10 tentativas recusadas (eventos — nome de recusa sem registo) OFF HOURS ACCESS 20 registos distintos fora da semana própria da RTEANT PLATFORM STAFF ACCESS 1 — uma entidade coberta é informada independentemente da justificação Contagens são registros DISTINCT, não eventos: PhiAccessAuditor emite uma linha LIST por linha da grade, então um membro recarregando a mesma página quarenta vezes é 2.000 eventos e 50 indivíduos — e "quantos indivíduos" é o número de uma violação A avaliação é feita. Razão para cada padrão está em PhiDetectionSettings; todos eles são configmap-tunable, porque um detector que dispara constantemente Fica mudo e um detector mudo ainda lê como cobertura. O tempo de descanso é julgado na zona do inquilino através do seu OFF HOURS ACCESS existente regra (horas úteis que a tela de segurança já coleta) caindo de volta para Organização. fuso horário. overcure at é UTC, então uma página de verificação ancorada a UTC Um inquilino de Sydney todas as manhãs trabalhando e nunca bipe um New York um. A entrega reutiliza o que existe: EmailTemplateServiceClient -> Serviço de Email /api/email/templates/enviar com a nova chave canônica PHI ACCESS ALERT, para o aborda o org já registrado em org suspicious detection rules . notification emails. Um inquilino que configurou nenhum recebe o registro de revisão e nada mais — enviar um endereço adivinho revelaria que um nome O membro da força de trabalho está sob suspeita. Cada achado é registrado em um dedicado Registrador de PHI-DETECÇÃO; apenas a notificação é estrangulada (6h por detector/tenente/ ator, no Redis as regras de login-anomalia já usam). As alertas transportam identificadores e contagens, nunca um registro. Duas opções estruturais deliberadas: - Os agregados são executados através de um EntityManager, não Spring Data @Query. Primavera Os dados validam uma consulta declarada criando- a no repositório bootstrap, então a erro no início do contexto – e um SecurityService que não irá começar leva cada login com ele, como em 2026-08-03. Aqui o pior caso é um Vasculhem os registos e as cópias na próxima hora. Também remove este pacote do @EnableJpaRepositórios pergunta inteiramente: nenhum bean repositório, nada para Esquece. PhiDetectionQueryTest verifica cada caminho de propriedade reflexivamente desde nenhum teste neste serviço pode iniciar um contexto. - Todas as consultas são restritas pelo ID da organização primeiro. somente phi access log índice utilizável é (ORGANIZATION ID, OCCURRED AT); filtrando no tempo sozinho Uma mesa só de apêndices que só cresce. Scheduling: isto junta- se ao taskScheduler (4 threads, sched-), que sete varre Já partilha. NÃO tocar na traduçãoExecutor — o 3-thread/500-queue @Async pool observado saturado — e envia para nenhum executor em tudo. Por hora. cinco agregados agrupados por lote de locatário, sem E/S de rede no interior da verificação, e uma trava de reentrância para que uma execução lenta salte o tick seguinte em vez de empilhar atrás dele e a fome da piscina que partilha. Nenhuma entidade ou coluna foi adicionada ou alterada.
· EmailService
Variáveis de antevisão para PHI ACCESS ALERT
Sem uma amostraVariables arm the admin Email Templates preview renderiza a cada placeholder em branco, então quem é solicitado a aprovar a formulação de uma garantia alerta vê uma mesa vazia. Identificadores e contagens de modelos de amostra a mesma forma que o alerta real carrega, porque o alerta real nunca carrega um Gravar.
· kamo-shared-library
Modelo canónico PHI ACCESS ALERT
SegurançaA revisão horária do phi access log precisa de algum lugar para enviar O que encontra. Em vez de inventar um canal que usa o existente translacional-email rail, o que significa uma chave canônica: ausente de CANONICAL KEYS um modelo nunca pode ser semeado, nunca auto-cura, e cada enviar retorna um 404 permanente — um controle de alerta que parece cobertura e não dá nada. O modelo carrega identificadores, contagens e uma janela de tempo apenas. Detecção artefacto que reproduz o que detectou mudou o PHI para uma caixa de entrada sem política de retenção, por isso não há deliberadamente Gravar. PhiAccessAlertTemplateTest pinos que, e prende os dois falha silenciosa modos: um placeholder nothing supports renderiza como uma string vazia com apenas uma AVISO, eo renderizador não escapa HTML, por isso qualquer coisa atingindo o corpo Usa o gémeo fugitivo. EmailService deve reinstalar com este compartilhamento de lib antes de SecurityService começa envio; até lá o envio é capturado e o achado permanece somente review-log.
· kamo-internal
Espelho da máscara mínima necessária no cliente (§164.502(b))
Segurança Serviço agora retém respostas personalizadas de um chamador que não é o o cessionário do lead (e, em um inquilino do handlesPhi, mesmo de um titular da direita 161). Essa máscara é a execução; isto não é. Dois caminhos ainda o ignoram: - LeadRealtime Publisher coloca um LeadDTO desmascarado security.leades.rt {orgId} — uma carga distribuída a cada assinante do org, sem possibilidade de projeção por receptor. Até que esse evento carregue identificadores apenas e o cliente refetches, app/lib/leads/leadFieldMask.ts é a única coisa entre as respostas de admissão de um colega e cada painel de chumbo aberto no inquilino. LeadViewClient agora executa as cargas de entrada em tempo real através dele antes que qualquer um chegue ao estado. - Renderização: um formulário retido e um nunca-cheio-em-um chegar olhando idêntica, por isso a decisão tem de ser recomputada, não inferida. O formulário personalizado pane deixa cair a sua disponibilidade Editar quando as respostas são restritas — salvando um espaço em branco form iria colocar {} sobre as respostas reais, que o servidor agora 403s de qualquer maneira. Organization.handlesPhi é entregue na coluna existente -> DTO -> OrgContext caminho (a entidade org já o serializa; o esquema do zod e Organization. fromJSON allow-list foram os links faltando), não um segundo canal. Nenhuma nova cópia visível pelo utilizador: o rótulo explicativo "restrito" necessita de uma chave na tradução-dictionary repo e é deliberadamente deixado para essa mudança.
· SecurityService
Mascaramento mínimo necessário das respostas à forma personalizada de chumbo (§164.502(b))
A única máscara de campo da plataforma era... por LeadController.getLeadById a um chamador que não é nem deus nem o designado e Falta View LEAD CONTACT INFO OTHERS (161). Abrange e-mail, telefones, data de nascimento e as partes de rua dos endereços de correio/propriedade — e nada mais. customFormData montou diretamente através dele, que é o único lugar na plataforma um O inquilino da saúde vai realmente colocar questões de ingestão e sintomas. LeadFieldMask agora é dono da decisão e da projeção: - qualquer org: respostas personalizadas passeio com a máscara de contato. Se não pode ver O e-mail do líder pode não ver o que respondeu. - manipula inquilinosPhi: as respostas são retidos de qualquer um o líder não é atribuído até mesmo com a direita 161. Este direito tem o seu próprio nome como objecto de contacto. informação; uma resposta sintoma não é informação de contato. O título do formulário vai Também — "Diabetes Intake Questionnaire" revela a condição por si só. A entrada de formulário sobrevive mascarando carregando apenas seu ID, assim que o UI pode dizer "restrito" em vez de fazer um questionário em branco. Uma org que não irá carregar é tratado como tratamento PHI, correspondência PhiTenantStatus's UNKNOWN-negações postura. PUT /leaders/{id} ganha a porta de escrita simétrica. O editor de formulários coloca o todo campoValores mapa, então sem ele um membro mostrou um questionário em branco que apertou Salvar teria substituído as respostas reais por {} — a máscara de leitura teria tornar-se um delete silencioso. Utilitário estático, sem estereótipo e sem repositório: a decisão é pura e o O chamador já detém a org.
· kamo-internal
Visualizador de auditoria de acesso ao PHI — revisão de org e contabilidade por registo
O rasto estava a ser escrito e nada o conseguia ler. Esta é a metade da tela: uma revisão de acesso em toda a org em Configurações → Segurança, e um "quem acedeu a isso diálogo de registro" aberto a partir do próprio lead, que é a forma de um §164.528 O pedido contabilístico chega efectivamente — uma pessoa que pergunte sobre o seu processo, não alguém com tempo para filtrar um log global. Três coisas aqui não são cosméticas. Timestamps são absolutos e sempre nomear a zona em que foram renderizados, com um mudar para UTC com um clique. Esta evidência é lida meses depois por alguém que foi não presente; um relógio de parede nu lido de outra zona silenciosamente desloca um acesso por horas, que é a diferença entre "durante o turno" e "às 3h". Tempos relativos são excluídos — eles se desviam toda vez que a página é aberta. As tentativas negadas e o acesso do pessoal da plataforma estão marcados na linha (tinta, regra da esquerda, ícone principal) em vez de esquerda em uma coluna o olho salta, porque uma conformidade O oficial verifica centenas de filas para aquele que não devia estar lá. Comum leituras são deliberadamente simples: decoração tudo é o mesmo que decoração Nada. Negado supera plataforma-pessoal quando uma linha é ambos — Kamo staff sendo recusada é a linha mais interessante que a tela pode mostrar. Exportar é fechado em EXPORT ACCESS LOGS separadamente da vista direita, e um 503 do montante é superfície como "nada foi revelado" em vez de suavizado num erro genérico. A EXPORT é um tipo de auditoria encerrado por falhas: a recusa significa a divulgação não pôde ser registrada, o que é um resultado correto o oficial precisa para ver. Construção de consultas, formatação do timestamp e classificação de linha ao vivo em app/lib assim vitest pode alcançá-los; os componentes são montagem. Um 403 nunca cai para uma grade vazia – "ninguém jamais tocou neste registro" é o erro mais perigoso responder esta tela pode dar.
· kamo-internal
Mudar o nome da página de membro para Perfil, encurtar as etiquetas das páginas, adicionar ícones das páginas
O cabeçalho da página de configuração dos membros torna-se "Meu perfil {memberLabel}" (ou "{memberLabel} Profile" para outro membro) e o link de navegação se torna O meu perfil. As etiquetas das páginas encurtam — Caixa(s) de correio, Telefone, Áudio e Vídeo, Permissões, Atividade — enquanto o telefone e os papéis ajudamDicas cabeçalhos descritivos através de novos ************************* Chaves. Cada página agora carrega um ícone na barra de páginas; tab estão inalterados, por isso as ligações profundas continuam a funcionar.
· kamo-internal
Tone slider — caiado a cor completa para escurecer
Um fundo por membroTone ui-preferência (0 branco / 50 cor completa / 100 preto) renderizado como uma lavagem acima do scrim legibilidade em ambos os console camada de apresentação de slides e estágio WYSIWYG do editor. Slider vive no palco cromo de mídia com visualização de arrastar ao vivo, centro snap, e persisti-on-release.
· kamo-internal
As cartas do lançador e o herói usam a cor da marca do org em vez de acentos por módulo
As cartas de opção do home launchpad, drag overlay, e o herói de primeiro-org agora tirar o seu acento de var(--color-primário) (o conjunto dinâmico da org cor do tema) em vez do mapa da família fixa multi-color --accent-*.
· kamo-internal
Modo de deus de vidro de ruptura – prompt razão, contagem regressiva, indicador de pé
O modo de Deus não tinha nenhuma UI em kamo-internal: um booleano localStorage que um monte efeito espelhado em ***, reafirmado em cada nova aba para sempre. Que fez o navegador a autoridade sobre se a equipe da plataforma foi elevada, e fez elevação algo em que você poderia estar sem nunca decidir ser. - GodModeJusticationDialog pede pela razão ANTES de elevar. Uma razão coletado depois é uma razão escrita para caber o que já foi feito. A cópia afirma claramente o que o operador está prestes a ver e que seu nome vai nele. - GodModeIndicator é uma barra de fundo de largura total mais um quadro vermelho ao redor de todo viewport, com uma contagem regressiva ao vivo e "End now". Alguém que se esquece que está em modo deus é o cenário exato que o controle existe para prevenir, por isso não é distintivo sutil — mas é ponto-eventos: ninguém fora do bar e senta-se fora fluxo de layout, para que ele nunca intercepta um clique ou refluxos de uma tela. - Ambos são montados uma vez no layout root, ao lado de AutomaticLogoff, assim o indicador está presente onde o operador termina em vez de nas telas Alguém se lembrou. Não cede nada, a menos que a sessão seja divinamente eLEGÍVEL. - O servidor é dono do estado. app/lib/godMode possui um único armazém coalesced; cliente só lê a validade SecurityService carimbado e nunca pode estender SetIsGodMode se foi — elevar toma uma justificação, por isso não pode ser um Setter. - A pesquisa de status duplica como o limpo durável: GET /session/God-mode é onde SecurityService escreve uma elevação decorrido fora de Redis para os serviços que leia diretamente a sessão. UsePlatformAdminGuard agora espera pelo status de deus para sessões elegíveis para Deus. O acesso costumava ser legível síncrono a partir do localStorage; sem a espera operador com uma janela aberta seria reposta para /settings no gap. As cordas estão dentro. (empurrado primeiro, por ordem de clone da construção). npx vitest run: 329 passaram (32 arquivos), 17 deles novos. npx tsc -- noEmit: limpo.
· SecurityService
Leia o PHI access trail – §164.528 contabilidade e revisão de atividade
A trilha foi escrita por um tempo e nada poderia lê-lo, que deixou dois obrigações não cumpridas: uma contabilidade das divulgações para o registro de uma pessoa (§164.528) e a revisão periódica da actividade do sistema de informação [§164.308(a)(1)(ii)(D)]. Ambas são perguntas. Isso adiciona a superfície da consulta. Autorização é o recurso, não a grade. A organização é retirada do sessão e de nenhum outro lugar — não há deliberadamente nenhum parâmetro orgId em qualquer manipulador, e PhiAuditQueryService é um único ponto de estrangulamento que adiciona o inquilino predicar antes mesmo de consultar o filtro. Quatro métodos de consulta de irmãos foram quatro oportunidades de o esquecer. Scoping é uma cláusula WHE em vez de um pós- filtro, porque filtrar uma página devolvida deixaria totalElementos contando linhas, o chamador pode não ver. O lado lido obtém sua própria interface de repositório. O repositório PhiAccessLog compartilhado os localizadores são deliberadamente inter-atendidores — corretos para uma ferramenta de plataforma, uma divulgação se entregue a uma tela do cliente — então a tela recebe uma interface cuja única entrada ponto toma uma especificação. Ele vive sob com.kamo. Serviço de Segurança, que a entrada de @EnableJpaRepositórios já cobre, então nenhuma alteração de varredura é necessária e ninguém pode ser esquecido. Direitos são VEZ ACCESS LOGS (29) e EXPORT ACCESS LOGS (32) — o par que já fecha o log de autenticação, então qualquer um que administra segurança hoje pode usar isto no primeiro dia. Um novo ID direito teria enviado o ecrã morto: ele precisa de um KamoInitializer executar e uma subvenção antes de qualquer membro detém um. A leitura da trilha é em si gravada, como RELATO/SEARCH para uma leitura e RELATÓRIO/EXPORTAÇÃO de uma cópia, incluindo tentativas recusadas. Os critérios de busca são: não gravado — um filtro carrega IDs de membro e de registro, e uma trilha que armazena o que foi procurado acumula os identificadores que existe para proteger. Tudo está limitado: grampos de tamanho de página para 200, uma tampa de exportação em 10.000 linhas. Uma trilha de seis anos é de milhões de linhas e a camada de captura escreve uma linha por linha da grade por carga, por isso um tamanho não fechado é um OOM acessível em vez de um Uma teórica. As datas saem como instantes UTC explícitos. A coluna é sem zona de parede, E esta prova é lida meses depois por alguém que não estava lá.
· kamo-internal
Tela de inscrição MFA e controle de limite PHI em modo deus
Two settings surfaces for backends that had none. MFA enrollment (settings → my profile → Sign-in Security, self only). SecurityService's /api/security/mfa endpoints have been complete and entirely unreachable, so MFA existed and nobody on the platform could turn it on. The tab is self-only because those endpoints resolve the user from the caller's own session and take no user parameter — an admin opening someone else's profile would be enrolling their own authenticator on that screen. The QR code uses qrcode.react, already a dependency; no package was added. The secret is shown next to it regardless, because an authenticator app on the same device as the browser cannot scan the screen it is covering. Two failure paths get first-class handling rather than a generic error. A 409 means a confirmed factor already exists and says so, with the remedy (an administrator reset) — telling the user to retry would send them back into the one action that cannot succeed. A wrong confirmation code keeps the pending enrollment: the secret is displayed once, so discarding it would mean deleting the authenticator entry and rescanning, and the server's pending enrollment would still be there, so the retry would come back 409 and strand them. Recovery codes are shown once and cannot be reissued. The dialog cannot be dismissed by escape, backdrop or a close button; Done unlocks only after the codes have been copied or downloaded AND the warning acknowledged. Both are required: a checkbox alone is clicked reflexively, and a clipboard alone is overwritten by the next copy — and nothing looks wrong until the day the user loses their phone. PHI boundary (settings → security → Health Data, god-eligible only). The tab is visible to god-eligible operators and the control inside requires god mode actually switched on, which SecurityService re-checks; eligibility alone is not activation. It never flips without first listing the modules that stop working — that list comes from the server, derived from PhiModule through PhiTenantGuard, so it cannot drift from what is enforced. A 503 is surfaced as "the change was not applied because it could not be recorded", because that is what happened. Decision logic lives in app/lib/security so vitest can reach it; the components hold rendering only. Verified: npx vitest run — 329 tests, 32 files, all passing (43 of them new). npx tsc --noEmit reports only three errors in **************** an untracked file from another session in this tree, in none of the files here.
· SecurityService
Ponto final para ler e mover o limite HIPAA de uma organização
Organization.handlesPhi já existiu como uma coluna sem forma de defini-la, então O PhiTenantGuard tem estado a fazer cumprir uma bandeira que ninguém conseguiu ligar. Este é o Falta metade: GET/PUT /api/ Security/phi/tenant. Autoridade é a elegibilidade de Deus E um deus ativoModeAtivo alternar, nunca um. Elegibilidade sozinho é o que deixou os portões de deus da plataforma mortos até 2026-07-22; aqui ele deixaria qualquer operador de Deus-elegível desligar módulos de um inquilino vivo com um clique não notável. O alvo é sempre o próprio órgão de sessão do chamador — não existe um parâmetro organizationalId, pelo que nenhum pedido elaborado pode chegar a O inquilino que ligou já não está lá dentro. phiEffectiveDate é carimbado em primeiro permitir e nunca reescrito, incluindo em um desactivar/reactivar posteriormente. Abrange as janelas de avaliação e retenção de violações, por isso, a sua evolução reduziria silenciosamente o período em análise e uma auditoria A data em que o pedido pode avançar não é prova. A linha de auditoria é escrita ANTES que a bandeira se mova, e CONFIGURE falha fechada, então a trilha que não pode ser escrita recusa a mudança e retorna 503 em vez de deixando um limite que se moveu sem registro de quando. Tentativas negadas são Também está gravado. Cada linha carrega identificadores e a transição apenas, nunca conteúdo. Os módulos bloqueados são derivados da PhiModule através da PhiTenantGuard em vez de listados, de modo que o aviso que a UI mostra não pode desviar - se do que a guarda impõe. Nenhum novo pacote de repositório: O OrganizationRepository já está no serviço @EnableJpaRepositórios lista, então não há nada a adicionar ao lado deste feijão. Verificado: 298 testes, 1 erro - ********************************** EntityManager NPE, que é pré-existente (linha de base 7968a21: 281 testes, mesmo 1 erro). RepositórioScanCoverageTest e ************* ambos Passo.
· kamo-internal
Reconstruir o formulário de citação como um fluxo guiado, adicionar uma antevisão de saída
A aba detalhes foi uma pilha plana de caixas delineadas que deu a cada campo o mesmo peso, então nada sinalizou quais entradas realmente mudar o que o cliente vê. Ele agora lê-se como as quatro decisões que uma citação é feita — para que serve, o que está sendo vendido, como é ajustado, o que o cliente lê — cada um com uma linha de razão importa, e o total de corrida fica num trilho pegajoso em vez de enterrado no fundo. Movimento carrega significado em vez de decoração: seções chegam em sequência, a campo condicional se expande a partir do controle que o revelou, a área de prec cross-fades quando a sua forma muda, e um total conta para o seu novo valor O preço unitário é notado em vez de silenciosamente absorvido. Tudo respeita prefere movimento reduzido. A nova ação Preview renderiza o documento acabado — cabeçalho, opções ou tabela, totais, termos — e imprime-o por si só. Ele projeta o estado do editor CURRENT, não o gravado salvo, porque o momento em que você precisa ver a citação terminada é ao decidir Se a enviar. Branding vem da própria resolução do servidor para que a visualização o cabeçalho é aquele que o cliente recebe, e a aritmética da opção é importada do editor em vez de reimplementado.
· kamo-shared-library
Vocabulário de auditoria para uma alteração no próprio limite de conformidade
Adiciona PhiResourceType.ORGANIZAÇÃO e PhiAccessKind.CONFIGURE para que a rotação Organization.handlesPhi on ou off pode ser gravado como o que é. Todos os tipos de recursos existentes nomeiam o registo de uma pessoa. Apresentar uma alteração da postura de conformidade do inquilino sob um deles colocaria uma mentira no §164.528 contabilidade das divulgações, e "quando este inquilino se tornou uma entidade coberta sócio de negócios" é a questão que o resto da trilha é examinada contra - Precisa da sua própria forma de fila, não uma emprestada. CONFIGURO falha fechado por uma razão diferente dos tipos de massa: nada é divulgada, recusando assim custa ao operador uma repetição, enquanto um limite que se moveu sem registro de quando o estado é uma avaliação §164.402 não pode ser reconstruída. Sem implicação. phi access log.RESOURCE TYPE e ACCESS KIND são simples VARCHARs criados por PhiAccessLogTableMigration with no enum whitelist CHECK, so nenhuma constante precisa de uma execução KamoInitializer antes de poder ser inserida, e não entidade ou @Column é tocado. Verified no exaustive switch over ou enum existe em qualquer serviço.
· SecurityService
Servir a vista voltada para o cliente para a equipe para visualização
GET /{uid}/preview retorna o mesmo PublicQuoteView o link de compartilhamento serve, a partir do mesma resolução do QuotePresentation, de modo que um cabeçalho pré- visualizado não pode diferir de um enviado Uma. Ele deliberadamente não menta um token, contar uma visão ou gravar um evento — olhando no seu próprio rascunho não é o engajamento do cliente, e deixá-lo entrar na trilha de atividade Tornaria o contador de visão inútil como um sinal.
· ConversionService
Digitalize uploads de malware na ingestão (§164.308(a)(5)(ii)(B))
O cofre do documento aceitou uploads arbitrários sem verificação de malware em qualquer lugar da plataforma, e é multi-atendimento — um arquivo um org uploads é aberto por outros usuários de org através do visualizador, do editor WOPI e da Fichário. ClamAV sobre INSTREAM, falado diretamente para clamd (sem biblioteca cliente; o protocolo é um socket e um prefixo de comprimento). O portão entra ImagingUploadController em /upload e /templates/upload, antes do membro pesquisa e antes de qualquer bytes chegar MinIO — digitalização após o armazenamento deixa o objeto recuperável para a largura da corrida. Comportamento não acessível ao scanner é FAIL OPEN por padrão, e isso é uma decisão Em vez de um acidente. clamd ainda não foi implantado: esta é a aplicação metade, e a implantação é um ato operacional separado (KlusterServices auto-aplica-se no push e não é esta mudança para tocar). Envio encerrado por defeito Levaria o upload do documento para cada inquilino no momento em que a imagem rolar, sem encenação em que isso teria sido apanhado. Aqui não há falhas. "sem proteção", é o status quo dos últimos anos, agora logado em ERRO sempre que acontece. Cada botão — incluindo o fecho de falhas — vive em kamowsconversion-config, então apertar uma vez que o clamd está estável é um configmap editar e reiniciar, não uma versão. Um disjuntor limita o custo de um scanner ausente: após 3 consecutivas falhas o guarda pára de discar por 60s, por isso uploads não pagam cada um Conectar tempo limite para um controle que está efetivamente desligado. Na detecção: 422 nomeando a assinatura (não um 5xx — tentar novamente não vai ajudar), os bytes são preservados num balde de quarentena dedicado, em vez de deixados cair, e a rejeição é registrada através do PhiAccessRecorder. A linha de auditoria carrega identificadores somente; o nome do arquivo enviado fica fora dele porque os nomes aqui normalmente contêm nomes de mutuários. PhiAccessKinnd não tem membro UPLOAD e adicionar um alteraria a restrição de uma coluna @Enumerada(STRING) no compartilhamento biblioteca, então DOWNLOAD + permitido=false é usado ea razão é documentada em O local de chamada. Também muda a trilha PHI deste serviço para o escritor phi access log durável. A entrada com.kamo.z.shared.phi.audit correspondente está no mesmo commit @EnableJpaRepositorys list, e PhiAuditRepositoryScanTest falha na compilação se os dois sempre derivam — esse emparelhamento foi o que levou cada login para baixo em 2026-08-03. Retro-scan (POST ************* varre documentos já no cofre, vigiado e bipado. Relata e preserva, nunca bloqueia ou elimina: tornando um objeto armazenado irrecuperável necessita de uma quarentena persistente flag, ou seja, uma coluna de biblioteca compartilhada aplicada por um inicializador de execução manual enquanto serviço IC constrói contra principal, e excluir em um falso positivo destruiria Um registo de inquilino sem recuperação. Testes: 36 novos. - Pré-existente. at or abaixo 1080 ainda falha em uma árvore limpa; intocada. Não abrangido, deliberadamente: GravaçãoIngestController (interno-auth Asterisco push) e o WOPI PutFile do DocsService são caminhos de segunda ingestão que querem o mesmo gate, mas o scanner vive neste serviço e o WOPI não tem nenhum token para atribuir uma linha de auditoria. Ambos são seguimentos, não negligências.
· SecurityService
Modo deus de vidro de ruptura – justificação + caixa de tempo de 30 minutos
O modo Deus ativou silenciosamente e durou tanto tempo quanto a sessão. Este é o controlar a revisão de segurança de uma entidade coberta empurra mais duro, porque "seu pessoal pode ler nossos dados do paciente" é sempre perguntado e um injustificado, ilimitado A elevação não tem resposta. - POST /api/security/session/God-mode agora requer uma justificação digitada para Subam. Subir para baixo nunca faz — um controle que porta a ação segura é um controle que mantém os operadores elevados. - Ambas as bordas são gravadas através do PhiAccessRecorder com a justificação e plataforma Staff( verdade). Apenas identificadores; a justificação é do próprio operador palavras sobre porquê, nunca nada que eles passaram a ler. - A janela é de 30 minutos. A expiração é um instante absoluto em o corpo da sessão, não um TTL, por isso a atualização da sessão deslizante não pode extendê-la, e reassegurando de uma segunda aba retorna a expiração original em vez de comprar outra janela. - KSessionService.getSession mascara uma bandeira transcorrida, então todas as ~10 existentes `session.get("GodModeActive")` portões honram a caixa de tempo sem mudar. GET /session/God-mode escreve o clear através do Redis (fazer dentro e é o que as sondagens da UI para a contagem regressiva. Falhas deliberadas ABERTO na auditoria escrever: modo deus é como as correções de suporte produção, e recusando uma elevação porque phi access log piscado é pior do que uma linha que o gravador já registrou alto. Nenhuma entidade ou @Column mudou. PhiResourceType não ganha nenhuma constante também — é @Enumerado(STRING) com uma lista de valores CREATE TABLE que ddl-auto:update nunca se alarga, então uma nova constante falharia em cada inserção até KamoInitializer foi executado à mão. A elevação é registada contra o próprio MEMBRO do operador Um recorde com um prefixo.
· kamo-internal
Reordenar as páginas do administrador; dobra os identificadores para um popover de financiamento de pipeline
Ordem de tabulação agora é Pipeline, Documentos, Subscrição, Preços, Capital & Risco, Governança, Ingestão, Catálogo — Pipeline torna-se a tela de pouso padrão. A aba Identificadores autônomos desapareceu; sua pesquisa vive no Pipeline barra de ferramentas como um popover compacto de Find- loan: pesquisa por UID de empréstimo (padrão) ou resolver qualquer identificador externo (MERS MIN, caso de agência #, envelope de e-sign, etc.) ao seu empréstimo, com um cartão de resultado rico, o livro identificador do empréstimo, histórico de ciclo de vida, e um clique aberto / show-in-pipeline.
· kamo-signer-monorepo
Comparar opções na página pública de citação
Opções renderizam como cartas selecionáveis em vez de linhas, porque elas são escolhas e não adições. O total do período é o título; o equivalente mensal fica ao seu lado como a figura que torna comparáveis diferentes termos de facturação, e um crachá de poupança só aparece quando a diferença vale a pena nomear. A tabela plana e o bloco total combinado são suprimidos quando as opções estão presentes — um total geral entre alternativas mutuamente exclusivas é um número Ninguém pode pagar. As regras de impressão mantêm as cartas lado a lado para que uma citação impressa ainda se compare.
· kamo-internal
Autor aspas multi- opção do editor
Uma citação é uma folha de preço plana ou um conjunto de alternativas, então o editor oferece uma opção de modo em vez de deixar ambos existirem ao mesmo tempo — enviando ambos mostraria ao cliente um preço que não podem comprar. Mudar para opções carrega as linhas existentes na primeira opção em vez de descartar o trabalho digitado. Cada opção recebe seus próprios itens de linha, prazo de faturamento, duração do compromisso, desconto e taxa de instalação, com uma pré-visualização ao vivo do período total, equivalente mensal, valor contratual e poupança em relação à linha de base. Os espelhos de antevisão QuoteOptionTotals; o servidor recomputa ao salvar e suas figuras ganham. A contagem de assentos vive na citação, então 40 -> 60 repreços cada opção ao mesmo tempo.
· SecurityService
Aceitar uma opção no endpoint público da cotação
As cotações multi-opção não podem ser aceites às cegas — o pedido agora carrega o opção escolhidaUid eo serviço recusa aceitação sem um.
· kamo-shared-library
Aspas multi-opção com totais de comparação per-opção
Uma citação pode agora apresentar várias formas mutuamente exclusivas de comprar — mensalmente, anual, de três anos — em vez de forçar três documentos separados que derivam separado no momento em que a contagem do assento muda. - QuoteOption possui seus próprios itens de linha e totais; irmãos nunca são somados. - QuoteOptionTotals normaliza cada opção para um equivalente mensal, que é a única base em que diferentes termos de faturamento podem ser comparados, mais um contrato total e poupanças contra a linha de base marcada. - Prazo de faturamento e duração do compromisso permanecer separado: pagar anualmente não é O mesmo compromisso que um mandato de três anos facturado anualmente. - Quote.quantity é um driver compartilhado; uma linha optando por usar QuoteQuantity repreços em todas as opções ao mesmo tempo. CitaçãoTotais honra-o de forma idêntica sobre folhas planas para que uma linha não pode preço diferente dentro e fora de uma opção. - Aceitar uma cotação multi-opção requer nomear a opção; irmãos fecham como NOT SELECTED and acceptedOptionUid registra a escolha. CitaçãoTotaisTeste 15, CitaçãoOpçãoTotaisTeste 11, CitaçãoCompartilheTokenTeste 9 — todos passam.
· kamo-internal
Cobertura de entrega, assinatura de preços, painéis de grande depósito
Substitui os chips finais de Coming-soon (Hedge & cobertura, assinatura de preços, Grande-depósito) com painéis ao vivo ligados ao novo mordomo proxies.
· SecurityService
Proxies Steward para cobertura, assinatura de preços, grande depósito
Operator-gated, session-stamped org+member, fail-closed propriety (no cross-org Oráculo da existência). Novos parâmetros de referência na catraca de ponta não autenticada.
· kamo-shared-library
Entidade de assinatura de preços WORM (mlos pricing signoff)
Anexar apenas o administrador HOMOLOGAR/REJECTAR julgamento sobre um resultado de preço congelado. @PreUpdate lança (uma reversão é uma nova linha). Quadro + 4 índices (org, run, resultado, empréstimo) aplicado para prod BarataDB via KamoInitializer.
· kamo-internal
Console de mesa rodada 2 — filas de exceção, governança, reconhecimento MERS
- Capital + Underwriting: StewardExceptionFila (painel compartilhado) ligada ao real Endpoint das tarefas de bordo — exceções de bloqueio ******************* e exceções de diretrizes ****************Estados honestos e vazios. - Governança: CalibraçãoPainel de Confiabilidade (previsto vs observado por segmento) e PullThroughFunnelPanel (distribuição de estágio real, etiquetado como um instantâneo não como uma coorte conversão). Substituí as duas batatas fritas. - Documentos: painel de reconciliação MERS sobre o verdadeiro reconhecimento de lider interno lido. Endpoints reais ao longo; cópia de texto simples (i18n follow-up); tsc -- noEmit clean.
· SecurityService
Relés de porta para tarefas de bordo, calibração/funil, reconciliação MERS
relés de GET com o servidor de orgs e elegíveis para Deus: **************************** MlosDocOrchestration **************************** (filtro de org fechado por falha, gotas pacote não propriedade linhas + re-deriva a contagem). Todos os quatro valores basais na catraca de pontos sem protecção Guarda, como os irmãos.
· 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.

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