Changelog
Ada kabar baru.
Setiap perbaikan pada platform, sebagai kapal.
· kamo-internal
Sembunyikan departemen kosong, pindahkan filter status ke Direktori
- Departemen tanpa anggota tidak lagi render. Titik akhir departemen mengembalikan setiap departemen di org termasuk yang kosong, sehingga daftar adalah menampilkan bagian yang tidak pernah bisa berisi siapa pun. The per- departemen "tidak anggota "placeholder pergi dengan mereka, menjadi tidak terjangkau sekarang. - Filter All / Online / Offline bergerak dari panel lebar header di bawah strip tab, sehingga duduk di daerah Direktori sendiri dengan daftar itu Filter daripada muncul untuk menyaring seluruh panel (itu tidak pernah diterapkan ke Percakapan atau Akses Mobile). - Keadaan kosong hanya menunjukkan menyesuaikan pencarian / filter ketika salah satu adalah sebenarnya diterapkan; sebuah org tanpa anggota memiliki apa-apa untuk menyesuaikan.
· kamo-internal
Rebuild the slideout as one continuous surface
Member rows now form the department body directly — no card-on-card nesting — and departments run full-bleed with sticky bands, reclaiming ~30px of row width and cutting the chrome before the first member from 228px to ~170px. Layout - Delete the card-in-card stack: rows are flat, hairline-separated, full width. - Sticky department band (ink on an 8% primary tint, never white-on-primary) carrying the disclosure chevron, a live presence meter, an online/total fraction and a Select toggle. Drops the identical per-department Group icon. - One background instead of three stacked gradients; one scroll-edge cue. - Status is carried by a dot on the avatar plus a word only when it adds information, replacing five per-row encodings of the same value. Behavior - Row click opens the 1:1 chat. It previously did nothing: MemberList never passed onClick, so a fully-styled clickable row was inert. - Restore the All/Online/Offline filter, which only existed inside MemberList's header — a branch the live panel never rendered (showHeader={false}), leaving statusFilter pinned to 'all'. Lifted into NavTopPanel beside the search field. - Multi-select gains real affordances: a Select toggle per band, ctrl/cmd-click, and touch long-press; a selection bar rises from the first selection. - One hoisted MeetingDialog instead of one mounted per row, and ownMemberId is threaded down instead of every row fetching /api/user-info. Motion - MotionConfig reducedMotion="user", plus prefers-reduced-motion guards on the CSS keyframes it cannot reach. - Staggered section entrance, framer height-collapse with a rotating chevron, layout-spring row reflow, odometer counts, unread pop, directional tab slides. Accessibility - Real disclosure semantics, ul/li rows, one stretched row button with sibling (not nested) actions, focus trap with focus restore, arrow-key navigation, a polite live region for selection, and >=24px targets. - The panel openers in NavTop were non-focusable Boxes; they are buttons now. - Chats rows were click-only divs with no keyboard path; they are list items with real buttons and accessible names. Theming - New --on-primary token so white text on a light tenant primary is fixable. - Shared availability palette ends the NavTop/MemberItem hue drift, and the hairlines stop referencing --color-primary-rgb, a variable never defined. - Relative timestamps go through Intl on the app locale instead of emitting hardcoded English, and last-active labels tick again via one shared 30s clock.
· SecurityService
Deteksi dan peringatan atas jejak audit perekam-akses
phi _ access _ log telah mengumpulkan bukti tidak ada yang melihat. Yang memuaskan 164.312 (b) - jejak ada - dan tidak memuaskan tentang 164.308 (a) (1) (ii) (D), yang meminta ulasan, atau '164.400- 414, yang jamnya tidak dapat mulai sampai pemberitahuan seseorang. Ini adalah hal yang pemberitahuan. Lima detektor selama jam tertutup, per aktor: BULK _ EXPORT 250 catatan berbeda diekspor / diunduh / diungkapkan MASS _ READ 200 catatan berbeda dibaca Repeated _ denial 10 menolak percobaan (acara - penolakan nama tanpa catatan) OFF _ JAM _ AKSES 20 catatan berbeda di luar minggu Tenant sendiri PLATFORM _ STAFF _ AKSES 1 - entitas tertutup diberitahu terlepas dari pembenaran Counts are DISTINCT record, not event: PhiAccessAuditor emits one LIST row per baris kisi, jadi anggota memuat ulang halaman yang sama empat puluh kali adalah 2.000 peristiwa dan 50 individu - dan "berapa banyak individu" adalah nomor pelanggaran Penilaian terbuat dari. Rasionale untuk setiap baku adalah pada Pengaturan Deteksi; semua dari mereka adalah konfigurasi-tunable, karena detektor yang api terus-menerus akan bermutasi dan detektor lumpur masih dibaca sebagai cakupan. Of- jam dinilai dalam zona penyewa melalui yang ada OFF _ JAM _ AKSES aturan (jam kerja layar keamanan sudah mengumpulkan) kembali ke Organisasi. Timizon. terjadi _ di UTC, sehingga suatu pemeriksaan UTC-anchor akan halaman penyewa Sydney setiap pagi bekerja dan tidak pernah halaman satu New York. Pengiriman ulang apa yang ada: EmailTempateServiceClient - > EmailService / api / email / templat / kirim dengan kunci PHI _ ACCESS _ ALERT canonical baru, ke alamat org telah terdaftar dalam org _ curious _ deception _ rules .notifikasi _ email. Seorang penyewa yang tidak dikonfigurasi mendapatkan log ulasan dan tidak ada yang lain - mengirimkan alamat yang diduga akan mengungkapkan bahwa bernama Anggota pekerja dicurigai. Setiap pencarian log pada suatu dedikasi Logger DETEKSI PHI-; hanya pemberitahuan yang throttled (6h per detektor / penyewa / aktor, di Redis aturan login- anomali sudah digunakan). Alerts membawa Pengenal dan jumlah, tidak pernah catatan. Dua pilihan struktural yang disengaja: - The agregat dijalankan melalui EntityManager, bukan Spring Data @ Query. Spring Data memvalidasi permintaan yang dideklarasikan dengan membuatnya di bootstrap repositori, jadi kesalahan ada gagal context startup - dan SecurityService yang tidak akan mulai mengambil setiap login dengan itu, seperti pada 2026-08-03. Di sini kasus terburuk adalah Periksa log itu dan coba lagi jam depan. Ini juga menghapus paket ini dari @ EnableJpaRepostories pertanyaan seluruhnya: tidak ada kacang repositori, tidak ada untuk Lupakan. Phidetment QueryTest memeriksa setiap path properti secara reflektif sejak tak ada tes dalam layanan ini yang dapat boot konteks. - Setiap query dibatasi oleh organisasi ID pertama. phi _ access _ log hanya indeks dapat digunakan adalah (ORGANIZATION _ ID, OCCURRED _ AT); penyaringan tepat waktu saja full- scan tabel tambahan - hanya tabel yang hanya pernah tumbuh. Scheduling: gabungan taskScheduler (4 thread, sched-), dimana tujuh penyapu sudah berbagi. Ini TIDAK menyentuh eksekusi terjemahan - antrian 3- thread / 500- @ Async pool diamati jenuh - dan tidak ada executor sama sekali. Hourly, lima pengelompokan setiap kumpulan penyewa, tidak ada jaringan I / O di dalam scan, dan a reentricy latch so a slow run skips the next tick rather than stacking Di belakang dan kelaparan kolam renang itu berbagi. Tak ada entitas atau kolom yang ditambahkan atau diubah.
· EmailService
Pratilik variabel untuk PHI _ ACCESS _ ALERT
Tanpa sebuah sampleVariables arm the admin Email Templates preview render every placeholder kosong, jadi siapapun diminta untuk menyetujui kata-kata keamanan waspada melihat meja kosong. Model sampel identifikasi dan hanya dihitung - bentuk yang sama yang membawa peringatan nyata, karena peringatan nyata tidak pernah membawa Rekor.
· kamo-shared-library
PHI_ AKSESS _ ALERT canonical template
Ulasan SecurityService per jam dari phi _ access _ log perlu tempat untuk mengirim apa yang dia temukan. Daripada menciptakan saluran, ia menggunakan yang ada. rel email transctional- yang berarti kunci kanonikal: absen dari CANONICAL _ KEYS Sebuah template tidak pernah dapat dijahit, tidak pernah menyembuhkan diri, dan setiap kirim kembali 404 permanen - sebuah peringatan kontrol yang terlihat seperti cakupan dan tidak memberikan apa-apa. Templat membawa identifier, jumlah dan hanya jendela waktu. Sebuah deteksi artefact yang mereproduksi apa yang terdeteksi telah direlokasi PHI ke dalam inbox tanpa kebijakan penahanan, sehingga tidak ada sengaja placeholder untuk Rekor. PhiAccessAlertTemplateTest pin yang, dan pin dua kegagalan diam mode: placeholder tidak ada persediaan yang dibuat sebagai string kosong dengan hanya WARN, and the renderer does no HTML escape, so anything reaching the body menggunakan kembaran melarikan diri. EmailService harus dikirim kembali dengan shared -lib sebelum SecurityService dimulai mengirim; sampai saat itu pengiriman tertangkap dan pencarian tetap review-log saja.
· kamo-internal
Reflekkanminimum- mask yang diperlukan pada klien (t 164.502 (b)
Keamanan Layanan kini menahan jawaban gubahan dari penelepon yang bukan Assignnee memimpin (dan, di tangan penyewa Phi, bahkan dari pemegang kanan 161). Topeng itu adalah penegakan; ini tidak. Dua jalan masih bypass itu: - Penerbit LeadRealtime menempatkan FULL, LeadDTO tanpa topeng di sekurity.leads.rt. {orgId} - satu muatan menyebar ke setiap pelanggan di org, tanpa proyeksi per- penerima mungkin. Sampai acara yang membawa identifier saja dan refetches klien, app / lib / lead / leadFieldMask.ts adalah satu-satunya hal antara masukan rekan apos; s jawaban dan setiap panel timah terbuka di penyewa. LeadViewClient sekarang berjalan masuk payloads real time melalui itu sebelum semua itu mencapai negara. - Rendering: formulir ditahan dan tidak pernah-diisi-dalam satu tiba mencari identik, sehingga keputusan harus dihitung ulang, tidak dianjurkan. Formulir-gubahan panel tetes nya Edit affordance ketika jawaban dibatasi - menyimpan kosong formulir akan PUT {} atas jawaban nyata, yang server sekarang 403s. Organisasi. HandlesPhi dikirim pada kolom yang ada - > DTO - > Konteks Organ path (entitas org telah menserialisasinya; skema zod dan Organisasi. Dari JSON allow- list adalah link yang hilang), bukan saluran kedua. Tidak ada salinan baru yang dapat dilihat: label "terbatas" memerlukan kunci dalam terjemahan - kamus repo dan sengaja ditinggalkan untuk perubahan itu.
· SecurityService
Minimum- perlu memijat dari ubahan memimpin - formulir jawaban (\ 164.502 (b))
Satu-satunya topeng di platform ini adalah diterapkan oleh LeadController.getLeadById ke penelpon yang bukan dewa maupun assignee dan kurang VIEW _ LEAD _ CONTACT _ INFO _ OTHERS (161). Ini mencakup e-mail, telepon, tanggal kelahiran dan bagian jalan dari alamat mailing / property - dan tidak ada yang lain. custom FormData naik lurus melalui itu, yang merupakan satu tempat di platform a Penyewa kesehatan akan memasukkan pertanyaan masuk dan gejala. LeadFieldMask kini memiliki keputusan dan proyeksi: - org: ubahan jawaban naik dengan mask kontak. Jika Anda mungkin tidak melihat Email timah Anda mungkin tidak melihat apa jawabannya. - HandlesPhi penyewa: jawaban ditahan dari siapa pun memimpin tidak ditugaskan bahkan DENGAN hak 161. Yang benar adalah scoped, dengan namanya sendiri, untuk menghubungi informasi; jawaban gejala bukanlah informasi kontak. Judul formulir berjalan Juga - "Diabetes Intake Pertanyaan" mengabaikan kondisi sendiri. Entri formulir bertahan masking hanya membawa id nya, sehingga UI dapat mengatakan "dibatasi" daripada menggambar kuesioner kosong. org yang tidak akan dimuat Diperlakukan sebagai penanganan Phil, cocok dengan posisi PhiTenantStatus yang tak diketahui. PUT / lead / {id} memperoleh gerbang penulisan simetrik. Penyunting formulir seluruhnya peta hitungan lapangan, jadi tanpa itu anggota menunjukkan kuesioner kosong yang menekan Simpan akan menggantikan jawaban sebenarnya dengan {} - topeng baca akan memiliki menjadi penghapusan diam. Utilitas statik, tidak ada stereotip dan tidak ada repositori: keputusan adalah murni dan penelepon sudah memegang org.
· kamo-internal
PHII akses peninjau audit - org ulasan dan akuntansi per- record
Jejak sedang ditulis dan tidak ada yang bisa membacanya. Ini adalah setengah layar: sebuah review akses orgwide di bawah Pengaturan BaghSecurity, dan "yang telah diakses ini catatan "dialog dibuka dari memimpin itu sendiri, yang merupakan bentuk sebuah 't 164.528 permintaan akuntansi benar-benar tiba - seorang individu bertanya tentang file mereka, bukan seseorang dengan waktu untuk menyaring log global. Tiga hal di sini tidak kosmetik. Penanda waktu mutlak dan selalu nama zona mereka diberikan, dengan satu tombol klik ke UTC. Bukti ini dibaca bulan kemudian oleh seseorang yang tidak ada; sebuah wal-clock kosong dibaca dari zona lain diam-diam salah satu Akses per jam, yaitu perbedaan antara "selama shift" dan "at 3am". Waktu relatif dikecualikan langsung - mereka melayang setiap kali halaman dibuka. Usaha dan akses staf platform ditolak ditandai pada baris (warna, aturan kiri, ikon terkemuka) daripada kiri dalam kolom lompat mata, karena suatu kepatuhan Petugas scan ratusan baris untuk salah satu yang seharusnya tidak berada di sana. Biasa membaca secara sengaja polos: dekorasi semuanya adalah sama sebagai dekorasi Tidak ada. Ditolak outlanks platform- staf ketika baris kedua-Kamo staf yang Menolak adalah baris yang paling menarik yang dapat ditampilkan layar. Ekspor digated pada EXPORT _ ACSESS _ LOGS secara terpisah dari tampilan kanan, dan 503 dari hulu permukaan sebagai "tidak diungkapkan" daripada dilumasi kesalahan generik. EXPORT adalah jenis audit gagal-tertutup: penolakan berarti Pengungkapan tidak dapat direkam, yang merupakan hasil yang benar petugas kebutuhan untuk melihat. Query building, timestamp format dan baris klasifikasi hidup dalam app / lib jadi vitest dapat mencapai mereka, komponen yang berkumpul. A 403 never falls through to grid kosong - "tidak ada yang pernah menyentuh catatan ini" adalah yang paling berbahaya salah Jawab layar ini.
· kamo-internal
Retitle anggota halaman ke Profil, label tab pendek, tambahkan ikon tab
Tajuk halaman pengaturan anggota menjadi "My {memberLabel} Profile" (atau Profil "{memberLabel}" untuk anggota lain) dan link nav-top menjadi Profil saya. Label tab pendek - Kotak surat (s), Telepon, Audio & Video, Izin, Aktivitas - sementara telepon dan bantuan peran mereka penutup kepala deskriptif melalui * * * * * * * * * * * * * * * * * kunci. Setiap tab kini memuat ikon di tab bar; tab kuiri-param id tidak berubah begitu dalam link tetap bekerja.
· kamo-internal
Menggeser warna putih ke warna penuh untuk pingsan
Seorang anggota backgroundTone ui- preferensi (0 putih / 50 warna penuh / 100 hitam) dirender sebagai mencuci di atas scrim baca di kedua konsol lapisan slide dan tahap WYSIWYG editor. Slider tinggal di panggung media chrome dengan pratinjau drag hidup, center snap, dan terus-on-release.
· kamo-internal
Kartu peluncur dan pahlawan menggunakan warna merek org daripada aksen per- module
Kartu pilihan launchpad rumah, drag overlay, dan pahlawan first-org sekarang mengambil aksen mereka dari var (--color-primary) (set dinamis org warna tema) daripada multi- warna tetap --accent- * peta keluarga.
· kamo-internal
Mode dewa gelas - alasan prompt, hitung mundur, indikator berdiri
Mode Tuhan tidak memiliki UI sama sekali dalam kamo- internal: sebuah localStorage boolean bahwa sebuah mount effect mirrored into * * *, re-asserted on every new tab forever. Yang membuat peramban otoritas pada apakah staf platform ditinggikan, dan membuat ketinggian Sesuatu yang bisa kau hadapi tanpa pernah kau putuskan. - GodModeJustificationDialog mendorong untuk alasan sebelum mengangkat. Sebuah alasan mengumpulkan setelah itu adalah alasan tertulis untuk sesuai apa yang sudah dilakukan. Salinan menyatakan jelas apa operator adalah tentang untuk melihat dan bahwa nama mereka berjalan di atasnya. GodModeIndicator adalah bar bawah sepenuhnya lebar ditambah bingkai merah di sekitar seluruh viewport, dengan countdown hidup dan "End now". Seseorang yang lupa mereka berada di modus dewa adalah skenario yang tepat kontrol ada untuk mencegah, sehingga bukan Lencana halus - tetapi pointer- peristiwa: tidak ada di luar bar dan duduk di luar aliran tata letak, sehingga tidak pernah mencegat klik atau aliran layar. - Keduanya dipasang sekali di tata letak akar, sebelah AutomaticLogoff, sehingga indikator hadir dimanapun operator berakhir daripada di layar seseorang ingat. Menyewa apa-apa kecuali sesi good- ELIGIBLE. - Server memiliki negara. app / lib / godMode memegang sebuah toko berkode tunggal; klien hanya pernah membaca expiry SecurityService dicap dan tidak pernah dapat memperpanjang itu setIsGodMode hilang - mengangkat mengambil pembenaran, sehingga tidak dapat berupa Setter. - polling status ganda sebagai jaminan tahan lama: GET / session / God-mode adalah di mana Layanan SecurityService menulis sebuah elevasi elastis dari Redis untuk layanan yang membaca sesi langsung. usplatformAdminGuard sekarang menunggu status dewa untuk sesi-memenuhi syarat. Akses yang digunakan untuk dapat dibaca secara sinkron dari localStorage; tanpa menunggu operator dengan jendela terbuka akan dipantulkan ke / pengaturan dalam jeda. Strings berada di * * * * * * * * * * * * * * * * * * * (didorong pertama, per the build 's clone order). Npx vitest run: 329 berlalu (32 file), 17 dari mereka baru. npx tsc --noEmit: bersih.
· SecurityService
Baca jejak akses PHI - review akuntansi 164.528 dan aktivitas
Jejak telah ditulis untuk sementara waktu dan tidak ada yang bisa membacanya, yang meninggalkan dua kewajiban belum terpenuhi: sebuah perhitungan dari pengungkapan untuk catatan satu individu (= 164.528) dan ulasan aktivitas sistem informasi periodik (164.308) (1) (ii) (D). Keduanya adalah pertanyaan. Ini menambahkan permukaan query. Otorisasi adalah fitur, bukan kisi. Organisasi ini diambil dari sesi dan dari tempat lain - ada sengaja parameter orgId pada apapun handler, dan PhiAuditQueryService adalah titik choke tunggal yang menambahkan penyewa memprediksi sebelum bahkan berkonsultasi filter. Empat metode pencarian saudara akan telah empat kesempatan untuk melupakannya. Scopping adalah sebuah WHERE clause daripada post- filter, karena penyaringan halaman kembali akan meninggalkan totalElements menghitung baris pemanggil mungkin tidak melihat. Sisi baca mendapat antar muka repositori sendiri. PhiAccessLogRepositori Bersama finders sengaja cross- penyewa - benar untuk alat platform, pengungkapan jika diserahkan ke layar pelanggan - sehingga layar mendapat antarmuka yang hanya entri titik mengambil Spesifikasi. Ia hidup di bawah com.kamo. SecurityService, yang masukan @ EnableJpaRepostation telah ditutup, jadi tidak ada perubahan pemindaian yang dibutuhkan Dan tidak ada yang bisa dilupakan. Hak cipta adalah VIEW _ ACCESS _ LOGS (29) dan EXPORT _ ACSESS _ LOGS (32) - pasangan yang sudah gerbang log otentikasi, sehingga siapa saja yang mengelola keamanan hari ini dapat menggunakan ini pada hari pertama. Sebuah id kanan baru akan dikirim layar mati: itu membutuhkan menjalankan KamoInitializer dan hibah sebelum setiap anggota memegang satu. Membaca jejak itu sendiri direkam, sebagai REPORT / SEARCH untuk membaca dan REPORT / EXPORT untuk salinan, termasuk menolak upaya. kriteria pencarian adalah tidak direkam - filter membawa anggota dan catatan ID, dan jejak yang menyimpan apa yang dicari untuk akumulasi identifier itu ada untuk melindungi. Semuanya terbatas: penjepit ukuran halaman menjadi 200, sebuah tutup ekspor pada 10.000 baris. Jejak enam tahun adalah jutaan baris dan lapisan penangkapan menulis satu baris per grid baris per load, sehingga ukuran unclamped adalah OOM terjangkau daripada sebuah Teori satu. Penanda waktu meninggalkan sebagai instant UTC eksplisit. Kolom adalah zone- kurang wall-clock, dan bukti ini dibaca bulan kemudian oleh seseorang yang tidak ada di sana.
· kamo-internal
Layar pendaftaran MFA dan kontrol batas PHI mode Tuhan
Dua pengaturan permukaan untuk backends yang tidak ada. MFA pendaftarannya (setting Affymy profile ffign- in Security, self only). Layanan SecurityService telah lengkap dan sepenuhnya tidak bisa dihubungi, jadi MFA ada dan tidak ada orang di platform bisa menyalakannya. The tab sendiri-hanya karena mereka titik akhir menyelesaikan pengguna dari sendiri penelepon sesi dan tidak mengambil parameter pengguna - sebuah admin membuka profil orang lain akan mendaftarkan keaslian mereka sendiri pada layar itu. Kode QR menggunakan qrcode.conact, sudah sebuah ketergantungan; tidak ada paket yang ditambahkan. The rahasia ditampilkan di sampingnya terlepas dari itu, karena aplikasi otentikasi pada sama perangkat sebagai peramban tidak dapat memindai layar itu meliputi. Dua jalur kegagalan mendapat penanganan kelas pertama daripada kesalahan umum. A 409 berarti faktor dikonfirmasi sudah ada dan mengatakan demikian, dengan obat ( reset administrator) - memberitahu pengguna untuk mencoba kembali akan mengirim mereka kembali ke satu tindakan yang tidak bisa berhasil. Sebuah kode konfirmasi yang salah terus tertunda pendaftar: rahasia ditampilkan sekali, sehingga mengabaikan itu berarti menghapus entri otentikasi dan pembatalan, dan daftar tunggu server masih akan berada di sana, sehingga retry akan kembali 409 dan untai mereka. Kode pemulihan ditampilkan sekali dan tidak dapat diterbitkan kembali. Dialog tidak dapat diberhentikan dengan melarikan diri, latar belakang atau tombol tutup; Selesai membuka hanya setelah kode telah disalin atau diunduh DAN peringatan diakui. Keduanya dibutuhkan: sebuah kotak cek saja diklik secara refleks, dan papan klip saja overwritten oleh salinan berikutnya - dan tidak terlihat salah sampai hari pengguna Kehilangan ponsel mereka. Batas Phi (pengaturan DAFTAR PADAS Data, hanya Tuhan yang memenuhi syarat). tab adalah terlihat ke operator yang-memenuhi syarat dan kontrol di dalam membutuhkan mode dewa actually switch on, which SecurityService re- checks; eligibility alone is not Aktivasi. Tidak pernah membalik tanpa daftar pertama modul yang berhenti bekerja - daftar yang berasal dari server, berasal dari PhiModule melalui PhiTenantGuard, sehingga tidak dapat menyimpang dari apa yang dipaksa. Sebuah 503 adalah muncul sebagai "Perubahan tidak diterapkan karena tidak dapat direkam", karena itu adalah apa yang terjadi. Logika Keputusan hidup dalam aplikasi / lib / keamanan sehingga vitest dapat mencapainya; komponen tahan rendering saja. Verifikasi: npx vitest run - 329 tes, 32 file, semua lewat (43 dari mereka baru). npx tsc --noEmit laporan hanya tiga error dalam * * * * * * * * * * * * * * berkas yang tidak terlacak dari sesi lain di pohon ini, tidak ada di berkas di sini.
· SecurityService
Endpoint untuk dibaca dan memindahkan batas HIPAA organisasi
Organisasi. HandlesPhi telah ada sebagai kolom tanpa cara untuk mengaturnya, jadi PhiTenantGuard telah menegakkan bendera tidak ada yang bisa menghidupkan. Ini adalah hilang setengah: GET / PUT / API / keamanan / phi / penyewa. Authority is god eligibility and an active godModeActive toggle, never one. Eligibilitas sendiri adalah apa yang meninggalkan platform dewa gerbang mati sampai 2026-07- 22; di sini itu akan membiarkan setiap operator yang memenuhi syarat mematikan sebuah modul penyewa hidup dengan satu klik yang tak biasa. Target selalu sesi pemanggil sendiri org - tidak ada parameter organisasi Id, sehingga tidak ada permintaan buatan dapat mencapai Penyewa penelepon belum di dalam. fiEffectiveDate dicap pada enable pertama dan tidak pernah ditulis ulang, termasuk pada kemudian non-aktifkan / re-enable. Ini scopes breach-penilaian dan menahan jendela, sehingga bergerak ke depan akan diam-diam mengecilkan periode di bawah ulasan, dan audit tanggal aplikasi dapat memajukan bukan bukti. Baris audit ditulis sebelum bendera bergerak, dan KONFIGURE gagal ditutup, jadi jejak yang tidak dapat ditulis menolak perubahan dan kembali 503 daripada meninggalkan batas yang bergerak tanpa catatan kapan. Percobaan ditolak adalah Recording too. Setiap baris membawa identifier dan transisi saja, tidak pernah isi. block Modules diturunkan dari PhiModule melalui PhiTenantGuard daripada PhiTenantGuard terdaftar, jadi peringatan UI menunjukkan tidak dapat menyimpang dari apa yang pasukan penjaga. Tidak ada paket repositori baru: Repositori Organisasi telah dalam layanan ini @ EnableJpaRepositories daftar, sehingga tidak ada untuk menambahkan bersama kacang ini. Verifikasi: 298 tes, 1 error - * * * * * * * * * * * * * * * * * * EntityManager NPE, yang sebelumnya sudah ada (baseline pada 7968aw21: 281 tes, sama 1 error). RepositoryScanCovereTest dan * * * * * * * * * * * * * * keduanya lewat.
· kamo-internal
Bangun ulang bentuk kutipan sebagai arus yang dipandu, tambahkan pratinjau keluaran
Tab rincian adalah tumpukan rata kotak yang memberikan setiap bidang yang sama berat, sehingga tidak ada sinyal yang memasukkan benar-benar mengubah apa pelanggan melihat. Ini sekarang dibaca sebagai empat keputusan kutipan dibuat dari - apa itu untuk, apa yang sedang dijual, bagaimana disesuaikan, apa pelanggan baca - masing-masing dengan satu-baris alasan itu penting, dan berjalan total duduk di rel lengket daripada terkubur di bagian bawah. Pergerakan membawa makna daripada dekorasi: bagian tiba secara berurutan, bidang kondisional mengembang dari kontrol yang mengungkapkannya, area harga cross- memudar ketika bentuknya berubah, dan jumlah total ke nilai baru sehingga sebuah salah gaya Harga unit diperhatikan bukannya diam-diam diserap. Semua itu menghormati Lebih memilih mengurangi gerakan. Aksi Pratilik baru membuat dokumen selesai - letterhead, pilihan atau tabel, Totals, istilah - dan cetakan sendiri. Ini proyek negara penyunting CURRENT, bukan simpan catatan, karena saat Anda perlu melihat kutipan selesai ketika memutuskan akan mengirimkannya. Branding berasal dari server resolusi sendiri sehingga dilihat letterhead adalah salah satu pelanggan mendapat, dan pilihan aritmetik diimpor dari penyunting daripada diimplementasikan ulang.
· kamo-shared-library
Udit kosa kata untuk perubahan ke batas kepatuhan itu sendiri
Tambahkan PhiResource Type.ORGANIZATION dan PhiAccesCind.CONFIGURE sehingga itu memutar Organisasi. HandlesPhi hidup atau mati dapat dicatat sebagai apa itu. Setiap nama tipe sumber daya yang ada catatan seseorang. Mengisi perubahan Postur kepatuhan penyewa di bawah salah satu dari mereka akan menaruh kebohongan di di164.528 dan "kapan penyewa ini menjadi entitas tertutup mitra bisnis "adalah pertanyaan sisa jalan adalah scoped terhadap - ia membutuhkan bentuk baris sendiri, bukan pinjaman satu. KONFIGURE gagal ditutup karena alasan yang berbeda dari jenis massal: tidak ada yang Diungkapkan, sehingga menolak biaya operator coba ulang, sedangkan batas yang bergerak tanpa catatan kapan keadaan a '164.402 penilaian tidak dapat merekonstruksi. Tidak ada implikasi skema. phi _ access _ log.RESOURCE _ TIPE dan AKSESS _ KIND adalah plain VARCHARs dibuat oleh PhiAccessLogTableMigrasi tanpa cek enum whitlist, jadi konstanta tidak membutuhkan sebuah jalankan KamoInivalizer sebelum dapat dimasukkan, dan tidak ada entitas atau @ Kolom tersentuh. Diverifikasi tidak ada switch melelahkan atas baik enum ada dalam layanan apapun.
· SecurityService
Sajikan tampilan pelanggan-menghadap ke staf untuk pratinjau
GET / {uid} / pratinjau mengembalikan PublicQuoteView yang sama yang melayani link berbagi, dari resolusi QuotePresentation yang sama, sehingga letterhead yang telah terlihat tidak dapat berbeda dari dikirim Satu. Ini sengaja tidak mint token, menghitung pandangan atau merekam acara - mencari di draft Anda sendiri tidak pelanggan keterlibatan, dan membiarkan ke dalam jejak aktivitas akan membuat tampilan counter berguna sebagai sinyal.
· ConversionService
Scan uploads for malware at ingest (§164.308(a)(5)(ii)(B))
The document vault accepted arbitrary uploads with no malware scanning anywhere on the platform, and it is multi-tenant — a file one org uploads is opened by another org's users through the viewer, the WOPI editor and the binder. ClamAV over INSTREAM, spoken directly to clamd (no client library; the protocol is a socket and a length prefix). The gate runs in ImagingUploadController on /upload and /templates/upload, before the member lookup and before any bytes reach MinIO — scanning after storage leaves the object retrievable for the width of the race. Scanner-unreachable behaviour is FAIL OPEN by default, and that is a decision rather than an accident. clamd is not deployed yet: this is the application half, and the deployment is a separate operational act (KlusterServices auto-applies on push and is not this change's to touch). Shipping fail-closed would take document upload down for every tenant the moment the image rolls, with no staging in which that would have been caught. Fail-open here is not "no protection", it is the status quo of the last several years, now logged at ERROR every time it happens. Every knob — including fail-closed — lives in kamowsconversion-config, so tightening it once clamd is stable is a configmap edit and a restart, not a release. A circuit breaker bounds the cost of an absent scanner: after 3 consecutive failures the guard stops dialling for 60s, so uploads do not each pay a connect timeout for a control that is effectively off. On detection: 422 naming the signature (not a 5xx — retrying will not help), the bytes are preserved in a dedicated quarantine bucket rather than dropped, and the rejection is recorded through PhiAccessRecorder. The audit row carries identifiers only; the uploaded filename stays out of it because filenames here routinely contain borrower names. PhiAccessKind has no UPLOAD member and adding one would alter an @Enumerated(STRING) column's constraint in the shared library, so DOWNLOAD + permitted=false is used and the reason is documented at the call site. Also switches this service's PHI trail to the durable phi_access_log writer. The matching com.kamo.z.shared.phi.audit entry is in the same commit's @EnableJpaRepositories list, and PhiAuditRepositoryScanTest fails the build if the two ever drift — that pairing is what took every login down on 2026-08-03. Retro-scan (POST **************** sweeps documents already in the vault, tenant-scoped and paged. It reports and preserves, never blocks or deletes: making a stored object unretrievable needs a persisted quarantine flag, i.e. a shared-library column applied by a hand-run initializer while service CI builds against main, and deleting on a false positive would destroy a tenant's record with no recovery. Tests: 36 new. Pre-existing **************** at_or_below_1080 still fails on a clean tree; untouched. Not covered, deliberately: RecordingIngestController (internal-auth Asterisk push) and DocsService's WOPI PutFile are second ingest paths that want the same gate, but the scanner lives in this service and WOPI has no *** token to attribute an audit row to. Both are follow-ups, not oversights.
· SecurityService
Mode break- glass god - perataan + 30- minute time- box
Modus Tuhan diaktifkan diam-diam dan berlangsung selama sesi. Itu adalah kontrol entitas tertutup 's review keamanan mendorong paling keras pada, karena "Anda staf dapat membaca data pasien kami "selalu ditanyakan dan tidak dibenarkan, tak berdasar ketinggian tidak memiliki jawaban untuk itu. - POST / api / keamanan / sesi / mode tuhan sekarang membutuhkan pembenaran yang diketik ke Mundur. Melangkah turun tidak pernah tidak - kontrol yang gerbang tindakan aman adalah kontrol yang membuat operator meningkat. - Kedua ujung direkam melalui PhiAccessRecorder dengan pembenaran dan PlatformStaff (true). Pengenal saja; pembenaran adalah milik operator kata-kata tentang mengapa, tidak pernah apa-apa mereka pergi untuk membaca. - Jendelanya 30 menit dan NON- SLIDING. Yang kadaluarsa adalah sebuah instan mutlak dalam tubuh sesi, bukan TTL, sehingga sesi geser menyegarkan tidak dapat memperpanjang itu, dan mengembalikan pernyataan dari tab kedua mengembalikan kadaluarsa asli daripada membeli jendela lain. - KSesionService.getSection mask an lapased flag, so all ~ 10 existing 'session.get ("godModeActive")' gerbang menghormati waktu- kotak tanpa perubahan. GET / session / God-mode menulis clear through to Redis (melakukannya di dalam getsession akan berulang) dan adalah apa yang UI jajak pendapat untuk hitung mundur. Secara sengaja gagal membuka audit menulis: mode Tuhan adalah bagaimana dukungan perbaikan produksi, dan menolak ketinggian karena phi _ access _ log berkedip lebih buruk daripada baris perekam telah login keras. Tidak ada entitas atau @ Kolom berubah. PhiResourceType tidak memperoleh konstanta baik - itu @ Enumerated (STRING) dengan nilai whitlist DAPAT KREATE bahwa ddl- auto: update tidak pernah melebar, sehingga konstanta baru akan gagal setiap insert sampai KamoInitializer dijalankan dengan tangan. elevasi direkam terhadap operator sendiri MEMBER catatan dengan sebuah prefix * * * * * * * * * * * * * lebih baik.
· kamo-internal
Urutkan ulang tab steward; lipatan Pengenal ke dalam sebuah popover baris pipa
Urutan tab kini adalah Pipeline, Dokumen, Underwriting, Harga, Capital & Risk, Pemerintah, Hambatan, Catalog - Baris pipa menjadi layar pendaratan baku. Tab identifikasi standar hilang; penelusuran hidup di pipa toolbar sebagai popover compact Find-loan: pencarian oleh UID pinjaman (baku) atau menyelesaikan identifikasi eksternal apapun (MES MIN, kasus agensi #, e- sign amplop, untuk pinjaman tersebut, dengan kartu hasil yang kaya, buku identifier pinjaman, sejarah lifecycle, dan satu- klik terbuka / show-in- pipeline.
· kamo-signer-monorepo
Bandingkan opsi pada halaman kutipan publik
Opsi render sebagai kartu pilihan daripada baris, karena mereka adalah pilihan Dan bukan tambahan. Totalnya adalah judul, setara bulanan duduk di sampingnya sebagai angka yang membuat istilah penagihan yang berbeda sebanding, dan lencana tabungan muncul hanya ketika perbedaan layak penamaan. Tabel datar dan blok total gabungan keduanya ditekan ketika opsi sekarang - sebuah total grand di alternatif yang saling eksklusif adalah sebuah angka tidak ada yang bisa membayar. Aturan pencetakan menjaga kartu berdampingan sehingga kutipan yang dicetak masih dibandingkan.
· kamo-internal
Penulis multi- pilihan kutipan dari penyunting
Kutipan adalah lembar harga datar atau seperangkat alternatif, sehingga penyunting menawarkan sebuah mode toggle daripada membiarkan keduanya ada sekaligus - mengirim keduanya akan menunjukkan pelanggan harga yang tidak bisa mereka beli. Beralih ke opsi membawa baris yang ada ke pilihan pertama daripada mengabaikan pekerjaan diketik. Setiap opsi mendapat item sendiri baris, jangka penagihan, panjang komitmen, diskon dan biaya setup, dengan pratinjau langsung dari periode total, setara bulanan, nilai kontrak dan tabungan terhadap dasar. Cermin pratinjau QuoteOptionTotals: server menghitung ulang pada menyimpan dan angka-angkanya menang. Jumlah kursi hidup pada kutipan, jadi 40 - > 60 harga ulang setiap pilihan sekaligus.
· SecurityService
Terima opsi pada titik akhir kutipan publik
Kutipan pilihan multi- tidak dapat diterima buta - permintaan sekarang membawa pilihan pilihan pilihan dan layanan menolak penerimaan tanpa satu.
· kamo-shared-library
Kutipan pilihan multi- dengan total perbandingan per-pilihan
Kutipan kini dapat menampilkan beberapa cara eksklusif untuk membeli - bulanan, tahunan, tiga tahun - bukan memaksa tiga dokumen terpisah yang hanyut terpisah saat jumlah kursi berubah. - QuoteOption memiliki sendiri item baris dan total; saudara tidak pernah meringkas. - QuoteOpsionals normalisasi setiap opsi untuk ekuivalen bulanan, yaitu satu-satunya dasar di mana istilah penagihan yang berbeda dapat dibandingkan, ditambah kontrak total dan tabungan terhadap baseline ditandai. - Istilah tagihan dan panjang komitmen tetap terpisah: membayar per tahun tidak komitmen yang sama seperti tiga tahun jangka ditagih per tahun. - Quote.kuantitas adalah driver bersama; sebuah baris memilih dalam dengan usesQuoteQuantitas Harga kembali di setiap pilihan sekaligus. QuoteTotals menghormati identifikasi pada lembar datar sehingga garis tidak dapat harga berbeda di dalam dan di luar pilihan. - Menerima sebuah pilihan multi- quote membutuhkan penamaan pilihan; saudara dekat sebagai Tidak terdaftar dan diterima Pilihan Uid merekam pilihan. QuoteTotalsTest 15, QuoteOptionTotalTest 11, QuoteShareTopenTest 9 - semua lulus.
· kamo-internal
Cakupan pengiriman, harga sign- off, large- deposit panel
Mengganti chip Akhir-segera (Hedge & cakupan, Harga sinyal-off, Large- deposit) dengan panel hidup kabel ke proxy steward baru.
· SecurityService
Proksi steward untuk cakupan, harga sign- off, large- deposit
Operator- gated, sesi - dicap org + anggota, kepemilikan fail- tertutup (tidak ada cross-org keberadaan peramal). Titik-akhir baru baselined dalam ratchet unauthenticated- titik akhir.
· kamo-shared-library
Worm pricing signing-off entity (mlos _ pricing _ signoff)
Appent- hanya pelayan APPROVE / REYECT penilaian pada hasil yang mahal beku. @ PreUpdate melempar (pembalikan adalah baris baru). Tabel + 4 indeks (org, jalankan, hasil, pinjaman) diterapkan untuk prod CockroachDB melalui KamoInitializer.
· kamo-internal
Konsol steward putaran 2 - kecuali antrian, pemerintahan, pengintaian MERS
- Capital + Underwriting: Antrian Ekstra Pramugari (panel bersama) tersambung ke yang sebenarnya pramugari-tugas titik akhir - kunci pengecualian Dan... Pengecualian garis panduan * * * * * * * * * * * * * * * jujur negara-negara kosong. - Gubernur: RelibilityPanel Kalibrasi (prediksikan vs diamati per segmen) dan Pullalong FunnelPanel (distribusi panggung nyata, berlabelkan snapshot bukan sebuah kod konversi). Mengganti dua chip yang akan datang. - Dokumen-dokumen: panel rekonsiliasi Merers atas penelitian nyata - buku besar membaca. Titik akhir yang nyata di seluruh; salinan ringkasan-string (i18n diikuti-up); tsc --noEmit bersih.
· SecurityService
Gateway relays untuk tugas-tugas pramugari, kalibrasi / corong, Perbaikan Mens
god- qualted, org server- stamped GET relays: * * * * * * * * * * * * * * * * * * * * * * * * * * * MlosDocOrchestration * * * * * * * * * * * * * * * (Filter org tertutup, tetes paket tidak dimiliki baris + re- menghasilkan penghitungan). Semua empat baslined dalam unguarded- titik akhir ratchet Mereka adalah saudara kalian juga yang pantas bergabung bersama kalian.

Alam semestamu menunggu.
Mulai gratis dalam beberapa menit. Tambahkan produk kapanpun Anda siap — tidak ada migrasi, tidak ada login baru.
Gratis selamanya — tidak diperlukan kartu kredit