Salta al contenuto
KAMOUniverse

Changelog

Cosa c'è di nuovo.

Ogni miglioramento alla piattaforma, come si spedisce.

  1. · 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.

  2. · SecurityService

    Rilevamento e allerta del percorso di audit di accesso record

    phi access log ha accumulato prove che nessuno guarda. Questo soddisfa §164.312(b) — il sentiero esiste — e non soddisfa nulla circa §164.308(a)(1)(iii)(D), che chiede la revisione, o §164.400-414, il cui orologio non può iniziare finché qualcuno non se ne accorge. Questa è la cosa che nota. Cinque rivelatori nell'ora chiusa, per attore: BULK EXPORT 250 documenti distinti esportati/downloaded/dischiusi MASS READ 200 record distinti letti REPEATED DENIALS 10 tentativi rifiutati (eventi — un rifiuto no record) UFFICIO 20 record distinti al di fuori della settimana del TENANT PLATFORM STAFF ACCESS 1 — un'entità coperta è detto indipendentemente dalla giustificazione I conti sono record DISTINCT, non eventi: PhiAccessAuditor emette una riga LIST per riga di rete, quindi un membro ricaricare la stessa pagina quaranta volte è 2.000 eventi e 50 individui — e "come molti individui" è il numero di una violazione la valutazione è fatta di. Rationale per ogni default è su PhiDetectionSettings; tutti sono configurabili, perché un rivelatore che spara costantemente viene disattivato e un rilevatore muto legge ancora come copertura. L'orario di apertura è valutato nella zona dell'inquilino tramite il suo OFF HOURS ACCESS esistente regola (ore di affari la schermata di sicurezza già raccoglie) cadendo indietro a Organizzazione.timezone. si è verificato at è UTC, quindi un controllo associato UTC sarebbe pagina un inquilino di Sydney ogni mattina di lavoro e non ha mai fatto una pagina a New York. Riutilizza la consegna ciò che esiste: EmailTemplateServiceClient -> EmailService /api/email/templates/send con la nuova chiave canonica PHI ACCESS ALERT, alla indirizza l'org già registrato in org suspicious detection rules .notification emails. Un inquilino che non ha configurato nessuno ottiene il registro di revisione e nient'altro — spedire un indirizzo indovinato rivelerebbe che un nome il membro della forza lavoro è sospettato. Ogni risultato è collegato a un dedicato PHI-DETECTION logger; solo la notifica viene accelerata (6h per rilevatore/tenant/ attore, nel Redis le regole login-anomaly già utilizzare). Porta avvisi identificatori e conti, mai un record. Due scelte strutturali deliberate: - Gli aggregati attraversano un EntityManager, non Spring Data @Query. Primavera I dati convalidano una query dichiarata creandola a repository bootstrap, quindi un errore là fallisce l'avvio del contesto — e un SecurityService che non start prende ogni login con esso, come il 2026-08-03. Qui il caso peggiore è un spazzare i registri e le ripetizioni l'ora prossima. Rimuove anche questo pacchetto dal @EnableJpaRepositories domanda del tutto: nessun fagiolo del repository, nulla Dimentica. PhiDetectionQueryTest controlla ogni percorso di proprietà riflettente da allora nessun test in questo servizio può avviare un contesto. - Ogni query è ostacolata dall'organizzazione. solo phi access log indice utilizzabile è (ORGANIZATION ID, OCCURRED AT); filtraggio in tempo da solo full-scans un solo tavolo che cresce sempre. Scheduling: questo unisce compitoScheduler (4 fili, sched-), che sette spazza già condividere. Non tocca traduzioneEsecutore — il 3-thread/500-queue @Async piscina osservata saturato — e si presenta a nessun esecutore affatto. Orecchio, 5 aggregati raggruppati per lotto di inquilino, nessuna rete I/O all'interno della scansione, e un latch reentrancy in modo da una corsa lenta salta la prossima zecca piuttosto che impilare dietro di esso e starving la piscina che condivide. Nessuna entità o colonna è stata aggiunta o modificata.

  3. · EmailService

    Variabili di anteprima per PHI ACCESS ALERT

    Senza un campioneVariables braccio l'anteprima dei modelli di posta elettronica di amministrazione rende ogni segnaposto vuoto, così chiunque è chiesto di approvare la formulazione di una sicurezza l'avviso vede un tavolo vuoto. I modelli di esempio identificano e conta solo — la stessa forma porta la vera allerta, perché la vera allerta non porta mai record.

  4. · kamo-shared-library

    PHI ACCESS ALERT modello canonico

    La revisione oraria di SecurityService di phi access log ha bisogno da qualche parte di inviare quello che trova. Piuttosto che inventare un canale utilizza l'esistente transal-email rail, che significa una chiave canonica: assente da CANONICAL KEYS un modello non può mai essere seme, mai self-heals, e ogni inviare restituisce un permanente 404 — un controllo di avviso che sembra copertura e non consegna nulla. Il modello porta solo identificatori, conteggi e una finestra temporale. Un rilevamento artefatto che riproduce quello che ha rilevato ha trasferito il PHI in una casella di posta con nessuna politica di conservazione, quindi non c'è volutamente alcun segnaposto per un record. PhiAccessAlertTemplateTest perni che, e perni i due fallimenti silenziosi modalità: un segnaposto nulla fornisce rende come una stringa vuota con solo una AVVERTENZA, e il rendering non evade HTML, quindi qualsiasi cosa che raggiunga il corpo usa il gemello scappato. EmailService deve ridistribuirsi con questo condiviso-lib prima che SecurityService inizi invio; fino ad allora l'invio viene catturato e il risultato rimane solo recensione-log.

  5. · kamo-internal

    Specchio la maschera minima necessaria al piombo sul client (§164.502(b))

    Sicurezza Servizio ora tiene le risposte su misura da un chiamante che non è il assegnatore di piombo (e, in un manicoPhi inquilino, anche da un titolare di destra 161). Quella maschera e' l'applicazione, non e' cosi'. Due sentieri ancora lo bypassano: - LeadRealtimePublisher mette un LeadDTO FULL, smascherato security.leads.rt.{orgId} — one payload fanted out a ogni abbonato nel org, senza proiezione per-recipiente possibile. Fino a quel evento identifica solo e il client refetches, app/lib/leads/leadFieldMask.ts è l'unica cosa tra le risposte di un collega e ogni pannello di piombo aperto nell'inquilino. LeadViewClient ora funziona in arrivo carichi di pagamento in tempo reale attraverso di esso prima che qualcuno di esso raggiunga lo stato. - Rendering: una forma trattenuta e un arrivo mai riempito identico, quindi la decisione deve essere ricomposta, non rinviata. La forma personalizzata riquadro gocce la sua convenienza Modifica quando le risposte sono limitate, salvando un vuoto form sarebbe PUT {} sopra le risposte reali, che il server ora 403s comunque. Organizzazione.handlesPhi viene consegnato sulla colonna esistente -> DTO - > OrgContext percorso (l'entità org già lo serializza; lo schema zod e Organization.fromJSON consent-list erano i collegamenti mancanti), non un secondo canale. Nessuna nuova copia visibile dall'utente: l'etichetta esplicativa "restricted" ha bisogno di una chiave repo traduzione-dizionario ed è volutamente lasciato per quel cambiamento.

  6. · SecurityService

    Mascheramento minimo necessario delle risposte di piombo su misura (§164.502(b))

    L'unica maschera da campo della piattaforma era... di LeadController.getLeadById a un chiamante che non è né dio né l'assegno e manca VIEW LEAD CONTACT INFO OTHERS (161). Copre e-mail, telefoni, data di nascita e le parti di strada degli indirizzi mailing/property — e nient'altro. personalizzatoFormData rode direttamente attraverso di esso, che è l'unico posto sulla piattaforma un inquilino sanitario in realtà mettere domande di assunzione e sintomo. LeadFieldMask ora possiede la decisione e la proiezione: - qualsiasi org: risposte su misura con la maschera di contatto. Se non riesci a vedere l'e-mail del piombo potrebbe non vedere che cosa ha risposto. - manigliePhi inquilini: le risposte sono trattenute da chiunque il piombo non è assegnato perfino con destra 161. Tale diritto è finalizzato, per suo nome, al contatto informazioni; una risposta sintomo non è informazioni di contatto. Il titolo della forma va troppo — "Diabetes Intake Questionnaire" rivela la condizione da solo. L'ingresso della forma sopravvive mascherando solo il suo id, così l'UI può dire "restricted" piuttosto che disegnare un questionario vuoto. Un org che non si carica è trattato come PHI-handling, corrispondente a PhiTenantStatus UNKNOWN-denies postura. PUT /leads/{id} guadagna il cancello di scrittura simmetrico. L'editor del modulo PUTs l'intero fieldValues map, quindi senza di esso un membro ha mostrato un questionario vuoto che ha premuto Salva avrebbe sostituito le risposte reali con {} — la maschera di lettura avrebbe diventare un'eliminazione silenziosa. Utilità statica, nessun stereotipo e nessun repository: la decisione è pura e chiamante detiene già l'org.

  7. · kamo-internal

    PHI access audit viewer — org revisione e contabilità per record

    Il sentiero era scritto e niente poteva leggerlo. Questa è la metà dello schermo: una recensione di accesso a livello org sotto Impostazioni → Sicurezza, e un "che ha accesso a questo registro" dialogo aperto dal piombo stesso, che è la forma un §164.528 richiesta di contabilità effettivamente arriva in — un individuo che chiede circa il loro file, non qualcuno con il tempo per filtrare un registro globale. Tre cose qui non sono cosmetiche. I timestamp sono assoluti e chiamano sempre la zona in cui sono stati resi, con un commutatore di un clic a UTC. Questa prova è letta mesi dopo da qualcuno che è stato non presente; una parete nuda-clock letto da un'altra zona silenziosamente misplaces un accesso per ore, che è la differenza tra "durante il turno" e "a 3am". I tempi relativi sono esclusi fuori diritto — essi si allontanano ogni volta che la pagina è aperta. I tentativi negati e l'accesso alla piattaforma sono contrassegnati sulla riga (tinta, regola sinistra, icona principale) piuttosto che lasciare in una colonna gli occhi salta, perché una conformità ufficiale esegue la scansione di centinaia di righe per quello che non dovrebbe essere lì. Ordinario le letture sono deliberatamente semplici: decorare tutto è lo stesso di decorazione Niente. Denied outranks piattaforma-staff quando una fila è entrambi — Kamo personale essendo rifiutato è la linea più interessante che lo schermo può mostrare. L'esportazione è gated su EXPORT ACCESS LOGS separatamente dalla vista destra, e un 503 dall'alto è superficiale come "niente è stato rivelato" piuttosto che lisciato in un errore generico. L'ESPORT è un tipo di audit non chiuso: il rifiuto significa la divulgazione non può essere registrata, che è un esito corretto il funzionario ha bisogno per vedere. Edificio di query, formattazione di timestamp e classificazione di riga live in app/lib vitest può raggiungerli; i componenti sono montaggio. Un 403 non arriva mai una griglia vuota — "nessuno ha mai toccato questo record" è il più pericoloso sbagliato rispondere a questa schermata può dare.

  8. · kamo-internal

    Ritirare la pagina del membro al profilo, abbreviare le etichette della scheda, aggiungere le icone della scheda

    L'intestazione della pagina delle impostazioni dei membri diventa "My {memberLabel} Profile" (o "{memberLabel} Profile" per un altro membro) e il collegamento nav-top diventa Il mio profilo. Tab etichette accorciare — Mailbox(s), Telefono, Audio & Video, Permessi, attività — mentre il telefono e i ruoli aiutanoLe punte tengono il loro Intestazioni descrittive tramite nuove... chiavi. Ogni scheda ora porta un'icona nella barra delle schede; scheda query-param ids sono invariati così profondi collegamenti continuano a funzionare.

  9. · kamo-internal

    Scivolo tono — imbiancato a colore pieno per oscurare

    A per-membro di fondoTone ui-preference (0 bianco / 50 colore pieno / 100 nero) reso come un lavaggio sopra lo scrim di leggibilità in entrambe le console strato di presentazione e la fase WYSIWYG dell'editor. Slider vive nel palco media cromo con anteprima di trascinamento dal vivo, centro snap, e persist-on-release.

  10. · kamo-internal

    Le carte del lanciatore e l'eroe usano il colore del marchio dell'org invece di accenti per-moduli

    Le carte d'opzione del launchpad di casa, trascinare overlay e eroe di primo-org ora prendere il loro accento da var (--color-primary) (il org è dinamicamente impostato colore tema) piuttosto che la mappa fissa multicolore --accent-* della famiglia.

  11. · kamo-internal

    Modalità dio di rottura — prompt dei motivi, conto alla rovescia, indicatore in piedi

    La modalità di Dio non aveva affatto UI in kamo-internal: un booleano localeStorage che un monte effetto specchiato in ***, ri-assettato su ogni nuova scheda per sempre. Questo ha fatto browser l'autorità su se il personale della piattaforma è stato elevato, e ha fatto elevazione qualcosa in cui potresti essere senza mai decidere di essere. - GodModeJustificationDialog richiede per il motivo BEFORE elevazione. Un motivo raccolto in seguito è un motivo scritto per adattare quello che era già fatto. La copia afferma chiaramente che cosa l'operatore sta per vedere e che il loro nome va su di esso. - GodModeIndicator è una barra inferiore full-width più una cornice rossa intorno a tutto viewport, con un conto alla rovescia dal vivo e "End now". Qualcuno che dimentica di essere dentro la modalità dio è lo scenario esatto che il controllo esiste per prevenire, quindi non è un distintivo sottile — ma è puntatore-eventi: niente al di fuori del bar e si siede fuori flusso di layout, quindi non intercetta mai un clic o riflusso uno schermo. - Entrambi sono montati una volta nel layout radice, accanto a AutomaticLogoff, quindi il indicatore è presente ovunque l'operatore finisca piuttosto che sugli schermi Qualcuno si ricordava. Renders niente a meno che la sessione non sia Dio-ELIGIBILE. - Il server possiede lo stato. app/lib/godMode detiene un unico negozio a carbone; cliente legge solo la scadenza SecurityService timbrato e non può mai estendere esso. setIsGodMode è andato — l'elevazione prende una giustificazione, quindi non può essere un Setter. - Il sondaggio di stato raddoppia come il resistente chiaro: GET /session/god-mode è dove SecurityService scrive un'elevazione trascurata da Redis per i servizi che leggere la sessione direttamente. usePlatformAdminGuard ora aspetta lo stato del dio per le sessioni idonee. Accesso usato per essere leggibile sincronia da localStorage; senza aspettare operatore con una finestra aperta sarebbe rimbalzato a /settings nel gap. Lo stress e' dentro. (prima schiacciata, per l'ordine clone della costruzione). npx vitest run: 329 passati (32 file), 17 di loro nuovi. npx tsc --noEmit: pulito.

  12. · SecurityService

    Leggi il percorso di accesso PHI — §164.528 revisione contabile e attività

    Il sentiero è stato scritto per un po 'e nulla poteva leggerlo, che ha lasciato due obblighi non soddisfatti: una contabilità di divulgazione per il record di un individuo (§164.528) e la revisione periodica delle attività del sistema informativo (§164.308(a)(1)(ii)(D)). Entrambi sono domande. Questo aggiunge la superficie di query. L'autorizzazione è la funzione, non la griglia. L'organizzazione è presa da sessione e da nessun altro posto — non c'è volutamente nessun parametro orgId su qualsiasi handler, e PhiAuditQueryService è un unico punto di punta che aggiunge l'inquilino predicare prima che consulta anche il filtro. Quattro metodi di query fratelli sono state quattro possibilità di dimenticarlo. Scoping è una clausola WHERE piuttosto che una post-filtro, perché filtrare una pagina restituita lascerebbe totaleElementi contare le righe che il chiamante potrebbe non vedere. Il lato letto ottiene la propria interfaccia di repository. PhiAccessLogRepository condiviso i ricercatori sono deliberatamente cross-tenant — corretto per uno strumento di piattaforma, una divulgazione se consegnato a uno schermo del cliente — così lo schermo ottiene un'interfaccia il cui unico ingresso il punto richiede una specifica. Vive sotto Com.kamo. Servizio di sicurezza, che esistente @EnableJpaRepositories voce già copre, quindi non è necessario alcun cambiamento di scansione e nessuno può essere dimenticato. I diritti sono VIEW ACCESS LOGS (29) e EXPORT ACCESS LOGS (32) — la coppia che già cancelli il registro di autenticazione, così chiunque amministra la sicurezza oggi può usare questo il primo giorno. Un nuovo id destro avrebbe spedito lo schermo morto: ha bisogno di un'esecuzione di KamoInitializer e una sovvenzione prima che un membro ne detiene uno. La lettura del sentiero è stessa registrata, come RELAZIONE/SEARCH per una lettura e RELAZIONE/EXPORT per una copia, compresi i tentativi rifiutati. I criteri di ricerca sono non registrato — un filtro trasporta ids membri e record, e un percorso che memorizza ciò che è stato cercato accumula gli identificatori che esiste per proteggere. Tutto è limitato: dimensioni pagina morsetti a 200, un tappo di esportazione a 10.000 righe. Un percorso di sei anni è milioni di righe e lo strato di cattura scrive una riga per riga di griglia per carico, quindi una dimensione unclamata è un OOM raggiungibile piuttosto che un teorico. I timestamp partono come istanti UTC espliciti. La colonna è a parete senza zona, e questa prova viene letta mesi dopo da qualcuno che non c'era.

  13. · kamo-internal

    Schermo di registrazione MFA e il controllo del limite dio-mode PHI

    Due impostazioni di superfici per backend che non avevano. Iscrizioni MFA (impostazioni → mio profilo → Sign-in Sicurezza, auto solo). Gli endpoint /api/security/mfa di SecurityService sono stati completi e interamente irraggiungibile, così MFA esisteva e nessuno sulla piattaforma potrebbe accenderlo. The scheda è auto-solo perché questi endpoint risolvono l'utente dal proprio chiamante sessione e non prendere nessun parametro utente — un amministratore che apre il profilo di qualcun altro sarebbe iscrivere il proprio autenticatore su quello schermo. Il codice QR utilizza qrcode.react, già una dipendenza; nessun pacchetto è stato aggiunto. The segreto è mostrato accanto a esso indipendentemente, perché un'applicazione autenticatore sulla stessa dispositivo in quanto il browser non può scansionare lo schermo che sta coprendo. Due percorsi di guasto ottengono una gestione di prima classe piuttosto che un errore generico. A 409 significa un fattore confermato già esiste e lo dice, con il rimedio (un reset dell'amministratore) — dicendo all'utente di riprovare li rispedirebbe indietro nel un'azione che non può avere successo. Un codice di conferma sbagliato mantiene in sospeso iscrizione: il segreto viene visualizzato una volta, quindi scartare significa cancellare l'ingresso dell'autenticazione e la riscatta, e l'iscrizione in attesa del server sarebbe ancora lì, così il retry sarebbe tornato 409 e li infilare. I codici di recupero sono visualizzati una volta e non possono essere ristampati. Il dialogo non può essere respinto per fuga, sfondo o un pulsante vicino; Fatto sblocca solo dopo il i codici sono stati copiati o scaricati E l'avviso riconosciuto. Entrambi richiesto: una casella di controllo da solo è cliccato in modo riflessivo, e un solo appunti è sovrascritto dalla copia successiva — e nulla sembra sbagliato fino al giorno in cui l'utente perde il telefono. Limite PHI (impostazioni → sicurezza → dati sanitari, solo dio-eleggibile). La scheda è visibile agli operatori divini e il controllo interno richiede la modalità dio effettivamente acceso, che SecurityService ricontrolla; l'ammissibilità da sola non è attivazione. Non gira mai senza prima elencare i moduli che smettere di lavorare — questa lista proviene dal server, derivato da PhiModule attraverso PhiTenantGuard, quindi non può derivare da ciò che è imposto. Un 503 è superficie come "il cambiamento non è stato applicato perché non poteva essere registrato", perché questo è quello che e' successo. La logica della decisione vive in app/lib/security così vitest può raggiungerla; i componenti tenere solo il rendering. Verificato: npx vitest run — 329 test, 32 file, tutti passando (43 di loro nuovi). ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** un file non tratto da un'altra sessione in questo albero, in nessuno dei file qui.

  14. · SecurityService

    Endpoint per leggere e spostare il confine HIPAA di un'organizzazione

    Organization.handlesPhi has existed as a column with no way to set it, so PhiTenantGuard has been enforcing a flag nobody could turn on. This is the missing half: GET/PUT /api/security/phi/tenant. Authority is god eligibility AND an active godModeActive toggle, never one. Eligibility alone is what left the platform's god gates dead until 2026-07-22; here it would let any god-eligible operator switch off a live tenant's modules with one unremarkable click. The target is always the caller's own session org — there is no organizationId parameter, so no crafted request can reach a tenant the caller is not already inside. phiEffectiveDate is stamped on first enable and never rewritten, including on a later disable/re-enable. It scopes the breach-assessment and retention windows, so moving it forward would quietly shrink the period under review, and an audit date the application can advance is not evidence. The audit row is written BEFORE the flag moves, and CONFIGURE fails closed, so a trail that cannot be written refuses the change and returns 503 rather than leaving a boundary that moved with no record of when. Denied attempts are recorded too. Every row carries identifiers and the transition only, never content. blockedModules is derived from PhiModule through PhiTenantGuard rather than listed, so the warning the UI shows cannot drift from what the guard enforces. No new repository package: OrganizationRepository is already in this service's @EnableJpaRepositories list, so there is nothing to add alongside this bean. Verified: 298 tests, 1 error — **************** EntityManager NPE, which is pre-existing (baseline at 7968a21: 281 tests, same 1 error). RepositoryScanCoverageTest and **************** both pass.

  15. · kamo-internal

    Ricostruire il modulo di citazione come flusso guidato, aggiungere un'anteprima di uscita

    La scheda dei dettagli era una pila piana di scatole delineate che ha dato a ogni campo lo stesso peso, quindi niente segnalato quali input effettivamente cambiare ciò che il cliente vede. Si'. Ora si legge come le quattro decisioni di cui è fatta una citazione — che cosa è per, che cosa è venduto, come è regolato, ciò che il cliente legge — ciascuno con una ragione di una linea conta, e la corsa totale si siede in una ferrovia appiccicosa piuttosto che sepolta in fondo. Il movimento porta significato piuttosto che la decorazione: le sezioni arrivano in sequenza, una campo condizionale si espande dal controllo che lo ha rivelato, l'area prezzi cross-fades quando la sua forma cambia, e un totale conta al suo nuovo valore in modo da un mistyped il prezzo unitario è notato invece di silenziosamente assorbito. Tutto questo rispetta Preferisce-ridotta-mozione. La nuova azione di anteprima rende il documento finito — carta, opzioni o tabella, totale, termini — e lo stampa da solo. Progetta lo stato dell'editore CURRENT, non il record salvato, perché il momento è necessario vedere il preventivo finito è durante la decisione per inviarlo. Il Branding proviene dalla risoluzione del server, quindi l'anteprima lettera è quello che il cliente ottiene, e l'opzione arithmetic viene importato da editor piuttosto che reimplementato.

  16. · kamo-shared-library

    Vocabolario di verifica per una modifica al limite di conformità stesso

    Aggiunge PhiResourceType.ORGANIZATION e PhiAccessKind.CONFIGURE in modo che la tornitura Organization.handlesPhi on o off può essere registrato come quello che è. Ogni tipo di risorsa esistente nomina il record di una persona. Filare un cambiamento del la postura di conformità dell'inquilino sotto uno di loro metterebbe una bugia nel §164.528 contabilità delle rivelazioni, e "quando questo inquilino è diventato un'entità coperta «Il resto del percorso è oggetto di discussione» — ha bisogno della sua forma di fila, non una presa in prestito. CONFIGURE non si chiude per un motivo diverso dai tipi di massa: niente è divulgato, così rifiutando costi l'operatore una riprovazione, mentre un limite che si è mosso senza registrazione di quando è lo stato una valutazione §164.402 non può ricostruire. Nessuna implicazione dello schema. phi access log.RESOURCE TYPE e ACCESS KIND sono semplici VARCHARs creato da PhiAccessLogTableMigration senza enum whitelist CHECK, quindi né costante ha bisogno di un KamoInitializer eseguito prima che possa essere inserito, e non entità o @Column è toccato. Verificato nessun interruttore esaustivo esiste in qualsiasi servizio.

  17. · SecurityService

    Servire la vista del cliente al personale per l'anteprima

    GET /{uid}/preview restituisce lo stesso PublicQuoteVisualizza il link di condivisione serve, dal stessa risoluzione QuotePresentation, quindi una lettera in anteprima non può differire da un inviato Uno. Non menta deliberatamente un token, contenga una vista o registri un evento — guardando al proprio progetto non è l'impegno del cliente, e lasciarlo nel percorso di attività renderebbe il banco di vista inutile come segnale.

  18. · ConversionService

    Scansione di upload per il malware ingest (§164.308(a)(5)(ii)(B)))

    La volta del documento accettava caricamenti arbitrari senza scansione malware ovunque sulla piattaforma, ed è multi-tenant — un file uno org uploads è aperto dagli utenti di un altro org attraverso lo spettatore, l'editor WOPI e il legante. ClamAV su INSTREAM, parlato direttamente a clamd (nessuna libreria client; la il protocollo è una presa e un prefisso di lunghezza). Il cancello corre ImagingUploadController su /upload e /templates/upload, prima del membro ricerca e prima di qualsiasi byte raggiungere MinIO — scansione dopo lo stoccaggio lascia il oggetto recuperabile per la larghezza della gara. Il comportamento non raggiungibile è FAIL OPEN per impostazione predefinita, e questa è una decisione piuttosto che un incidente. clamd non è ancora distribuito: questa è l'applicazione metà, e la distribuzione è un atto operativo separato (KlusterServices auto-applica su spinta e non è questo cambiamento di toccare). Spedizione non chiuso prendere documento caricare giù per ogni inquilino il momento in cui l'immagine rotola, con nessuna messa in scena in cui sarebbe stato catturato. Fail-open qui non è "nessuna protezione", è lo status quo degli ultimi anni, ora registrato ERROR ogni volta che succede. Ogni manopola, inclusa la chiusura a scomparsa, vive in kamowsconversion-config, quindi stringerlo una volta che il clamd è stabile è una configurazione modificare e riavviare, non un rilascio. Un interruttore limita il costo di uno scanner assente: dopo 3 consecutivi guasti la guardia smette di dialling per 60s, quindi i caricamenti non pagano ciascuno collegare timeout per un controllo che è effettivamente fuori. Sul rilevamento: 422 nominando la firma (non un 5xx — riprova non aiuterà), i byte sono conservati in un secchio di quarantena dedicato piuttosto che cadere, e il rifiuto viene registrato tramite PhiAccessRecorder. La riga di audit porta solo gli identificatori; il nome del file caricato rimane fuori di esso perché i nomi dei file qui regolarmente contengono i nomi dei mutuatari. PhiAccessKind non ha membri UPLOAD e aggiunge uno avrebbe alterato il vincolo di una colonna @Enumerated(STRING) nella condivisa biblioteca, così DOWNLOAD + consentite=false è utilizzato e la ragione è documentata il sito di chiamata. Inoltre passa il percorso PHI di questo servizio allo scrittore phi access log durevole. La voce corrispondente com.kamo.z.shared.phi.audit è nella stessa commit @EnableJpaRepositories elenco, e PhiAuditRepositoryScanTest non riesce la costruzione se i due sempre alla deriva — che l'accoppiamento è quello che ha preso ogni login giù il 2026-08-03. Retro-scan (POST) nel caveau, inquilino e inciampato. Rapporti e conserve, mai blocchi o cancella: fare un oggetto memorizzato ha bisogno di una quarantena perseverata flag, cioè una colonna in comune-libraria applicata da un inizializzatore a mano mentre servizio CI costruisce contro principale, e la cancellazione su un falso positivo distruggerebbe Il record di un inquilino senza recupero. Test: 36 nuovi. Preesistente. at or below 1080 ancora fallisce su un albero pulito; intatto. Non coperto, deliberatamente: RecordingIngestController (internal-auth Asterisk push) e il WOPI PutFile di DocsService sono i percorsi secondari che vogliono lo stesso gate, ma lo scanner vive in questo servizio e WOPI non ha un token attribuire una riga di audit a. Entrambi sono follow-up, non supervisione.

  19. · SecurityService

    Modalità dio di rottura — giustificazione + casella di tempo di 30 minuti

    La modalità di Dio si attiva silenziosamente e durò fino alla sessione. Questo è controllare la revisione di sicurezza di un'entità coperta spinge più difficile su, perché "la tua il personale può leggere i nostri dati del paziente" è sempre chiesto e un ingiustificato, non legato Elevazione non ha risposta. - POST /api/security/session/god-mode richiede ora una giustificazione digitata Alzati. Stepping DOWN non fa mai — un controllo che porta l'azione sicura è un controllo che mantiene gli operatori elevati. - Entrambi i bordi sono registrati attraverso PhiAccessRecorder con la giustificazione e piattaformaStaff(true). Identificazione solo; la giustificazione è propria dell'operatore parole sul perché, mai nulla hanno continuato a leggere. - La finestra è di 30 minuti e NON-SLIDING. La scadenza è un istante assoluto il corpo di sessione, non un TTL, quindi la sessione di scorrimento rinfresca non può estenderlo, e riassettare da una seconda scheda restituisce la scadenza originale piuttosto che comprare un'altra finestra. - KSessionService.getSession maschera una bandiera interrotta, quindi tutti ~10 esistenti `session.get("godModeActive")` cancelli onorano il time-box senza cambiare. GET /session/god-mode scrive il chiaro attraverso Redis (facendolo dentro ottenereSession si ripeterebbe) ed è ciò che i sondaggi UI per il conto alla rovescia. Deliberatamente non OPEN sull'audit scrivere: la modalità dio è come il supporto corregge produzione, e rifiutando un'elevazione perché phi access log blinked è peggio di una riga che il registratore ha già registrato ad alta voce. Nessuna entità o @Column cambiato. PhiResourceType non guadagna né costante — è @Enumerated(STRING) con un valore CREATE TABLE whitelist che ddl-auto:update mai si allarga, quindi una nuova costante fallirebbe ogni inserto fino a KamoInitializer era gestito a mano. L'elevazione è registrata contro il MEMBER dell'operatore registra con un prefisso.

  20. · kamo-internal

    Riordinare le schede steward; piegare Identifiers in una tubazione trovare-luogo popover

    L'ordine della scheda è ora Pipeline, Documenti, Sottoscrizione, Prezzo, Capitale & Risk, Governance, Ingestion, Catalog — Pipeline diventa la schermata di atterraggio predefinita. La scheda Identifiers standalone è sparita; il suo lookup vive nella Pipeline barra degli strumenti come popover compatto Find-loan: ricerca per prestito UID (default) o risolvere qualsiasi identificatore esterno (MERS MIN, caso agenzia #, busta e-sign, ecc.) al suo prestito, con una carta di risultato ricca, l'identificatore del prestito, storia del ciclo di vita, e un clic aperto / show-in-pipeline.

  21. · kamo-signer-monorepo

    Confronta le opzioni sulla pagina delle citazioni pubbliche

    Le opzioni rendono come schede selezionabili piuttosto che righe, perché sono scelte e non aggiunte. Il periodo totale è il titolo; l'equivalente mensile siede accanto a esso come la figura che rende diversi termini di fatturazione paragonabile, e un badge di risparmio appare solo quando la differenza vale il nome. La tabella piana e il blocco totale combinato sono entrambi soppressi quando le opzioni sono presenti — un grande totale attraverso le alternative reciprocamente esclusive è un numero Nessuno può pagare. Le regole di stampa tengono le carte fianco a fianco in modo da un preventivo stampato ancora confronta.

  22. · kamo-internal

    Autore multi-opzione citazioni dal redattore

    Un preventivo è un foglio di prezzo piatto o una serie di alternative, quindi l'editor offre una modalità di gioco piuttosto che lasciare che entrambi esistano in una sola volta — inviando entrambi mostrare al cliente un prezzo che non possono comprare. Passare alle opzioni porta le linee esistenti nella prima opzione invece di scartare il lavoro digitato. Ogni opzione ottiene i propri articoli di linea, termine di fatturazione, lunghezza di impegno, sconto e tassa di configurazione, con un'anteprima dal vivo del periodo totale, equivalente mensile, valore contrattuale e risparmio rispetto alla linea di base. Gli specchi di anteprima QuoteOptionTotals; il server ricompute su salvare e le sue cifre vincono. Il conteggio della sede vive sulla citazione, così 40 -> 60 rivaluta ogni opzione contemporaneamente.

  23. · SecurityService

    Accettare un'opzione sul punto finale del preventivo pubblico

    Le citazioni multiopzione non possono essere accettate cieche — la richiesta ora porta l'opzione sceltaUid e il servizio rifiuta l'accettazione senza uno.

  24. · kamo-shared-library

    Citazioni multi-opzione con totali di confronto per-opzione

    Un preventivo può ora presentare diversi modi reciproci di acquistare — mensile, annuale, tre anni — invece di costringere tre documenti distinti che derivano a parte il momento in cui il numero del sedile cambia. - QuoteOption possiede i propri articoli di linea e i totali; i fratelli non sono mai riassunti. - QuoteOptionTotals normalizza ogni opzione ad un equivalente mensile, che è l'unica base su cui possono essere confrontati diversi termini di fatturazione, più un contratto totale e risparmio contro la linea di base contrassegnata. - Termine di fatturazione e durata d'impegno soggiorno separato: pagare annualmente non è lo stesso impegno di un termine di tre anni fatturato annualmente. - Quote.quantity è un driver condiviso; una linea che opta con gli usiQuoteQuantity rivaluta ogni opzione contemporaneamente. QuoteTotals lo onora identicamente su fogli piatti in modo che una linea non può prezzo in modo diverso all'interno e all'esterno di un'opzione. - Accettare un preventivo multi-opzione richiede di nominare l'opzione; fratelli vicino come NOT SELECTED e accettatoOptionUid registra la scelta. QuoteTotalsTest 15, QuoteOptionTotalsTest 11, QuoteShareTokenTest 9 — tutto pass.

  25. · kamo-internal

    Copertura di consegna, prezzi sign-off, pannelli di grande deposito

    Sostituisci i chip finali di Coming-soon (copertura e copertura, acquisto sign-off, Large-deposit) con pannelli live cablati ai nuovi proxy steward.

  26. · SecurityService

    Prosettili Steward per copertura, prezzi sign-off, grande deposito

    Operatore-gated, session-stamped org+member, fail-closed ownership (no cross-org esistenza oracolo). I nuovi endpoint si basano sul ratchet non autorizzato.

  27. · kamo-shared-library

    WORM pricing sign-off entità (mlos pricing signoff)

    Giudizio APPROVATO/REJECT di un solo steward su un risultato di prezzo congelato. @PreUpdate lancia (un inversione è una nuova riga). Tabella + 4 indici (org, run, risultato, prestito) applicato al prod CockroachDB via KamoInitializer.

  28. · kamo-internal

    Steward console round 2 — code di eccezione, governance, MERS riconquista

    - Capitale + Sottoscrizione: StewardExceptionQueue (pannello condiviso) cablato al reale steward-tasks endpoint — eccezioni di blocco E' una cosa che non va. eccezioni guida "Stati vuoti onesti". - Governance: CalibrationReliabilityPanel (predicted vs osservato per segmento) e PullThroughFunnelPanel (distribuzione scenica reale, etichettato un'istantanea non una coorte conversione). Sostituito i due chip del futuro. - Documenti: Pannello di riconciliazione MERS sul vero recon interno-ledger letto. Proiettili reali in tutto; copia a stringa normale (segu-up i18n); tsc --noEmit clean.

  29. · SecurityService

    Relè del gateway per le zanne, taratura/diffusione, riconciliazione MERS

    ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** E' il momento giusto. MlosDoc Orchestration Non e' vero. (filtro di org chiuso, gocce non di proprietà righe + re-deriva il tallo). Tutte e quattro le basi in ratchet non custodito (delegato cancello() guardia, come i loro fratelli).

  30. · kamo-internal

    Costruisci le caratteristiche della console di amministratore di mutuo

    Sostituisce borchie con veri e propri pannelli con supporto endpoint + fissa un bug di scrittura morta: - Sottoscrizione: Pannello di calcolo dei redditi (qualifica: DTI/PITIA/reserve/LTV + pillola AUS) e pannello Fraud/4506-C (ringhiera di ordinazione: posto/lista/cancella/eventi per FRAUD + TAX TRANSCRIPT). - Prezzo: Scenario confrontare (side-by-side pricing run) e Best-execution spiegatore (base→adjustments→passo finale + runners-up / motivi idonei); cancellato il chip Reverse-LLPA stante (già in RegolazioneDrawer). - Documenti: Live Clearability roll-up (fans prestito-clearability over the oleodotto, aggregati liquidati/bloccanti/svegliati); cancellato stale Workflow-authoring chip (già spedito). - Capitale: FIX il capitale-mercati Prossima rotta — la sua lista POST ha tenuto solo un percorso, quindi il Loan Sale Desk / lock-lifecycle spedito scrive 404'd. Sostituito l'esatto-stringa Set con ancorati modelli RegExp enumerando il 9 reale percorsi (verificati 1:1 contro il controller), ancora non chiuso su nient'altro. - Bollettino: scheda "Promote as bulletin" (docType=BULLETIN) con prodotto/cambiamento/params modificato AI, postando al nuovo relè. Nuova copia dell'interfaccia utente è stringhe semplici (i18n follow-up); tsc --noEmit clean.

Il tuo universo ti sta aspettando.

Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.

Gratis per sempre — nessuna carta di credito richiesta