Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· kamo-shared-library
Repositórios de recursos FHIR, com a reivindicação de versão 40001 segura
reclameNextVersion é um UPDATE ... SET current version id = current version id + 1 e deve ser a PRIMEIRA declaração de uma transação de escrita. O óbvio alternativa — ler a versão atual, adicionar um, escrever — é um read- after- write dentro de uma transação, que o YugabyteDB aborta com SQLSTATE 40001 em concorrência. Ele falha intermitentemente, por isso apresenta como um impasse aleatório, e um loop de repetição parece corrigi-lo ao corrigir Nada: a repetição tem a mesma forma e ganha a corrida com mais frequência. O UPDATE também pega o bloqueio e lê em uma viagem de ida e volta, que é um menos do que substitui. findClaimedVersion lê de volta na mesma transação e é seguro apesar esse aviso, porque a UPDATE já tomou a fechadura da linha — Yugabyte problema de read- reirt é sobre linhas outra transação pode mover abaixo de você. A pesquisa de recursos devolve deliberadamente recursos DELETADOS. Um ouvinte tem que dizer "nunca existiu" (404) de "eliminado" (410 ido), e FHIR requer um recurso apagado para continuar respondendo vread e history; filtrando-os aqui Tornaria isso impossível uma camada acima. FhirResourceVersionRepository declara NÃO excluir e NÃO atualizar, e um teste impõe que nunca ganha um. A entidade recusa ambos através @PreRemove/@PreUpdate — mas esses são CALLBACKS DE ENTIDADE, e dados de primavera derivado delete compila para bulk JPQL que os ignora completamente. Tal método apagaria a história clínica silenciosamente enquanto a própria entidade A protecção nunca disparou. Não declarar uma é a proteção real, e que é uma decisão que nenhum compilador impõe. O histórico e as leituras de reprojeção são ambos paged, porque uma emenda ativamente gráfico acumula versões e uma leitura ilimitada é ilimitada exatamente onde dói mais. SharedLibBeanSafety Teste ainda passa: repositórios são interfaces, e não O feijão estereótipo foi adicionado à biblioteca. 1655 testes verdes.
· kamo-shared-library
A coluna de encontro (SP5)
A entidade tudo clínico pendura fora — uma nota, uma ordem, um diagnóstico e uma carga de todos os pontos no encontro em que eles surgiram. Os tempos planejados e reais são pares de colunas separados, que são ambos decisão de compatibilidade com o futuro e apenas verdadeira. R4 dá um Encontro a período único; R5 e R6 dividido planejado do real, assim modelando um agora significaria reescrever cada linha de encontro e cada consulta de agendamento quando Que pousa. É também como uma prática mede o seu próprio atraso — o fosso entre o que foi reservado e o que aconteceu é exatamente a coisa desmoronando Eles descartam. classCode é armazenado como um código simples mais seu sistema em vez de um incorporado Codificação, porque R4 digita como uma codificação e R6 muda-lo; colunas sobrevivem As duas coisas. Também não é cosmético: conduz o código de lugar de serviço no Afirmação, e uma visita de telessaúde cobrada como pessoalmente é uma alegação falsa. A razão é mantida à parte do diagnóstico. O que o paciente disse e o que o o clínico concluiu que são fatos diferentes, e um gráfico que os confunde perde totalmente a queixa apresentada. O Participante do Encontro é uma tabela de crianças porque o caso de supervisão não pode ser achatado: o fornecedor de faturamento sobre um crédito é calculado a partir do registro de supervisão em vez de digitado por um cobrador, e sob incidente-para regras o papel decide se a visita é passível de cobrança. fisicamente Presente é o seu próprio campo porque um médico supervisor pode estar disponível sem estar na sala, e inferir presença do papel seria silenciosamente Afirmar algo sobre uma reivindicação que ninguém verificou. EncounterDiagnosis.rank é portador de carga e parece cosmético. Linhas de serviço ligadas uma alegação profissional aponta para diagnósticos POR POSIÇÃO — o ponteiro é um índice, não um código — então uma ordem armazenada que não corresponda ao enviado ordem desvia todas as linhas, e o pedido é negado ou pago contra uma doença que o doente não tem. endereçadoAtEncounter existe porque nem todos os diagnósticos listados foram realmente avaliados, e o nível E/M é calculado a partir dos que foram; a contagem de mera presença o infla. Encontros nunca são excluídos — um criado em erro se torna entrar em erro e ficar, porque ordens, notas e acusações já referência e uma referência pendente é pior do que um registro visivelmente errado. 1651 testes verdes.
· kamo-internal
Diga às pessoas que um pseudônimo da web é tomado enquanto eles estão digitando-o
O assistente de criação tem onze passos e o apelido só foi validado para FORMATO localmente — se alguém já o detinha o formulário foi submetido, no final, em uma organização que não poderia ser criado. Agora o campo diz isso enquanto ainda está na tela. Denunciado a 400ms, por isso escrever uma palavra é um pedido. Cada verificação carrega um ticket e uma resposta defasada é descartada: digitando "acme" então "acme-2" nunca deve decidir o veredicto para "acme". As regras locais — todos os dígitos e o formato [a-z0-9-]{1,63} — são verificados antes de qualquer pedido, e são deliberadamente as mesmas regras SecurityService Obrigações na criação. Se eles derivam, o campo diz "disponível" para algo criar então se recusa, que é a falha que isto remove. Eles são puros. funções para que um teste possa piná-los, e o gancho executa os testados. Uma verificação inatingível lê como "não pôde verificar" e deixa o membro carregar em vez de não abrir para "disponível" e colocá-los de volta onde Eles começaram. Nomes "tomados" nenhuma organização: o assistente não tem negócio contar a um cliente sobre o outro. Ambas as entradas alias são cobertas — o caminho web-alias e o caminho simples. 2943 testes e todos os 8 guardas passar, i18n incluído. Cópia depositada Kamo-tradução-dicionário primeiro.
· InitializerService
Faça orgs.alias plataforma única
A coluna nunca foi restringida. Sobrevivível enquanto um pseudônimo era apenas resolvido como (security provider id, alias) por trás de uma máquina, desde duas orgs sob diferentes prestadores poderia compartilhar um sem ambiguidade. Uma vez uma org pode ser nomeado diretamente por seu alias com ?org=, uma repetição faz a referência ambíguo — o solucionador recusa-o em vez de adivinhar, deixando ambas as orgs Inalcançável pelo nome falso. Aplicado ao banco de dados ao vivo, após renomear as seis linhas que colidiram (quatro partilha "acme-corp", dois partilha "kia-kaha", todos semeados no mesmo dia) com um sufixo numérico. Isto é o que dá a um ambiente fresco o mesmo índice; o serviço não tem IC, então empurrando-o não envia nada sozinho. No lower( alias), porque o alias é armazenado na íntegra e na igualdade Postgres não é caso-insensível: "Acme-Corp" e "acme-corp" resolvem o mesmo Referência e deve colidir. Parcial, porque NULL ou vazio significa "sem alias" em vez de um nome a ser reivindicado, e qualquer número de orgs pode não ter nenhum. Registra e continua se não puder ser criado em vez de falhar na execução — que significa que existem duplicatas, e as verificações de criação/atualização recusam novas Não importa.
· SecurityService
Responda se um alias da Web ainda é livre
O assistente de criação de orgs tem onze passos e o apelido só foi verificado quando o formulário foi submetido, então alguém que escolheu um nome outro organização já realizada foi dito no final, em uma org que poderia não ser criado. GET /org/alias-disponível responde à mesma pergunta que os caminhos de escrita — tomadas globalmente e caso-insensível, ou todos os dígitos — assim o assistente e o servidor não pode discordar. Se o fizessem, o campo diria "disponível" para algo criar então se recusa, que é a falha que isto remove. Guardado pela sessão. A resposta é um booleano sobre um nome que o chamador digitou, que criar iria dizer-lhes de qualquer maneira, mas não há razão para Chamador não autenticado uma forma de enumerar quais nomes falsos estão em uso. Consultoria, não uma reserva: duas pessoas podem estar digitando o mesmo pseudônimo em Uma vez e ambos ser dito que é livre. O índice único e a verificação de criação resolver isso; isso só estreita a janela para algo que não matéria na prática. 964 testes passam.
· kamo-shared-library
A entidade doente e os seus satélites US Core (SP5)
Uma nova entidade em vez de uma reutilização, e cada rejeição é mais concreta que estilística. Não Membro: GET /api/security/members/names retorna a cada membro de uma org com porta direita NO e o endpoint by-id devolve o nome peças mais data de nascimento em um mesmo-org verificar sozinho, por isso qualquer autenticado a sessão — incluindo a de outro paciente — enumeraria a lista. Não Lead: é @ Inheritance( JOINED), e um gráfico de busca em um desses dados /leva para baixo na versão Hibernate grande parte da frota ainda funciona. Não Contato: aqueles pertencem ao livro de endereços pessoal de um Usuário, que é o o oposto de um paciente pertencente à prática. O mesmo humano é um paciente diferente em cada prática. Esse é o arrendamento limite, não um compromisso — cada entidade coberta detém o seu próprio registo, MRN e a postura do consentimento, e a identidade da prática cruzada é um problema de correspondência para o MPI em vez de uma linha compartilhada. Três conceitos de sexo/gênero são colunas separadas porque respondem perguntas diferentes e uma coluna não podem servir as três. Administrativo gênero é o que aparece na papelada; sexo nascimento é testado e pesquisável; sexoForClinicalUse é o que conduz intervalos de referência e administração. Confô-los é como um paciente trans recebe a referência errada Alcance no resultado do laboratório. Data de nascimento é um Data Local deliberadamente — uma data de nascimento não tem tempo e não zona, e dando-lhe um desloca-lo através da linha de data para quem viaja. É por isso que a disciplina proíbe especificamente o LocalDateTime em vez de todos os tipos locais. Data de nascimentoPrecisão está lá porque um paciente que sabe apenas o seu ano de nascimento é comum, e armazenar isso como 1 Janeiro Em seguida, combinando na data exata silenciosamente não os encontra. Raça e etnia são uma tabela de crianças porque uma pessoa pode relatar vários e uma única coluna força alguém de herança mista em que O código foi mantido. Eles alimentam medidas de qualidade e relatórios de disparidade, por isso não são decoração demográfica — e auto-relatados defaults true porque são registrados a partir do que um paciente disse, não inferido. Linguagem carrega intérpreteRequerido como um fato independente: um paciente pode prefere espanhol e decodificador um intérprete, e inferindo um do outro está errado em ambas as direções. A secção 1557 liga ambas. ativo significa "este registro está em uso", NÃO soft-eliminado, e mescladoInto plus fundidaA existe porque a única mesclagem existente da plataforma é unidirecional com Sem fusão, e fundindo os dois pacientes errados está entre os mais prejudiciais erros que uma prática pode cometer. contactId mantém o link CRM para atribuição de aquisição segue uma pessoa desde o primeiro inquérito ao gráfico. Nenhum EHR independente pode fazer isso, porque não tem ninguém antes de ter um paciente. 1651 testes verdes.
· kamo-shared-library
Os registos de divulgação e as restrições de doentes (SP2)
DivulgaçãoLedger é separado do phi access log de propósito. O registo de acesso registra cada LER, e a maioria das leituras são um clínico abrindo um gráfico; derivando uma contabilidade a partir dela entrega ao paciente uma listagem de documentos milhares de pontos de vista internos, o que é errado e alarmante. §164.528 Contas sobre DIVULGAÇÕES — PHI que abandona a entidade coberta — não internas utilizar. Os dois também abrangem períodos e finalidades diferentes, que é por finalidadeOfUse é carimbado no momento do acesso e transportado aqui em vez de inferiu mais tarde. hipaaAccountable é armazenado em vez de derivado da finalidade em leitura, porque a regra tem exceções o propósito por si só não captura — a divulgação que o paciente autorizado é contabilizado de forma diferente de um feito sob uma exceção de tratamento — e recomputá-lo mais tarde significa re-derivar Excepções de dados que já não existem. PatientRestriction carrega a obrigação §164.522 uma entidade coberta pode NÃO recusar: um paciente que paga fora do bolso na totalidade pode exigir que o serviço não ser divulgado ao seu plano. Esse é o que normalmente é implementado errado, porque esconder o encontro em uma tela não cumpre. Tem de ser ficar fora da SUBMISSÃO CLAIM e fora de ELEGIBILIDADE, uma vez que ambos Diga ao plano que o serviço aconteceu. Um sistema que o esconde no gráfico e contas de qualquer maneira revelou exatamente o que o paciente pagou para prevenir, e descobrem pela explicação dos benefícios. Então supressorFromClaims é sua própria bandeira verificada pelo caminho de faturamento, não inferido de uma regra de exibição — regras de exibição ficar relaxado para usabilidade e uma supressão da facturação não deve viajar com eles. supplyFromEligibilidade é separar novamente, porque um 270 pedindo um plano sobre um serviço sinaliza o serviço é contemplado; suprimir a reivindicação sozinho vaza o mesmo fato mais silenciosamente. Ambas as tabelas fecham linhas em vez de as apagar. Uma restrição levantada ainda explica por que um serviço ficou desprotegido por seis meses, e o livro é apenas porque uma contabilidade que pode ser editada não é uma contabilidade. Limites temporais são exclusivos no instante final e os testes pin ambos instruções, incluindo que uma linha incompleta nega em vez de lançar — Este predicado está no caminho da facturação. 1653 testes verdes.
· kamo-shared-library
Relações de cuidado e vidro quebrado, os fatos por trás da base de acesso (SP2)
PhiAccessBasis ganhou CARE TEAM e BREAK GLASS último commit; sem estes duas tabelas esses valores são decorativos. Nada na plataforma modelou um relação provedor-paciente em tudo — o inquérito não encontrou tal adesão em qualquer lugar – assim autorização só poderia responder "pode esta pessoa ler gráficos", que todo clínico em uma prática pode. A questão é mínima. liga é se eles podem ler este. CareRelationship é um FACT persistido, deliberadamente não um RightType, e cada razão morde por conta própria. Direitos são instantâneos em *** no login, então uma revogação não chegaria a uma sessão ao vivo — uma relação terminada tem de Pare de conceder acesso agora. Um novo direito chega silenciosamente CONCEDIDO para conceder-todos funções de administrador, que é catastrófico para algo destinado a ser por doente. E checkRight () devolve true para tudo no modo deus, Considerando que existe ou não uma relação. As linhas são fechadas com validTo, nunca apagadas. "Esta pessoa estava no cuidado equipe quando eles abriram o gráfico em março passado" não pode ser respondido pelo equipe de cuidados, e isso é exatamente o que uma revisão de acesso pede. BreakGlassGrant existe porque recusar construí-lo não é a escolha segura. Um paciente chega inconsciente e o clínico assistente está em nenhuma equipe de cuidados ainda; um sistema que diz que não é uma pessoa que trabalha em torno, e a solução é um login compartilhado. O controlo não é prevenção — é que o acesso é estreitos, declarados, cronometrados e LEIA APÓS. A razão é texto livre e necessário, porque seu valor é que um humano o escreveu e outro humano lê ele; um dropdown é clicado sem ler. DEliberadamente NÃO é o modo deus: isso é plataforma-pessoal break-glass, servidor de propriedade. Roteando emergências clínicas de uma entidade coberta através do vendedor de Kamo backdoor é o único controle que um revisor BAA não vai passar. Ambos os predicados temporais tratam seu instante final como EXCLUSIVE, e os testes fixar o limite em ambas as direções — uma extremidade inclusiva silenciosamente estende cada relacionamento terminado e cada sobreposição expirada por um tick, e nenhuma falha Levanta qualquer coisa. 1644 testes verdes.
· InitializerService
Coloque tenant id de volta na frente das chaves de recursos clínicos
ddl- auto built PRIMARY KEY (logic id, resource type, lonker id) on fhir resource current e fhir resource version, porque o Hibernate emite @EmbeddedId colunas alfabeticamente em vez de em ordem de declaração. Ligado YugabyteDB a primeira coluna de chave primária decide o fragmento de hash, então levando com um UUID distribui um gráfico inteiro de uma prática em cada tablet e transforma cada leitura em um cross-node fan-out — exatamente o oposto de por que o Existe uma chave composta. Recria em vez de ALTERS: mudar uma chave primária é uma tabela reescrita e O suporte de Yugabyte é limitado. Ambas as tabelas são novas e vazio por isso isso é exato e barato, e o corredor REFUSAS para tocar um filas de espera da tabela — nesse ponto a jogada certa é uma migração planejada com uma cópia de dados, e descobrir isso a partir de uma linha de log é melhor do que descobrir dos mapas desaparecidos. Idempotente, e verifica contra pg constraint em vez de assumir: uma vez A chave está certa, ela inspeciona, concorda e não faz nada. Excepções são capturadas por mesa, porque um lance escapando um corredor silenciosamente retém cada corredor Pediram depois.
· kamo-internal
Adicionar a página de Erros do Sistema
Membros relatam defeitos na plataforma com imagens e os sites que eles A máquina de dev. Um inquilino vê apenas os bugs de sua própria organização e a plataforma organização vê de cada inquilino — decidiu servidor-lado, assim que o console nunca tem um alcance próprio para se enganar. GESTÃO SYSTEM BUGS é uma plataforma direito e porta uma ACÇÃO em vez de uma guia de Configuração, que é o que o O teste de cobertura da superfície agora regista. A área de captura de tela toma uma pasta, bem como um arrastar ou um clique, porque uma imagem está quase sempre na área de transferência quando alguém Senta-se para relatar um. Enviar para IA verifica se a máquina de dev pode fazer exame de um despacho ANTES do operador escreve qualquer coisa, e mantém seu texto em uma falha ao invés de fazê-los escrever duas vezes. Modelo e esforço são enviados como nomes; o console Nunca constrói uma bandeira.
· kamo-shared-library
Rótulos de segurança DS4P, aplicados em tempo de gravação (SP2)
A projeção indexada do meta de um recurso. etiquetas de segurança, e a coisa que tem de existir antes da primeira leitura clínica, em vez de Primeiro cliente de saúde comportamental. Aplicado no tempo WRITE, nunca calculado na hora de leitura, para um mecânico razão: uma etiqueta derivada no tempo de leitura tem de ser derivada por cada caminho de leitura independentemente — a busca FHIR, o portal, a geração C-CDA, o TEFCA resposta, exportação em massa, apresentação de pedidos — e o que esquece é o Uma que vaza. Escrito uma vez ao lado do recurso, é um predicado único cada caminho compartilha. Indexado em vez de viver apenas dentro do recurso JSON, porque a segmentação é um FILTER em cada consulta clínica. Um rótulo da base de dados não é possível ver os meios de filtragem no código da aplicação após as linhas serem carregadas, que é lento e exatamente a forma que vaza sob paginação. labelKind existe porque os quatro tipos são aplicados de forma diferente e devem não ser comparado como um saco. Um nível de confidencialidade é um limite máximo para quem pode ler; um código de sensibilidade diz qual o consentimento aplicável; uma política de refrão é uma instruções ao RECIPIENTE que viaja com uma divulgação. Tratamento código de refrão como um filtro de leitura não bloqueia nada; tratando um código de sensibilidade como um bloqueia tudo. patientId é desnormalizado porque uma verificação de consentimento pergunta o que é restrito para este paciente, e andando de cada recurso rotulado de volta para o seu o sujeito seria uma junção por fileira no caminho quente de cada leitura clínica. manualmenteAtribuído está lá para que um relabel automatizado não possa sobrepor silenciosamente uma restrição explícita de um clínico, e atribuiu Razão assim "quem decidiu isso note is Part 2 data" tem uma resposta que não é "o sistema fez" — necessário tanto para defender uma restrição quanto para levantar uma aplicada em erro. Urgente e não teórica: 42 CFR Data de cumprimento da parte 2 16 de fevereiro de 2026 e o OCR abriram a execução civil no dia 13. 2024 regra relaxada segregação física, mas manteve o aviso de redisclusão e bar sobre uso em processos judiciais, assim parte 2 procedência ainda deve ser rotulada e deve sobreviver a jusante.
· kamo-shared-library
Alargar a coluna de auditoria para a contabilidade clínica (SP2)
Quatro campos de leitura clínica não podem funcionar sem, e nenhum dos quais pode ser enchido de volta — cada registro de algo somente conhecível no momento de acesso. propositionOfUse é o que mais importa, porque dois jurídicos diferentes relatórios são construídos a partir das mesmas linhas e eles discordam. §164.528 — HIPAA, Sexto ano de observação — EXCLUDES tratamento, pagamento e operações. 42 CFR §2.25 — Parte 2, retrospetiva de três anos através de uma EHR, vive desde 16 de Fevereiro 2026 — INCLUI - OS. Uma linha sem propósito pertence a nenhum dos dois e não pode ser atribuído a um posterior; derivando-o do caminho do pedido depois é adivinhação, e a saída é um documento legal entregue a um paciente. O excesso de informação alerta-os sobre revelações que nunca aconteceram, sub-relato é uma violação, e nenhum deles levanta uma exceção. patientCompartmentId não é recurso. O registro sensível é geralmente um Observação ou uma nota cujo ID não diz nada sobre de quem é, então sem ele a pergunta literal §164.528 — tudo o que já viu sobre isso paciente — não tem predicado e torna-se um exame completo da maior tabela sobre A plataforma. É um índice, e isso é um comércio declarado em vez de um vitória livre: em Yugabyte cada índice secundário é uma tabela distribuída separada, assim, um inserto de auditoria torna-se cinco escritos distribuídos em vez de quatro. A escritor em lote absorve-o; uma varredura completa contra um relógio legal de 60 dias faz Não absorvam nada. accessBase registros sobre o que AUTORIDADE o chamador atingiu o registro, como diferente do que eles queriam. "Aberto este gráfico para tratamento" é não notável; "abriu este gráfico para tratamento e não está na equipe de cuidados" é a descoberta de uma revisão de ameaças internas à superfície. Se alguém foi em uma equipe de cuidados há seis meses não é responsável da equipe de cuidados de hoje mesa, por isso está carimbada agora ou desaparece. Dezenove tipos de recursos clínicos anexados, em homenagem ao seu recurso FHIR Tipos de uma linha de auditoria, uma projeção do AuditEvent e uma divulgação do TEFCA gravar todos dizem a mesma palavra. Seguro para adicionar sem migração: a coluna é VARCHAR(40) sem CONTROLO — e um pinos de teste que cada nome ainda se encaixa, porque um nome superdimensionado falha na inserção, que para um tipo fechado por falha significa recusar a leitura em si. Cada campo é nulável, então todas as linhas existentes e todas as chamadas não clínicas não são afectados. 1636 testes verdes.
· kamo-shared-library
As oito tabelas de índice de pesquisa digitadas (SP3)
A pesquisa corre sobre tabelas digitadas explícitas, não JSONB com GIN. Isso é forçado. pelo banco de dados, não escolhido: os documentos próprios de Yugabyte declaram que um índice GIN não pode usar mais de uma entrada de digitalização necessária, GIN multi-coluna não é suportado, somente IndexScan está disponível, e UPDATE é DELETE + INSERT. O single consulta US Core manda a maioria — Observação por paciente e categoria — é dois entradas de digitalização necessárias, então um servidor primário do JSONB seria mais lento em exactamente quais testes de certificação. Cada tabela existe porque seu tipo tem um modo de falha que as outras não: O SpidxDate armazena uma entrevista, porque uma data FHIR é uma. 2026, 2026-08 e 2026-08-24 são valores diferentes e eq2026 significa todo o ano. A um único instante colapsa-los e, em seguida, silenciosamente não coincide, por isso um a data de nascimento registrada como ano não é encontrada por uma busca por esse ano. A nula alta significa ainda correndo, não faltando. - Índices de spedxQuantity SOMENTE o valor canônico UCUM, e deliberadamente tem nenhuma coluna para o par inserido. A comparação de unidades inseridas permite uma pesquisa para 7500 ug perder um conservado 7,5 mg, e o erro é silencioso — um resultado vazio Parece que o paciente não tem tal observação. Quantidade que não pode ser canonicalizado não é indexado em tudo, que é o honesto resultado. - SpidxComposite mantém as duas metades numa fila. Juntar uma tabela de símbolos a um tabela de quantidade sobre o recurso não pode expressar "mesmo elemento": um sangue a pressão tem componentes sistólicos e diastólicos, e que se o código sistólico contra o valor diastólico e relatar um hipertenso A leitura que nunca foi tirada. - SpidxString mantém normalizado e cru separadamente, porque correspondência deve não alterar o que é exibido. :contém necessidades de trigram combinando Yugabyte não faz bem; a declaração de capacidade deve descodificar-lo em vez de oferecer um modificador que se degrade para um scan. - SpidxReference é separado de fhir reference link de propósito. A ligação tabela é o GRAPH que include e acorrentando andar; este é o ÌNDICE a filtros de pesquisa simples ligados. Uni-los faz com que cada busca normal pague por as linhas mais largas do gráfico e a indexação dupla. hashIdentity é um hash 64-bit de (resourceType, paramName) então o líder A chave permanece estreita e de largura fixa. As colisões são inofensivas porque ambas as cordas também são armazenadas — tratar o hash como autoritário seria o Insecto. FhirSearchIndexShapeTest fixa os invariantes cuja violação é silenciosa, e é comprovada pela mutação: re-adicionando o valor introduzido ao SpidxQuantity e largar o índice de reindex do SpidxToken falhou cada um com o seu próprio explicação antes do reverso. ClinicalEntityDisciplineTest's field scan agora caminha na hierarquia de classes também, então uma violação estacionou em @MappedSuperclass — que é exactamente onde vivem colunas partilhadas — que já não podem esconder-se dela. 1630 testes verdes.
· SecurityService
Enviar para AI, fechado em GESTÃO SYSTEM BUGS
A classe carrega @RequirePlatformRight, então o interceptor resolve o Chamador e recusa antes de qualquer manipulador correr — uma verificação por método teria foi uma anotação esquecida de um buraco, e o ponto final atinge uma alertas. A verificação de acesso é a defesa. Modelo e esforço são mapeados a partir de um vocabulário fixo, de modo que um corpo de pedido pode Exprima um modelo diferente e nada mais — nunca uma bandeira. A linha de auditoria é escrito e COMPROMETIDO antes da máquina de dev é chamado, a partir do seu próprio feijão: REQUISITOS NOVO através de uma auto-invocação é inerte, e uma linha que só apareceu no sucesso seria perder os despachos que penduraram. SessionPlatformFacts agora vem da biblioteca compartilhada, então MediaService e Este serviço leu GodModeActive da mesma forma.
· MediaService
Erro CRUD, capturas de tela e a única regra de visibilidade
Um erro do sistema atravessa a linha de locação em uma direção: a plataforma A organização vê todos os inquilinos, e nenhum inquilino vê os outros. Essa regra e em nenhum outro lugar, decidiu-se lá dentro. a consulta em vez de filtrando uma página obtida, e escrita porque o Optional.map trata um resultado nulo como EMPTY — como map(...). orElse(-1L) Caiu e a tribuna não viu nada. Capturas de tela são linhas Img sob a nova associação SYSTEM BUG SCREENSHOT, validado por bytes mágicos e não pelo tipo de conteúdo que o navegador reivindica. GESTÃO SYSTEM BUGS é resolvido através da plataforma compartilhadaDireitosResolver e o SessionPlatformFacts compartilhado, nunca fora da lista de direitos de inquilino da sessão: o ajudante de inquilino trata GD sozinho como um bypass, enquanto uma plataforma precisa direito Uma janela de modo-deus aberta.
· kamo-shared-library
Versão dos recursos FHIR e a espinha dorsal do link de referência (SP3)
Três tabelas que entre elas fazem ler, ler, história, ETAG e cada forma de incluir trabalho. fhir resource current é um ponteiro, uma linha por recurso para sempre. Ela existe assim, um GET é uma única busca de chaves primárias: encontrar a versão id mais alta em vez disso, escanearia todo o histórico de um recurso em cada leitura, então o mais Os gráficos alterados — os doentes — seriam os mais lentos a abrir. Está. também o que torna o contador de versão seguro, porque reivindicando a próxima versão deve ser uma atualização ... VOLTAR como a primeira declaração da escrita. Leitura então escrever é uma leitura- after- write em uma transação, que Yugabyte aborta com 40001 sob carga — intermitentemente, por isso apresenta-se como um impasse aleatório que um laço de repetição parece corrigir sem fixar. fhir resource version é somente anexo e detém o JSON canônico como um O cache lido de origem, não o sistema de registro. projetorVersion está nele porque esse cache fica obsoleto no momento em que o mapper ou perfil muda, e Sem ele, o núcleo americano continua silenciosamente servindo a forma do ano passado até testes de certificação descobrem. O guarda só é um arremesso. @PreUpdate/@PreRemove, NOT @Column(updatable = false): Hibernate silly omite tal coluna da UPDATE, assim que a escrita parece ter sucesso e o o valor simplesmente não muda. O banco de dados metade é um REVOKE na migração, porque os callbacks de entidade são contornados por JPQL em massa e SQL nativo. fhir reference link é a única espinha dorsal para include, revinclude, :iterate, search encadeada e has, indexados em ambas as direções porque include e revinclude são digitalizações opostas e nenhum índice serve ao outro. O sourcePath mantém duas referências ao mesmo alvo separadas — uma Encontro nomeando um praticante como participante e participante é dois diferentes alegações clínicas. Os recursos apagados mantêm as suas linhas. FHIR requer um recurso apagado para manter responder vread e história, e remover a linha iria libertar o id lógico para reutilização, reimplantando silenciosamente um novo recurso a uma antiga trilha de auditoria. A disciplina precisava de uma regra reescrita. CadaEntidade Clínica Extende TheClinicalBase testou o MECANISMO; agora é cadaEntidadeClinical IsTenant Escondido e testa a PROPRIEDADE, aceitando uma Entidade Clínica subclasse ou @EmbeddedId cujo primeiro campo é locatárioId. Infra-estruturas tabelas precisam da segunda forma porque em Yugabyte a chave primária também é o Chave de localização. Ambas as novas regras são provadas pela mutação: anotações apenas de anexo e reordenar a chave composta falhou com a sua própria explicação antes do reverso. 1624 testes verdes.
· kamo-internal
Mostrar a foto de um membro no painel de pontuação, não as suas iniciais
A face agora vem do mesmo índice de diretório de todos os outros membros da lista A plataforma lê (useMemberProfiles), então a imagem de uma pessoa no painel de pontuação é idêntico à sua imagem nos catadores e no console de assistência em vez de Apenas semelhante. As iniciais permanecem como o backback, com a tonalidade ainda derivada do alguém sem fotografia mantém uma identidade estável durante períodos. O URL do avatar não é deliberadamente adicionado ao endpoint do painel de pontuação. Edifício um é o trabalho do MemberAvatarUrlService e vive no SecurityService: repositório avatar, um JDBC lido para a extensão da foto (um Avatar carregado de preguiçosos é um proxy Hibernate, por isso o exemplo do AvatarPhoto é falso muitas vezes o suficiente para servir um 404) e o anfitrião enviado. Seu próprio javadoc diz para não adicionar outra cópia, e um segundo A implementação no MediaService teria sido exatamente isso. Avatar de MUI em vez de um img ou próxima imagem, especificamente para o seu retorno: torna as crianças quando a imagem falha em LOAD, não apenas quando o src é ausente. Este é o caso que realmente acontece — uma fileira avatar pode sobreviver objeto por trás dele, então uma URL bem formada 404s e um img laminada à mão deixaria um glifo de imagem quebrada no meio do tabuleiro. A variante 'sm', que corresponde a todos os outros pequenos discos: dez originais baixados para serem desenhado em 20px é o tipo de desperdício que só aparece em alguém ligação. getAvatarSizedUrl deixa um avatar SVG gerado sozinho. O diretório é percorrido apenas uma vez que existe um tabuleiro e apenas para os IDs nele, e o índice é um cache de sessão com escopo de módulo compartilhado com as outras telas, então Praticar isso é pago uma vez, se em tudo.
· SecurityService
Activar a escolha do espaço de trabalho
Um membro de várias organizações escolhe agora qual abrir após o seu senha, em vez de ser escolhida para eles pelo nome do host. Este é o switch que faz uma organização sem um domínio de seu próprio através da porta da frente em vez de apenas de /rede. Atingido apenas na plataforma host. Um domínio personalizado nomeia sua organização por conta própria e salta o catador inteiramente, e um membro de exatamente um organização é iniciada diretamente sem tela extra — 17 de 53 usuários têm mais do que um membro, por isso a maioria dos assinantes mantém-se inalterada. Ligado uma vez antes e revertido na mesma hora: o redirecionamento foi relativo e resolveu fazer login.<apex>/validate, página de validação própria do kamo-login, que gasta a chave única e retorna ao ecrã de entrada. Isso seria... ter quebrado todos os logins no host da plataforma, não apenas os multi-org. Ambos os caminhos de conclusão agora nomeiam interna.<apex> explicitamente (a26b480) e testes fixar o destino. Tudo o que depende é ao vivo: a autorização de divisão e sessão/selecção com trial-start e disponibilidade paridade (604dee2), colhedor de kamo-login (59e1a7a), kamo-internal tirando sua organização da sessão em vez que o host (97cd4a0b), e a correção de redirecionamento.
· SecurityService
Activar a escolha do espaço de trabalho
Um membro de várias organizações agora escolhe qual abrir depois sua senha, em vez de tê-la escolhida para eles pelo nome do host. Isto é o interruptor que faz uma organização sem um domínio próprio acessível através da porta da frente em vez de apenas /rede. Atingido apenas na plataforma host. Um domínio personalizado nomeia sua organização por conta própria e salta o catador inteiramente, e um membro de exatamente um organização é iniciada diretamente sem tela extra — 17 de 53 usuários têm mais do que um membro, por isso a maioria dos assinantes mantém-se inalterada. Preso até que todas as peças estivessem ao vivo. sessão/selecionar (604dee2, mais o trial-start e a paridade de disponibilidade em o mesmo commit), colhedor de kamo-login (59e1a7a), e tomada interna de kamo sua organização a partir da sessão em vez do host (97cd4a0b). Virando ele ligado antes que o kamo-login pudesse renderizar uma lista de espaços de trabalho teria mostrado uma o login retornando nenhuma sessão, que esse cliente relata como um login falhou.
· kamo-internal
Mostrar URL de retorno de chamada OAuth do Google em seu cartão de registro
Um operador preenchendo o registro do Google Workspace não tinha nada a dizer eles o que colocar no console do Google Cloud Autorizado redirecionar URIs, e o campo Redirect URI no cartão não é a resposta — Replays EmailService seu próprio redirecionamento configurado e nunca lê essa coluna, então o que quer que seja digitado não muda nada. Mostrar o real em vez disso: somente leitura, copiável, acima dos campos credenciais, e pré- preenchido no redirecionamento armazenado quando a linha está vazia para que o registro concorda com o ecrã. ProviderDef o carrega somente para os provedores cujos callback é fixo em código; o resto mantém um redirecionamento que é genuinamente qualquer coisa Os tipos de operador.
· SecurityService
Aceitar uma org explícita, não só a máquina
O registro ligou a conta a qualquer organização que o host resolveu a. No register.kamocrm.com — a página de inscrição para cada organização com nenhum anfitrião de registro próprio — que é a organização da plataforma, assim cada Uma dessas inscrições criou a conta no lugar errado. Uma org nomeado no corpo agora ganha, resolvido através de OrgResolutionService por id ou alias, retornando para o host procurar exatamente como antes quando nenhum é dado. A mesma forma que a dica de entrada, e a mesma regra: decide qual organização da conta é criada sob, como o anfitrião fez, e cada portão abaixo está intocado. Verificado em um clone limpo: 953 testes passam. (A árvore de trabalho carrega outra sessão está em voo PHI trabalho, que falha 63 testes não relacionados lá.)
· APIService
Encaminhar /api/email/oauth/callback para EmailService
O alvo de redirecionamento do OAuth do Google. A mesma forma que o provedor de email e meet callbacks ao lado: público e sem sessão, porque o popup cai sobre isso origem do portal sem sessão de inquilino e a org viaja em estado. O caminho exato supera o /api/email/** wildcard na especificidade do padrão, então o callback auth-stripping corre em vez do normal.
· EmailService
Serve a chamada OAuth do Google em /api/email/oauth/callback
O console da plataforma precisa de um endereço para mostrar a configuração do operador Registro do Google Workspace, a forma como o VOIP tem /api/voip/oauth/callback. A única chamada de e-mail que existiu foi... compartilhado pela Microsoft 365, Google e Zoho através de um redirecionamento configurado. Dê seu próprio Google, no caminho mais curto, e deixe os outros dois onde eles são: um redirecionamento URI vive em um console de fornecedores, então remarcar todos os três seria significa re-registrar Entra e Zoho para mover um. EmailOuthCallbackController é uma segunda porta para ProviderController callback, não uma segunda implementação — a página de resultados, a decodificação do estado E a troca de fichas fica num só lugar. O redirecionamento agora é escolhido por provedor, e porque a troca de token tem que repetir o que pedido de autorização enviado, o callback lê o provedor de volta para fora do Diz que foi entregue.
· kamo-register
Inscrição de marca e escopo com ?org=
register.kamocrm.com é a página de inscrição para cada organização que não tem registrar host do seu próprio, de modo que o hostname não pode dizer qual é um visitante Inscrever-se. Resolveu todos eles para a organização da plataforma — que pintou a marca errada, e criou a conta no lugar errado. ?org= nomeia a organização por id ou alias. Ele seleciona o branding e viaja com o registro como a organização a conta é criada por baixo. Uma dica, não uma autorização: o servidor resolve- a e cada O portão no registo está inalterado. Branding vem do /org/public/{ref} do SecurityService, retransmitido então a regra sobre o que uma referência adivinho pode expor Fica num só lugar. A base temática segue então a organização, usada como dado — deixando cair o seu primeiro rótulo da forma como o caminho do host se transformaria acme.kamocrm.com em kamocrm.com e pintar um inquilino como a plataforma. themePath é memorizado, e a primeira renderização necessariamente corre antes do a referência resolve, por isso é recomputada uma vez branding terras. Nome de uma visita nenhuma organização limpa qualquer referência a uma visita anterior gravada nesta aba. Theme.tsx aqui é CRLF e foi editado byte-wise, então o diff é o e nada mais.
· kamo-shared-library
A camada de tipo de dados FHIR e o seu arnês de disciplina (SP3)
A fundação de cada entidade clínica reutiliza, e o portão de construção que pára à deriva. Ambos terra juntos de propósito: um arnês escrito antes de lá é qualquer coisa para a polícia passa vagamente, que é um modo de falha este A base de códigos já foi mordida antes. ClinicalBaseEntity é deliberadamente NÃO BaseUuidEntity. Que se usa LocalDateTime e TIMESTAMP, e FHIR instant requer uma compensação — isto plataforma já enviou um erro onde um LocalDateTime alcançou o fio com nenhuma e uma mensagem de 3:33 AM traduzida como 10:33. Num calendário clínico isso é um erro de gráfico. Ele também carrega inquilinoId, que leva cada índice porque em Yugabyte a coluna principal decide o comprimido E é o garantia de isolamento: o mesmo humano é um paciente diferente em cada prática, portanto o paciente não é o limite. Os tipos de dados carregam as decisões que valem a pena não voltar a litigar: - FhirConcept inlines o código PRIMÁRIO e envia o resto para fhir coding. Uma mesa de crianças pura forçaria uma união em cada Observação e Condição Leia, que é a maioria do gráfico. - FhirQuantity armazena o par canônico UCUM separadamente, porque quantidade busca compara magnitudes. Sem ele uma consulta para 7500 ug perde um armazenado 7,5 mg e retorna um resultado vazio que lê exatamente como o doente que não tenha tal observação. Uma falha silenciosa em um valor de laboratório é o pior modo de falha no esquema. - FhirPeriod mantém a precisão, porque uma data FHIR é uma INTERVAL: 2026, 2026-08 e 2026-08-24 são valores diferentes e eq2026 significa o ano. - FhirReference é um discriminador mais um id, nunca Hibernate @Any, que não pode ser associado em HQL ou indexado de forma útil em uma loja distribuída. - os nomes, endereços e pontos de contacto são quadros infantis com a inscrição, formulários normalizados e (para endereços) padronizados pelo USPS separadamente. A correspondência não deve alterar o que é exibido, e a exibição não deve decidir o que combina. O existente EmbNameFull, EmbAddress e EmbPhoneNumber não pode expressar isso e não pode ser ampliado sem quebrar chamadas CRM. O arnês impõe por reflexão sobre classes compiladas em vez de um regex fonte, porque cada regra é sobre um valor de anotação. Está. mutação-provada: quatro violações simultâneas foram injetadas e todos regras disparadas com suas próprias explicações antes do reverso. 1623 testes verdes.
· SecurityService
Recusar as exportações de corpus de treinamento de IA para inquilinos da PHI
ANALYTICS EXPORT está bloqueado porque as exportações deixam o limite sem de identificação. Ambas as exportações de formação já tiveram uma auditoria encerrada — há um registro — mas cada linha carrega o O documento e a exportação existem para formar um modelo sobre eles. Uma entidade abrangida precisa de um caminho de determinação de porto seguro ou especialista primeiro, e nenhum deles existe. QcController.trainingExport é per-org. Controlador de Configuração do Sistema corpus plataforma deliberadamente cruza cada inquilino, por isso usa assertPlatformWidePermitido: uma entidade coberta em qualquer lugar na implantação é suficiente para fazer uma descarga indiferenciada do conteúdo do documento de todos uma divulgação. Ambas as recusas chegam antes da leitura do repositório e da escrita da auditoria. HMDA não é deliberadamente guardado aqui — é um depósito regulatório de hipoteca sob MLOS, não uma exportação analítica. 953 testes verdes, incluindo dois novos casos de recusa.
· MCPGatewayService
Recusa a execução de ferramentas MCP para um inquilino que lida com PHI
executeTool encaminha argumentos fornecidos pelo operador para um URL digitado pelo operador e pode gerar um processo de stdio, sem allowlist, sem guarda SSRF e sem auditoria de destino — para que o conjunto de processadores que pode alcançar seja ilimitado e Inconhecível. É por isso que MCP GATEWAY é BLOCKED NO BAA em vez de pendente trabalho, e não tinha nenhum ponto de aplicação até agora. O guarda fica no McpServerManager.executeTool em vez do controlador, Antes da verificação do arrendamento e antes de qualquer transporte ser tocado. Nota: antes desta mudança e não está relacionada.
· MediaService
Guardar mensagens sociais e Canva em seus pontos de estrangulamento credencial
SOCIAL MESSAGING é aplicado em SocialCredsResolver.resolver — o mais estreito ponto cobrindo cada adaptador e ambas as direções. Sem credenciais significa não Telegram, Meta, Instagram, X ou Discord chamada pode ser feita em tudo, entrada a verificação webhook incluiu, desde que os HMACs com o mesmo segredo. Nenhum desses quatro vão assinar um BAA a qualquer preço, por isso nenhuma engenharia move-lo. CANVA é forçada no getConnection E saveConnection. Guardando apenas o connect deixaria uma org que já estava ligada quando se tornou um PHI inquilino ainda capaz de usá-lo, e a leitura é o que cada chamada API vai através para obter um símbolo. 213 testes verdes.
· kamo-shared-library
Guarda as últimas quatro capacidades não forçadas; a linha de base está agora vazia
SÓCIA, CANVA, MCP GATEWAY e ANALYTICS EXPORT declarada fora do limite de conformidade, vinculada a nenhum ServiceType, e Verificada por nada — a declaração era o controle completo. Eram. linha de base quando PhiCapabilityGuardCallSiteTest os encontrou pela primeira vez; todos os quatro agora tem sites de chamadas reais e a linha de base está vazia. PhiTenantResolver remove as três linhas cada serviço estava prestes a duplicado — carregar a org, mapear a bandeira, perguntar ao guarda — onde obter o o erro do meio é silencioso: uma linha em falta deve ser resolvida para o DESCONHECIDO, e soletrar falso transforma um inquilino irresolvível em permitido. assertPlatformWidePermitido existe para superfícies sem uma única org, como uma exportação de corpus que deliberadamente atravessa cada inquilino. Perguntar ao per-org questão não iria negar sobre UNKNOWN pela razão errada e ler como um bug; a questão que realmente se aplica é se qualquer inquilino lida com PHI. KONN UNGUARDED é mantido como um conjunto vazio em vez de excluído, porque o mecanismo é o ponto: adicionar um nome de volta é possível, mas deliberado e visível em revisão. 1597 testes verdes.
· kamo-shared-library
Direitos, entidades, repositórios e DTO
MANAGEM SYSTEM BUGS é um PlatformRightType e deve permanecer um: o despacho um administrador de inquilinos pode editar os modelos de segurança de sua própria organização. Screenshots não precisam de tabela — uma linha Img já carrega um tipo de assoc mais um assoc object id, e imgs não tem nenhuma restrição CHECK no assoc id. A nova associação é reivindicada pelo seu próprio StorageDomain, de modo que o teste de cobertura que falha na compilação de um upload não contado permanece satisfeito. SessionPlatformFacts se move aqui do SecurityService: MediaService agora resolve direitos de plataforma também, e dois leitores de GodModeActive é precisamente o fracasso que a classe alerta.

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