Changelog
Was ist neu?
Jede Verbesserung an der Plattform, wie sie geliefert wird.
· kamo-internal
Leere Abteilungen verstecken, den Statusfilter in das Verzeichnis verschieben
- Abteilungen ohne Mitglieder nicht mehr machen. Der Endpunkt der Abteilungsabteilung gibt jede Abteilung in der Org einschließlich leere zurück, so dass der Dienstplan war mit Abschnitten, die niemanden enthalten könnten. Die pro-Abteilung "nein Der Platzhalter der Mitglieder geht mit ihnen, da er jetzt nicht mehr erreichbar ist. - Der All/Online/Offline-Filter bewegt sich vom flächendeckenweiten Header unten der Tab-Streifen, so sitzt es im eigenen Bereich des Verzeichnisses mit dem Dienstplan es Filter statt zu erscheinen, um das gesamte Panel zu filtern (es hat nie angewendet Chats oder Mobile Access). - Der leere Zustand schlägt nur vor, die Suche/Filter anzupassen, wenn man tatsächlich angewendet; ein Org ohne Mitglieder hat nichts zu justieren.
· kamo-internal
Die Dia-Ausung als eine durchgehende Oberfläche wieder aufbauen
Mitgliederreihen bilden jetzt direkt die Abteilungsstelle - kein Karten-auf-Karten-Nistplatzieren . und Abteilungen laufen voll-Blöten mit klebrigen Bändern, Rückforderung 30px der Zeilenbreite und Schneiden des Chroms vor dem ersten Mitglied von 228px auf 170px. Layout - Löschen Sie den Karten-in-Karten-Stack: Die Zeilen sind flach, Haaransatz getrennt, in voller Breite. - Klebriges Abteilungsband (inken Sie auf einem 8% Primärton, nie weiß-auf-primär) mit der Offenlegung chevron, ein Live-Präsenzmesser, ein Online/Gesamt Fraktion und ein Select-Schalter. Drops das identische pro-Abteilungs-Gruppensymbol. - Ein Hintergrund statt drei gestapelter Gradienten; ein Scroll-Redge-Cue. - Status wird von einem Punkt auf dem Avatar plus ein Wort nur dann getragen, wenn er hinzufügt Informationen, die fünf Kodierungen pro Reihe mit dem gleichen Wert ersetzen. Verhalten - Reihenklick öffnet den 1:1 Chat. Es hat vorher nichts getan: MemberList nie übergeben aufClick, so dass eine voll gestylte anklickbare Reihe war träge. - Wiederherstellen des All/Online/Offline Filters, der nur innerhalb von MemberList existierte Header - ein Zweig, den das Live-Panel nie gerendert hat (showHeader={false]), Ausgehen statusFilter angeheftet auf 'all'. In NavTopPanel neben dem Suchfeld gehoben. - Multi-select gewinnt echte Bezahlmöglichkeiten: ein Select-Trig per Band, ctrl/cmd-click, und berühren Long-Presse; eine Auswahlleiste erhebt sich von der ersten Auswahl. - Ein gelifteter MeetingDialog statt einer pro Reihe montiert, und ownMemberId ist Anstelle von jeder Zeile nach unten eingefädelt /api/user-info. Bewegung - MotionConfig reduziertMotion="user", plus bevorzugt-reduzierte Bewegungswächter auf der CSS-Keyframes kann es nicht erreichen. - Gestaffelter Abschnitt Eingang, Rahmen-Höhe-Kolze mit einem rotierenden chevron, Layout-Feder-Reihe Reflow, Kilometerzähler zählt, ungelesene Pop, gerichtete Reiter-Dias. Barrierefreiheit - Reale Offenlegungssemantik, ul/li Reihen, eine gestreckte Reihe mit Geschwisterchen (nicht verschachtelt) Aktionen, Fokusfalle mit Fokus-Reit-Reit, Pfeiltasten-Navigation, eine höfliche Live-Region für die Auswahl und -=24px-Ziele. - Die Panel-Öffner in NavTop waren nicht-fokussierbare Boxen; sie sind jetzt Knöpfe. - Chats Zeilen waren Click-only divs ohne Tastatur-Pfad; sie sind Listenelemente mit echten Buttons und zugänglichen Namen. Theming - Neuer --on-primary Token so weißer Text auf einem leichten Mieter primär fixierbar ist. - Gemeinsame Verfügbarkeit Palette endet die NavTop / MemberItem Farbdrift, und die Haarlinien hören auf zu verweisen --color-primary-rgb, eine Variable, die nie definiert wurde. - Relative Zeitstempel gehen durch Intl auf der App locale statt zu emittieren fest codiertes Englisch, und Last-active-Labels ticken wieder über eine gemeinsame 30er-Uhr.
· SecurityService
Detektion und Warnung über den Rekord-Zugangs-Audit-Trail
phi_access_log hat Beweise gesammelt, die niemand anschaut. Das befriedigt Der Weg existiert und befriedigt nichts - 1644.308(a)(1)(ii)(D), der um Überprüfung bittet, oder -164.400-414, dessen Uhr kann nicht starten, bis jemand es bemerkt. Das ist die Sache, die bemerkt. Fünf Detektoren über die geschlossene Stunde, pro Schauspieler: BULK_EXPORT 250 eindeutige Datensätze exportiert/downloaded/offengelegt MASS_READ 200 verschiedene Datensätze gelesen REPEATED_DENIALS 10 abgelehnte Versuche (events - eine Ablehnung Namen keine Aufzeichnung) OFF_HOURS_ACCESS 20 eindeutige Datensätze außerhalb der TENANT-Woche PLATFORM_STAFF_ACCESS 1 - eine abgedeckte Einheit wird unabhängig von der Begründung informiert Zähler sind DISTINCT-Aufzeichnungen, nicht Ereignisse: PhiAccessAuditor sendet eine LIST-Reihe pro Gitterzeile, so dass ein Mitglied die gleiche Seite vierzig mal neu lädt, ist 2.000 Veranstaltungen und 50 Personen - und "wie viele Personen" ist die Zahl ein Verstoß Es wird bewertet. Rationale für jeden Standard ist auf PhiDetectionSettings; Alle von ihnen sind configmap-tunable, weil ein Detektor, der ständig feuert wird gedämpft und ein gedämpfter Detektor liest sich immer noch als Abdeckung. Off-Hours wird in der Mieterzone über seine bestehende OFF_HOURS_ACCESS beurteilt Regel (Geschäftszeiten der Sicherheits-Bildschirm bereits sammelt) fällt zurück zu Organisation.timezone. erfolgte_at ist UTC, so dass eine UTC-verankerte Überprüfung Seite würde ein Sydney Mieter jeden Arbeitsmorgen und nie Seite ein New Yorker. Zustellung verwendet, was existiert: EmailTemplateServiceClient -- EmailService /api/email/templates/send mit dem neuen PHI_ACCESS_ALERT canonical key, auf dem Adressen der org bereits in org_suspicious_detection_rules .notification_emails. Ein Mieter, der keine konfiguriert bekommt das Überprüfungsprotokoll und nichts anderes - Mailing eine vermutete Adresse würde offenbaren, dass ein benannt Die Belegschaft steht unter Verdacht. Jeder Befund wird bei einem dedizierten protokolliert PHI-DETECTION Logger; nur Benachrichtigung wird gedrosselt (6h pro Detektor/Tenant/ Schauspieler, im Redis verwenden die Login-Anomalie-Regeln bereits). Warnungen tragen Bezeigt und zählt, nie ein Rekord. Zwei bewusste strukturelle Entscheidungen: - Die Aggregate laufen durch einen EntityManager, nicht Spring Data @Query. Frühling Daten validiert eine deklarierte Abfrage, indem sie bei repository bootstrap erstellt wird, also a Fehler dort scheitert Kontext Startup und ein SecurityService, der nicht Start nimmt jedes Login mit ihm, wie am 2026-08-03. Hier ist der schlimmste Fall ein Sweep, dass Protokolle und Wiedererneuerungen nächste Stunde. Es entfernt auch dieses Paket aus dem @EnableJpaRepositories Frage vollständig: kein Repository Bohne, nichts zu vergessen. PhiDetectionQueryTest prüft jeden Eigenschaftsweg reflektierend seit Kein Test in diesem Service kann einen Kontext starten. - Jede Abfrage wird zuerst durch Organisations-ID eingeschränkt. nutzbarer Index ist (ORGANIZATION_ID, OCCURRED_AT); pünktlich filtern voll-scans eine Onend-only-Tabelle, die immer nur wächst. Planung: Dies verbindet TaskScheduler (4 Fäden, Planung), die sieben Sweeps bereits teilen. Es berührt NICHT TranslationExecutor - die 3-thread/500-queue @Async Pool beobachtet gesättigt und unterwirft sich an keinen Vollstrecker. Stündlich, fünf gruppierte Aggregate pro Mieter-Charge, kein Netzwerk-I/O innerhalb des Scans und eine Reentrancy Verriegelung, so dass ein langsamer Lauf überspringt die nächste Zecke statt stapeln dahinter und hungert den Pool teilt es. Keine Entität oder Spalte wurde hinzugefügt oder geändert.
· EmailService
Variablen für PHI_ACCESS_ALERT
Ohne BeispielVariables-Arm macht die Mail-Vorlagen Vorschau jedes Platzhalter blank, so dass wer auch immer gebeten wird, den Wortlaut einer Sicherheit zu genehmigen Alarm sieht einen leeren Tisch. Die Beispielmodelle Identifikatoren und zählt nur die gleiche Form, die die echte Warnung trägt, weil die eigentliche Warnung trägt nie eine Rekord.
· kamo-shared-library
PHI_ACCESS_ALERT kanonische Vorlage
Die stündliche Überprüfung von phi_access_log durch SecurityService muss irgendwo gesendet werden was sie findet. Anstatt einen Kanal zu erfinden, nutzt er den vorhandenen Transaktions-E-Mail-Schiene, was einen kanonischen Schlüssel bedeutet: abwesend von CANONICAL_KEYS eine Vorlage kann nie ausgesät werden, nie selbst heilt, und jeder senden Sie eine permanente 404 - eine Warnsteuerung, die wie Abdeckung aussieht und liefert nichts. Die Vorlage enthält nur Bezeichner, Zählungen und ein Zeitfenster. Eine Entdeckung Artefakt, das das, was es entdeckt hat, hat das PHI in einen Posteingang verlagert ohne Retention-Politik, so gibt es absichtlich keinen Platzhalter für eine Rekord. PhiAccessAlertTemplateTest pins, dass, und pins die beiden stillen Ausfall Modi: ein Platzhalter nichts liefert als leere Zeichenkette mit nur einem WARN, und der Renderer macht kein HTML-Entweichen, so dass alles, was den Körper erreicht verwendet den entflohenen Zwilling. EmailService muss mit dieser Shared-lib umschichten, bevor SecurityService startet Senden; bis dahin ist der Senden gefangen und der Befund bleibt nur Review-Log.
· kamo-internal
Spiegeln Sie die bleiern minimal-notwendige Maske auf den Client (-164.502(b))
SecurityService hält nun maßgeschneiderte Antworten von einem Anrufer zurück, der nicht die Der Bevollmächtigte des Leads (und, in einem GriffPhi Mieter, sogar von einem Inhaber von rechts 161). Diese Maske ist die Durchsetzung, das ist es nicht. Zwei Wege umgehen es noch: - LeadRealtimePublisher setzt einen FULL, unmasked LeadDTO auf security.leads.rt.{orgId' . Eine Nutzlast ausgefächert für jeden Abonnenten in der org, ohne pro Empfänger Projektion möglich. Bis dieses Ereignis trägt Nur Bezeichner und der Client reduziert, app/lib/leads/leadFieldMask.ts ist das einzige zwischen den Aufnahme-Antworten eines Kollegen und jeder offenen Bleischeibe im Mieter. LeadViewClient führt jetzt eingehende Echtzeit-Nutzlasten durch bevor irgendetwas davon in den Zustand gelangt. - Rendering: ein einbehaltenes Formular und ein nie gefülltes eins ankommen lassen identisch, so muss die Entscheidung neu vorgeschlagen werden, nicht abgeleitet. Die Custom-Form pane legt seine Bearbeiten-Bezahlbarkeit fallen, wenn Antworten eingeschränkt sind - Speichern eines Leerzeichens form würde PUT {] über die realen Antworten, die der Server jetzt 403s sowieso. Organization.handlesPhi wird auf der vorhandenen Spalte geliefert -- DTO -- OrgContext Pfad (die Org-Entität zeichnet sie bereits serialisiert; das zod-Schema und Organisation.fromJSON allow-list waren die fehlenden Links), nicht ein zweiter Kanal. Keine neue Benutzer-sichtbare Kopie: das erklärende "eingeschränkt"-Label braucht einen Schlüssel in der Übersetzung-Wörterbuch-Repo und wird absichtlich für diese Änderung verlassen.
· SecurityService
Minimale Maskierung von Lead-Antworten (-164.502(b))
Die einzige Feldmaske der Plattform war ************ angewendet von LeadController.getLeadById an einen Anrufer, der weder Gott noch der Empfänger ist und fehlt VIEW_LEAD_CONTACT_INFO_OTHERS (161). Es umfasst E-Mail, Telefone, Datum der Geburt und die Straßenteile der Mailing-/Immobilienadressen - und sonst nichts. CustomFormData ritt direkt durch sie, das ist der eine Platz auf der Plattform ein Die Mieterin im Gesundheitswesen wird tatsächlich Fragen zur Aufnahme und zur Symptomatik stellen. LeadFieldMask besitzt nun die Entscheidung und die Projektion: - any org: Custom-Form Antworten Fahrt mit der Kontaktmaske. Wenn Sie nicht sehen können die E-Mail der Leiterin, die Sie vielleicht nicht sehen, was sie beantwortet hat. - GriffePhi Mieter: Antworten werden von jedem vorenthalten, dass die Leitung nicht zugewiesen ist sogar MIT rechts 161. Dieses Recht wird, durch seinen eigenen Namen, um Kontakt zu treten Information; eine Symptomantwort ist keine Kontaktinformation. Der Formtitel geht auch "Diabetes Intake Questionnaire" gibt die Bedingung für sich. Der Formulareintrag überlebt Maskierung trägt nur seine ID, so kann die Benutzeroberfläche sagen "Einschränkt", anstatt einen leeren Fragebogen zu zeichnen. Eine Org, die nicht geladen wird, ist behandelt als PHI-Handling, passend zur UNKNOWN-Denies Haltung von PhiTenantStatus. PUT /leads/{id] gewinnt das symmetrische Schreibtor. Der Formeditor PUTs das Ganze FeldValues Karte, so dass ohne sie ein Mitglied einen leeren Fragebogen angezeigt, die gedrückt Speichern hätte die wirklichen Antworten durch {] ersetzt, die die Lesemaske hätte zu einem stillen Löschung werden. Statisches Nützling, kein Stereotyp und kein Repository: Die Entscheidung ist rein und Caller hält bereits die org.
· kamo-internal
PHI-Zugriffsprüfungsbetrachter - Org-Rezension und pro-Recordsbuchhaltung
Der Weg wurde geschrieben und nichts konnte ihn lesen. Dies ist der Bildschirm Hälfte: eine org-weite Zugriffsprüfung unter Einstellungen - Sicherheit und ein "Wer darauf zugegriffen hat record" Dialog von der Leine selbst geöffnet, die die Form ist ein -164.528 Buchhaltung Anfrage tatsächlich kommt in - eine Person fragen nach ihrer Datei, nicht jemand, der Zeit hat, ein globales Log zu filtern. Drei Dinge sind hier nicht kosmetisch. Zeitstempel sind absolut und benennen immer die Zone, in der sie gemacht wurden, mit einem Ein-Klick-Schalter zu UTC. Diese Beweise werden Monate später von jemandem gelesen, der nicht anwesend; eine nackte Wand-Uhr aus einer anderen Zone liest leise verstellt eine Zugriff nach Stunden, das ist der Unterschied zwischen "in der Schicht" und "bei 3am". Relative Zeiten sind ausgeschlossen - sie driften jedes Mal, wenn die Seite geöffnet wird. Verweigerte Versuche und Plattform-Mitarbeiter-Zugang sind auf der Zeile markiert (tint, linke Regel, führendes Symbol) anstatt in einer Spalte gelassen, überspringt das Auge, weil eine Einhaltung Offizier scannt Hunderte von Zeilen für die, die nicht da sein sollte. Gewöhnlich liest man bewusst schlicht: alles zu dekorieren ist gleichbedeutend mit Dekorieren nichts. Verweigert outranks Plattform-Person, wenn eine Reihe ist beide - Kamo Personal wird abgelehnt ist die interessanteste Zeile, die der Bildschirm zeigen kann. Export wird auf EXPORT_ACCESS_LOGS getrennt von der rechten Ansicht und eine 503 von der vorderen Stelle als "nichts offenbart wurde" aufgetaucht in einen generischen Fehler. EXPORT ist eine ausfallgeschlossene Audit-Saga: die Ablehnung bedeutet die Offenlegung konnte nicht aufgezeichnet werden, was ein richtiges Ergebnis ist, das der Offizier braucht zu sehen. Query-Gebäude, Zeitstemp-Formatierung und Zeileneinwertung live in App/lib so vitest kann sie erreichen; die Komponenten sind Montage. Ein 403 fällt nie durch ein leeres Gitter - "niemand hat diese Platte jemals berührt" ist das gefährlichste Falsch Antwort dieser Bildschirm kann geben.
· kamo-internal
Mitgliederseite auf Profil, Kurzab-Etiketten, Tab-Symbole hinzufügen
Aus dem Kopf der Mitgliedereinstellungen wird "Mein {memberLabel]-Profil" (oder "{memberLabel"-Profil" für ein anderes Mitglied) und der näusliche Link wird Mein Profil. Tab-Etiketten kürzen - Mailbox(s), Telefon, Audio & Video, Genehmigungen, Aktivität - während das Telefon und Rollen helfen, Tipps halten ihre Beschriftende Überschriften über neue ************ Schlüssel. Jeder Tab trägt nun ein Symbol in der Tab-Leiste; tab query-param ids sind unverändert, so tiefe Verbindungen weiter arbeiten.
· kamo-internal
Ton-Schieber - weiß getüncht bis zur vollen Farbe zu verdunkeln
Ein pro-Mitglied HintergrundTone ui-Vorsicht (0 weiß / 50 Vollfarbe / 100 schwarz) als Waschung über dem Lesbarkeit scrim in beiden Konsolen slideshow layer und die WYSIWYG-Bühne des Editors. Slider lebt in der Bühne Medien Chrom mit Live-Drag-Vorschau, Mitte Snap, und persist-on-release.
· kamo-internal
Startkarten und Helden verwenden die Marke Farbe der Org anstelle von pro Modul Akzente
Die Home Launchpad Optionskarten, Drag Overlay, und First-Org-Held jetzt nehmen ihren Akzent von var(-color-primary) (die Org's dynamisch eingestellt Thema Farbe) statt der festen Multi-Color --accent-* Familienkarte.
· kamo-internal
Break-Glass-Gott-Modus - Grundaufforderung, Countdown, Stehanzeige
Gott-Modus hatte überhaupt keine Benutzeroberfläche in kamo-internal: ein localStorage boolean, dass ein Reittier Effekt in *** gespiegelt, wieder auf jedem neuen Tab für immer bekräftigt. Das machte die Browser die Behörde auf, ob Plattform Personal erhöht wurden, und machte Erhebung etwas, in dem man sein könnte, ohne sich jemals dafür zu entscheiden. - GodModeJustificationDialog fordert aus dem Grund VOR Erhöhung. Ein Grund danach gesammelt ist ein Grund geschrieben, um zu passen, was bereits getan wurde. Die Kopie erklärt ganz klar, was der Betreiber sehen wird und dass ihr Name darauf steht. - GodModeIndicator ist eine vollbreite untere Leiste plus einen roten Rahmen um das Ganze viewport, mit einem Live-Countdown und "End now". Jemand, der vergisst, dass sie in Gott-Modus ist das genaue Szenario die Kontrolle existiert, um zu verhindern, so ist es nicht ein subtile Abzeichen - aber es ist pointer-events:ke von außerhalb der Bar und sitzt draußen Layout-Flow, so dass es nie einen Klick abfängt oder einen Bildschirm wieder zurückblättert. - Beide sind einmal in der Wurzel-Layout montiert, neben AutomaticLogoff, so dass die Indikator ist vorhanden, wo immer der Bediener endet, anstatt auf den Bildschirmen Jemand erinnerte sich. Rendert nichts, es sei denn, die Sitzung ist Gott-ELIGIBLE. - Der Server besitzt den Zustand. app/lib/godMode hält einen einzigen koalierten Speicher; die Client liest immer nur die ablaufenden SecurityService gestempelt und kann nie verlängern es. setIsGodMode ist weg - Erheben braucht eine Rechtfertigung, so kann es nicht ein Setter. - Die Status-Umfrage verdoppelt sich als die dauerhafte klare: GET /session/god-Modus ist, wo SecurityService schreibt eine verstrichene Erhöhung aus Redis für die Dienste, die Lesen Sie die Sitzung direkt. usePlatformAdminGuard wartet nun auf den Gottstatus für gottfähige Sitzungen. Der Zugriff war früher synchron von localStorage lesbar; ohne Wartezeit Operator mit einem offenen Fenster würde zu / Settings in der Lücke prallte. Streicher sind in ************ (erst geschoben, nach der Klonfolge des Builds). npx vitest run: 329 übergeben (32 Dateien), davon 17 neu. npx tsc --noEmit: sauber.
· SecurityService
Lesen Sie den PHI-Zugangsweg - 164.528 Buchhaltung und Aktivitätsprüfung
Der Weg ist für eine Weile geschrieben worden und nichts konnte es lesen, die zwei links Verpflichtungen nicht erfüllt: eine Abrechnung von Offenlegungen für die Aufzeichnungen einer Person (ca. 164.528) und die regelmäßige Überprüfung der Tätigkeit des Informationssystems (ca. 164.308(a)(1)(ii)(D)). Beide sind Fragen. Dies fügt die Abfragefläche hinzu. Die Autorisierung ist das Merkmal, nicht das Gitter. Die Organisation wird von der Sitzung und aus nirgendwo sonst - es gibt absichtlich keine orgId-Parameter auf jedem Handler und PhiAuditQueryService ist ein einziger Choke-Punkt, der den Mieter hinzufügt Prädikat, bevor es auch nur den Filter konsultiert. Vier Geschwister Abfragemethoden würden waren vier Gelegenheiten, es zu vergessen. Scoping ist eher eine WHERE-Klausel als ein Post-Filter, weil das Filtern einer zurückgegebenen Seite TotalElemente hinterlassen würde Zeilen zählen kann der Anrufer nicht sehen. Die Leseseite erhält eine eigene Repository-Schnittstelle. Die gemeinsame PhiAccessLogRepository Sucher sind bewusst Cross-Tenant - korrekt für ein Plattform-Tool, eine Offenlegung wenn an einen Kundenbildschirm übergeben - so bekommt der Bildschirm eine Schnittstelle, deren einziger Eintrag Punkt nimmt eine Spezifikation. Es lebt unter com.kamo.SecurityService, die die vorhandene @EnableJpaRepositories Eintrag deckt bereits ab, so dass keine Scan-Änderung erforderlich ist und keiner kann vergessen werden. Rechte sind VIEW_ACCESS_LOGS (29) und EXPORT_ACCESS_LOGS (32) - das Paar, das bereits Gates die Authentifizierung Protokoll, so dass jeder, der Sicherheit verwaltet heute kann dies am ersten Tag gebrauchen. Eine neue Rechts-ID hätte den Bildschirm tot ausgeliefert: es benötigt einen KamoInitializer-Lauf und ein Stipendium, bevor ein Mitglied einen hat. Die Spur lesen ist selbst aufgezeichnet, als REPORT/SEARCH für eine Lesung und REPORT/EXPORT für eine Kopie, einschließlich abgelehnter Versuche. Die Suchkriterien sind nicht aufgezeichnet - ein Filter trägt Mitglied und Aufzeichnungen ids, und eine Spur, die speichert was gesucht wurde, akkumuliert die Bezeihungen, die es zu schützen. Alles ist begrenzt: Seitengrößenklammern auf 200, ein Exportdeckel bei 10.000 Reihen. Ein Sechs-Jahres-Trail ist Millionen von Reihen und die Capture-Schicht schreibt eine Zeile pro Gitterreihe pro Ladung, so dass eine unaufgehängte Größe eine erreichbare OOM ist, anstatt eines Theoretische. Zeitstempel hinterlassen als explizite UTC-Instanzen. Die Säule ist zonlose Wand-Uhr, und diese Beweise werden Monate später von jemandem gelesen, der nicht da war.
· kamo-internal
MFA-Einschreibungsbildschirm und die God-Mode PHI-Grenzkontrolle
Zwei Einstellungen Oberflächen für Backends, die keine hatten. MFA-Anmelden (Einstellungen - mein Profil - Anmelde-Sicherheit, nur selbst). Die /api/security/mfa-Endpunkte von SecurityService sind vollständig und vollständig unerreichbar, so MFA existierte und niemand auf der Plattform konnte es einschalten. Die tab ist selbst-only, weil diese Endpunkte lösen den Benutzer aus dem Anrufer eigenen Sitzung und nehmen Sie keinen Benutzerparameter - ein Admin, der das Profil eines anderen öffnet würde sich auf diesem Bildschirm ihren eigenen Authentifizierungsgerät anmelden. Der QR-Code verwendet qrcode.react, bereits eine Abhängigkeit; kein Paket wurde hinzugefügt. Die Geheimnis wird daneben gezeigt, unabhängig davon, weil eine Authentifizierung App auf der gleichen Gerät, wie der Browser kann nicht scannen Sie den Bildschirm, den es abdeckt. Zwei Ausfallpfade erhalten eher erstklassige Handhabung als ein allgemeiner Fehler. A 409 bedeutet, dass ein bestätigter Faktor bereits existiert und sagt dies, mit dem Heilmittel (ein Administrator zurückgesetzt) - sagen, dass der Benutzer zu versuchen würde sie zurück in die senden eine Aktion, die nicht gelingen kann. Ein falscher Bestätigungscode hält die anhängigen Einschreibung: das Geheimnis wird einmal angezeigt, so verwerfen würde es zu löschen bedeuten der Authentifizierungs-Eintrag und das Rescanning und die anstehende Anmeldung des Servers wäre immer noch da, so würde der Wiederaufnahme 409 zurückkommen und sie stranden. Recovery-Codes werden einmal angezeigt und können nicht neu ausgegeben werden. Der Dialog kann nicht sein Entlassen durch Flucht, Hintergrund oder eine enge Taste; Gemacht entriegelt erst nach der Codes wurden kopiert oder heruntergeladen UND die Warnung bestätigt. Beide sind erforderlich: eine Checkbox allein wird reflexartig angeklickt, und eine Zwischenablage ist allein Überschrieben von der nächsten Kopie - und nichts sieht falsch aus bis zu dem Tag, an dem der Benutzer verliert ihr Handy. PHI-Grenze (Einstellungen - Sicherheit - Gesundheitsdaten, nur gottfähig). Die Registerkarte ist sichtbar für Gott-berechtigte Betreiber und die Kontrolle im Inneren erfordert Gott-Modus tatsächlich eingeschaltet, was SecurityService erneut prüft; die Förderfähigkeit allein ist nicht Aktivierung. Es kippt nie, ohne zuerst die Module aufzulisten, die nicht mehr funktionieren Diese Liste kommt vom Server, abgeleitet von PhiModule durch PhiTenantGuard, so kann es nicht von dem abweichen, was erzwungen wird. Ein 503 ist als "Die Änderung wurde nicht angewendet, weil sie nicht aufgezeichnet werden konnte", weil das heißt was passiert ist. Entscheidungslogik lebt in App/lib/Security, so dass vitest es erreichen kann; die Komponenten Halten Rendering nur. Verifiziert: npx vitest run mit 329 Tests, 32 Dateien, alle bestanden (43 davon neu). npx tsc --noEmit berichtet nur drei Fehler in ************ eine untracked Datei von einer anderen Sitzung in diesem Baum, in keiner der Dateien hier.
· SecurityService
Endpunkt, um die HIPAA-Grenze einer Organisation zu lesen und zu verschieben
Organization.handlesPhi hat als eine Spalte ohne Möglichkeit, es zu setzen existiert, so PhiTenantGuard hat eine Flagge durchgesetzt, die niemand einschalten konnte. Das ist die fehlende Hälfte: GET/PUT /api/security/phi/phi/tenant. Autorität ist Gott Förderfähigkeit UND ein aktiver GottModeActive toggle, nie eins. Die Förderfähigkeit allein ist es, die die Gotttore der Plattform bis 2026-07 umsonst zurückgelassen haben; hier würde es jedem gottberechtigten Operator erlauben, die Module eines lebenden Mieters abzuschalten mit einem unauffälligen Klick. Das Ziel ist immer die eigene Sitzung des Anrufers org Es gibt keinen OrganisationId-Parameter, so dass keine handwerkliche Anfrage eine Pächter der Anrufer ist nicht schon drin. phiEffectiveDate wird auf First-able- und nie umgeschrieben, auch auf einem gestempelt später deaktivieren/re-enable. Es umfasst die Verletzungs-Bewertung und Retention-Fenster, so bewegt es vorwärts würde ruhig schrumpfen die Zeit in der Überprüfung, und eine Prüfung Datum, an dem der Antrag vorgezogen werden kann, ist kein Beweis. Die Prüfungsreihe ist geschrieben VOR die Flagge bewegt, und CONFIGURE scheitert geschlossen, so dass ein Spur, die nicht geschrieben werden kann, verweigert die Änderung und gibt 503 zurück, anstatt eine Grenze hinterlassen, die sich ohne Aufzeichnungen bewegt hat. Verweigerte Versuche sind auch aufgenommen. Jede Zeile trägt Identifikatoren und den Übergang nur, nie Inhalt. blockedModule wird von PhiModule über PhiTenantGuard abgeleitet statt aufgelistet, so dass die Warnung der Benutzeroberfläche zeigt nicht von dem, was die Wache erzwingt driften. Kein neues Repository-Paket: OrganisationRepository ist bereits in diesem Dienst @EnableJpaRepositories Liste, so gibt es nichts neben dieser Bohne hinzuzufügen. Geprüft: 298 Tests, 1 Fehler - **************** EntityManager NPE, die bereits besteht (Basisline bei 7968a21: 281 Tests, gleich 1 Fehler). RepositoryScanCoverageTest und ************ beide Pass.
· kamo-internal
Das Angebotsformular als geführten Durchfluss neu erstellen, eine Output-Vorschau hinzufügen
Die Details Registerkarte war ein flacher Stapel von umrissenen Boxen, die jedes Feld das gleiche gab Gewicht, so dass nichts signalisiert, welche Eingänge tatsächlich ändern, was der Kunde sieht. Es liest sich nun, wie die vier Entscheidungen ein Zitat gemacht wird, wofür es ist, was wird verkauft, wie es angepasst ist, was der Kunde liest - jeder mit einem einzeiligen Grund Angelegenheiten, und die laufende Summe sitzt in einer klebrigen Schiene anstatt am Boden begraben. Bewegung trägt Bedeutung statt Dekoration: Abschnitte kommen in Folge, ein bedingtes Feld erweitert sich von der Kontrolle, die es offenbart, die Preiszone Cross-Fass, wenn seine Form ändert, und eine Summe zählt zu seinem neuen Wert, so dass ein falsch gewählt Der Stückpreis wird bemerkt, anstatt stillschweigend absorbiert zu werden. Alles respektiert bevorzugt-reduziert-Motion. Die neue Vorschau-Aktion macht das fertige Dokument - Briefkopf, Optionen oder Tabelle, Summen, Begriffe und druckt sie selbst. Es Projekte der CURRENT Editor Zustand, nicht die gespeicherte Datensatz, weil der Moment, den Sie brauchen, um das fertige Angebot zu sehen ist, während der Entscheidung ob es zu senden. Branding kommt aus der eigenen Auflösung des Servers, so dass die Vorschau Briefkopf ist der, den der Kunde bekommt, und die Optionsarithmetik wird von der Herausgeber statt neu umgesetzt.
· kamo-shared-library
Audit-vokabular für eine Änderung der Compliance-Grenze selbst
Fügt PhiResourceType.ORGANIZATION und PhiAccessKind.CONFIGURE hinzu, damit sich drehen Organization.handlesPhi auf oder aus kann als das, was es ist aufgezeichnet werden. Jeder vorhandene Ressourcentyp benennt den Datensatz einer Person. Einreichung einer Änderung der Die Compliance-Haltung des Mieters unter einem von ihnen würde eine Lüge in die 164.528 legen Buchhaltung von Offenlegungen, und "wann hat dieser Mieter zu einem abgedeckten Unternehmen Geschäftspartner" ist die Frage, gegen die der Rest der Spur ist es braucht seine eigene Reihenform, keine geliehene. CONFIGURE scheitert geschlossen aus einem anderen Grund aus den Massenarten: nichts ist offengelegt, so dass die Verweigerung kostet den Betreiber einen erneuten Versuch, während eine Grenze, die verschoben Ohne Aufzeichnungen darüber, wann der Staat ist, kann eine Bewertung von 164,442 Pfund nicht rekonstruieren. Keine Schema-Implikationen. phi_access_log.RESOURCE_TYPE und ACCESS_KIND sind schlicht VARCHARs erstellt von PhiAccessLogTableMigration ohne enum whitelist CHECK, also keine Konstante benötigt einen KamoInitializer-Lauf, bevor es eingefügt werden kann, und keine Entität oder @Column wird berührt. Geprüft keine erschöpfende Umstellung über beide enum existiert in jedem Dienst.
· SecurityService
Servieren Sie die kundenorientierte Ansicht zu den Mitarbeitern für die Vorschau
GET /{uid'/Preview gibt den gleichen PublicQuoteView zurück, den der Share Link serviert, von der gleiche QuotePresentation Auflösung, so dass ein vorhergesehener Briefkopf nicht von einem gesendeten eins. Es prägt absichtlich kein Token, zählt eine Ansicht oder notiert ein Ereignis. bei Ihrem eigenen Entwurf ist nicht Kundenbindung, und lassen Sie es in den Aktivitätspfad würde die Ansicht Zähler unbrauchbar machen als Signal.
· ConversionService
Scannen von Uploads für Malware bei Ingest (ca. 164.08(a)(5)(5)(ii)(B)
Der Dokumententresor akzeptierte beliebige Uploads ohne Malware-Scannen überall auf der Plattform, und es ist Multi-Tenant - eine Datei, die man org hochlädt ist von anderen Org-Benutzern durch den Viewer, den WOPI-Editor und den Binder. ClamAV über INSTREAM, direkt mit clamd gesprochen (keine Client-Bibliothek; die Protokoll ist ein Socket und ein Längen-Präfix). Das Tor läuft ein ImagingUploadController auf /upload und /templates/upload, vor dem Mitglied Nachschauen und bevor irgendwelche Bytes MinIO erreichen - Scannen nach Speicherblättern Objekt abrufbar für die Breite des Rennens. Scanner-unerreichbares Verhalten ist standardmäßig FAIL OPEN, und das ist eine Entscheidung eher als ein Unfall. clamd ist noch nicht eingesetzt: dies ist die Anwendung halb, und der Einsatz ist ein separater operativer Akt (KlusterServices auto-Applies auf Push und ist nicht diese Änderung zu berühren). Versandstill würde Dokument Upload nach unten für jeden Mieter in dem Moment das Bild rollt, nehmen, ohne Inszenierung, in der das gefangen gewesen wäre. Fail-offen hier ist nicht "kein Schutz", es ist der Status quo der letzten Jahre, jetzt angemeldet bei ERROR jedes Mal, wenn es passiert. Jeder Knopf - einschließlich Fail-closed - lebt in kamowsconversion-config, so dass es eine Konfigurationskarte ist, sobald clamd stabil ist bearbeiten und ein Neustart, keine Veröffentlichung. Ein Leistungsschalter begrenzt die Kosten eines abwesenden Scanners: nach 3 aufeinanderfolgenden Ausfälle der Wache stoppt Wählen für 60er Jahre, so dass Uploads nicht jeder zahlen eine Anschluss Timeout für eine Steuerung, die effektiv ausgeschaltet ist. Zur Erkennung: 422 Benennung der Signatur (kein 5xx - Wiederausprobieren hilft nicht), die Bytes werden in einem dedizierten Quarantäne-Eimer erhalten, anstatt fallen gelassen, und die Ablehnung wird über PhiAccessRecorder aufgezeichnet. Die Prüfungsreihe trägt Nur Bezeichner; der hochgeladene Dateiname bleibt draußen, weil Dateinamen hier enthalten Sie routinemäßig die Namen von Kreditnehmern. PhiAccessKind hat kein UPLOAD-Mitglied und Hinzufügen man würde die Einschränkung einer @Enumerierten(STRING) Spalte in der geteilten Spalte ändern Bibliothek, so DOWNLOAD + erlaubt=false verwendet wird und der Grund ist dokumentiert bei die Call-Site. Schaltet auch den PHI-Trail dieses Dienstes zum langlebigen phi_access_log-Briter um. Der passende com.kamo.z.shared.phi.audit Eintrag ist im gleichen Com.com @EnableJpaRepositories Liste, und PhiAuditRepositoryScanTest scheitert den Build, wenn die beiden jemals driften - diese Paarung ist, was nahm jede Anmeldung nach unten auf 2026-08-03. Retro-Scan (POST **************** fegt Dokumente schon ab im Gewölbe, mit Mieter scoped und paged. Es berichtet und konserviert, nie blockiert oder löscht: ein gespeichertes Objekt unwiederbringlich benötigt eine beharrliche Quarantäne Flag, d.h. eine Shared-Bibliothekssäule, die von einem handgeführten Initialisator angewendet wird, während Service CI baut gegen Haupt, und das Löschen auf einem falsch positiven zerstören würde Rekord für einen Mieter ohne Erholung. Tests: 36 neu. Vorbestehende **************** bei_or_below_1080 scheitert immer noch an einem sauberen Baum; unberührt. Nicht gedeckt, absichtlich: RecordingIngestController (internal-auth Asterisk push) und DocsService's WOPI PutFile sind zweithäufigste Pfade, die das Gleiche wollen Gate, aber der Scanner lebt in diesem Service und WOPI hat keine *** Token zu einer Prüfungszeile zuschreiben. Beides sind Nachfolger, keine Versäumnisse.
· SecurityService
Break-Glass God-Modus - Rechtfertigung + 30-Minuten-Zeitbox
Der Gott-Modus aktiviert still und dauerte so lange wie die Sitzung. Das ist die Kontrolle einer abgedeckten Einheit Sicherheitsüberprüfung drückt am härtesten auf, weil "Ihre Mitarbeiter können unsere Patientendaten lesen" wird immer gefragt und eine ungerechtfertigte, unbegrenzt Die Erhebung hat darauf keine Antwort. - POST /api/security/session/god-mode benötigt nun eine getippte Begründung Schritt nach UP. Stepping DOWN nie tut - eine Kontrolle, die Gates die sichere Aktion ist ein Kontrolle, die die Bediener erhöht hält. - Beide Kanten werden durch PhiAccessRecorder mit der Begründung aufgezeichnet und platformStaff(true). Nur Identifier; die Begründung ist die eigene des Betreibers Worte darüber, warum, nie etwas, was sie weiter zu lesen. - Das Fenster ist 30 Minuten und NON-SLIDING. Der Ablauf ist ein absoluter Augenblick in der Sitzungskörper, kein TTL, so dass die Schiebesitzung nicht verlängern kann, und Re-Besitz von einem zweiten Tab zurückgibt die ursprüngliche Ablauf statt ein weiteres Fenster kaufen. - KSessionService.getSession Masken eine verstrichene Flagge, so dass alle 10 € vorhanden Die Tore von "session.get"godModeActive" ehrern die Zeitbox, ohne sich zu verändern. GET /session/God-Modus schreibt das klare bis zu Redis (im Inneren zu tun getSession würde reurse) und ist, was die UI Umfragen für den Countdown. Bewusst versagt OPEN auf der Prüfung schreiben: Gott-Modus ist, wie Support-Fixes Produktion, und die Verweigerung einer Erhöhung, weil phi_access_log blinked ist schlimmer als eine Reihe hat sich der Blockflöte bereits laut eingeloggt. Keine Entität oder @Column geändert. PhiResourceType gewinnt keine Konstante entweder @Enumeriert(STRING) mit einer CREATE TABLE Value Whitelist, die ddl-auto:update nie erweitert, so dass eine neue Konstante würde jede Einlage scheitern, bis KamoInitializer wurde von Hand geführt. Die Höhe wird gegen den Betreiber eigenen MEMBER aufgezeichnet Aufnahme mit einem ************ Vorsingen statt.
· kamo-internal
Steward-Tabs umordnen; Identifier in eine Pipeline-Feh-Darlehen-Popover falten
Tab-Auflage ist jetzt Pipeline, Dokumente, Underwriting, Preise, Kapital & Risiko, Governance, Gestlage, Katalog - Pipeline wird zum Standard-Landebildschirm. Die Standalone Identifiers Registerkarte ist weg; seine Lookup lebt in der Pipeline Toolbar als kompakter Find-Darlehen Popover: Suche nach Kredit UID (Standard) oder jeden externen Bezeichner (MERS MIN, Agenturfall #, E-Zeichen-Umschlag, etc.) zu seinem Darlehen, mit einer reichen Ergebniskarte, das Darlehen der Kennung Ledger, Lebenszyklus-Geschichte, und ein-Klick öffnen / Show-in-Pipeline.
· kamo-signer-monorepo
Optionen auf der öffentlichen Angebotsseite vergleichen
Optionen machen als wählbare Karten und nicht als Reihen, weil sie die Wahl sind und nicht Ergänzungen. Die Periodensumme ist die Überschrift; das Monatsäquivalent sitzt daneben als die Figur, die unterschiedliche Abrechnungsbedingungen vergleichbar macht, und ein Sparabzeichen erscheint nur, wenn die Differenz ist es wert, Benennung. Der flache Tisch und der kombinierte Totals Block werden beide unterdrückt, wenn Optionen sind vorhanden - eine Gesamtsumme über sich gegenseitig ausschließende Alternativen ist eine Zahl Niemand kann zahlen. Druckregeln halten die Karten nebeneinander, so dass ein gedrucktes Zitat immer noch vergleicht.
· kamo-internal
Autor Multi-Option Zitate aus der Redaktion
Ein Angebot ist entweder ein Pauschalpreisblatt oder eine Reihe von Alternativen, so dass der Herausgeber bietet einen Modus umschalten, anstatt beide auf einmal existieren zu lassen - beides senden würde dem Kunden einen Preis anzeigen, den er nicht kaufen kann. Umschalten auf Optionen trägt die bestehenden Linien in die erste Option, anstatt getippte Arbeit zu verwerfen. Jede Option bekommt seine eigene Linie Artikel, Abrechnung Begriff, Verpflichtungsdauer, Rabatt und Einrichtungsgebühr, mit einer Live-Vorschau der Periode insgesamt, monatlichen Äquivalent, Auftragswert und Einsparungen gegen die Grundlinie. Die Vorschauspiegel QuoteOptionTotals; der Server recomputed on save und seine Zahlen gewinnen. Sitzzahl lebt auf dem Angebot, so 40 - 60 wiederPreise jede Option auf einmal.
· SecurityService
Akzeptieren Sie eine Option auf den öffentlichen Zitat-Endpunkt
Multi-Options-Zitate können nicht blind akzeptiert werden - die Anfrage trägt nun die gewählte OptionUid und der Dienst verweigert die Annahme ohne eine.
· kamo-shared-library
Multi-Option Zitate mit pro Option Vergleich Summen
Ein Angebot kann nun mehrere gegenseitig-exklusive Möglichkeiten zu kaufen präsentieren - monatlich, jährlich, drei Jahre - statt zu zwingen drei separate Dokumente, die driften auseinander, in dem sich die Sitzzahl ändert. - QuoteOption besitzt seine eigenen Linienposten und -summen; Geschwister werden nie zusammengelegt. - QuoteOptionTotals normalisiert jede Option auf ein monatliches Äquivalent, das ist die einzige Grundlage, auf der unterschiedliche Abrechnungsbedingungen verglichen werden können, zuzüglich einer Vertrag insgesamt und Einsparungen gegen die markierte Grundlinie. - Abrechnung Laufzeit und Verpflichtung Länge getrennt bleiben: jährlich zahlen ist nicht die gleiche Verpflichtung wie eine dreijährige Laufzeit, die jährlich abgerechnet wird. - Quote.Menge ist ein gemeinsamer Treiber; eine Linie, die sich bei verwendetQuoteQuantity entscheidet Neupreisen über alle Optionen auf einmal. QuoteTotals ehrt es identisch auf flache Blätter, so dass eine Linie nicht unterschiedlich Preis innerhalb und außerhalb einer Option. - Die Annahme eines Multi-Option-Zitat erfordert die Benennung der Option; Geschwister schließen als NOT_SELECTED und akzeptiertOptionUid nimmt die Wahl auf. QuoteTotalsTest 15, QuoteOptionTotalsTest 11, QuoteShareTokenTest 9 - alle passieren.
· kamo-internal
Lieferabdeckung, Preisbindung, Paneele mit großen Ein- und Aussetzung
Ersetzt die letzten Coming-Soon-Chips (Hedge & Berichterstattung, Preis-Anmelde-Sign-off, Großlagerung) mit Live-Panels verdrahtet, um die neuen Steward-Proxys.
· SecurityService
Steward Proxies für die Abdeckung, Preis-Sabmelde, Groß-Deposit
Operator-gated, Session-stempelt org+member, fail-closed Ownership (kein Cross-Or Existenz Orakel). Neue Endpunkte, die in der nicht authentifizierten Endepunkt-Ratsche ausgegründet sind.
· kamo-shared-library
WORM Preisschild-off-Einheit (mlos_pricing_signoff)
Append-only Steward APPROVE/REJECT Urteil über ein eingefrorene Preis-Ergebnis. @PreUpdate Würfe (eine Umkehr ist eine neue Zeile). Tabelle + 4 Indizes (org, run, resultieren, Darlehen) beantragt, um CockroachDB über KamoInitializer zu prod.
· kamo-internal
Steward-Konsole rund 2 - Ausnahme-Warteschlangen, Governance, MERS recon
- Capital + Underwriting: StewardExceptionQueue (gemeinsames Panel) mit dem Real verkabelt Steward-Tasks Endpoint - Sperren Ausnahmen ************ und Leitlinien Ausnahmen **************** ehrliche leere Zustände. Governance: KalibrierungReliabilityPanel (prognostiziert vs beobachtet pro Segment) und PullThroughFunnelPanel (echter Bühnenvertrieb, als Schnappschuss und keine Kohorte beschriftet Umwandlung). Ersetzte die beiden kommenden Chips. - Dokumente: MERS-Abgleichspanel über die eigentliche interne Führungsaufklärung. Reale Endpunkte durchgehend; Plain-String Kopie (i18n Follow-up); tsc --noEmit clean.
· SecurityService
Gateway-Relayer für Steward-Taks, Kalibrierung/Trichter, MERS-Sessung
Gott-taugliche, org server-gestempelte GET-Relais: **************** ************ MlosDocOrchestration ************ (fail-closed org filter, drops nicht-Bese Paket rows + Re-dert die Zählung). Alle vier in der unbewachten Endepunkte Ratsche (delegiertes Gate() Wache, wie ihre Geschwister).

Euer Universum wartet.
Fügen Sie Produkte hinzu, wann immer Sie möchten – keine Migration, keine neuen Anmeldungen.
Für immer kostenlos – keine Kreditkarte erforderlich