콘텐츠로 건너뛰기
KAMOUniverse

변경 로그

무슨 일이야?

플랫폼에 대한 모든 개선 사항, 그것이 선적.

  1. · kamo-internal

    빈 부서 숨기기, 상태 필터를 디렉토리로 이동

    - 회원이 더 이상 렌더링되지 않는 부서. 에 의해 출발점 빈 것들을 포함한 org의 모든 부서를 반환하므로 roster는 누구도 포함할 수 없었던 부분을 표시합니다. 출발 "no 회원" placeholder가 그들과 함께 간다, 지금 접근 할 수없는. - 모든 / 온라인 / 오프라인 필터는 아래 패널 전체 헤더에서 이동 탭 스트립, 그래서 그것은 로스터와 디렉토리의 자신의 영역에 앉아 필터 대신 전체 패널을 필터링 (그것은 결코 적용되지 않음) 채팅 또는 모바일 액세스). - 빈 상태는 단지 1개가 있을 때 search/filter를 조정하는 건의합니다 실제로 적용; 회원이없는 org는 조정할 수 없습니다.

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

  3. · SecurityService

    기록 접근 감사 길에 대한 탐지 및 경고

    phi access log는 증거를 축적하지 않았습니다. 그 satisfies §164.312(b) — 트레일은 존재한다 — 그리고 아무것도에 대한 만족 §164.308 (a) (1) (ii) (D), 이는 검토, 또는 §164.400-414, 누가 시계를 요청 누군가 통지까지 시작할 수 없습니다. 이것은 예고한 일입니다. 닫히는 시간, 배우 당에 5개의 발견자: BULK EXPORT 250 명백한 기록 수출/ 다운로드/닫히는 MASS READ 200개의 명백한 기록 읽기 REPEATED 덴셜 10 거부된 시도 (일부 — 거부 이름 없음 기록) OFF HOURS 액세스 TENANT의 자신의 주 밖에 20 개의 명백한 기록 플랫폼 STAFF ACCESS 1 - 해당 법인은 정당화에 관계없이 말했다. Counts are DISTINCT record, not events: PhiAccessAuditor는 하나의 LIST 행을 방출 그리드 행 당, 그래서 회원은 동일한 페이지를 다시로드하는 것은 2,000 이벤트 그리고 50명의 개인들 — 그리고 “많은 개인”은 형제가 되는 숫자입니다. 평가가 이루어집니다. 모든 기본 Rationale는 PhiDetectionSettings에 있습니다; 그들 모두는 configmap-tunable, 끊임없이 불을 발견기 때문에 muted와 muted 발견자를 여전히 적용으로 읽습니다. Off-hours는 기존의 OFF HOURS ACCESS를 통해 10개의 영역에서 판단됩니다. 규칙 (시큐리티 스크린은 이미 수집합니다) 조직.timezone. result at는 UTC이므로 UTC-anchored 체크가 페이지 시드니 테넌트 매일 아침과 뉴욕을 결코 찾지 못했습니다. 납품은 존재하는 것을 재사용합니다: EmailTemplateServiceClient -> 이메일서비스 /api/email/templates/send with a new PHI ACCESS ALERT canonical key, 에 org suspicious detection rules에 이미 등록한 org 주소를 입력하십시오. .notification 이메일. 구성되지 않은 열렬한 리뷰 로그와 다른 것은 아무것도 - 추측 된 주소를 메일링하는 것은 이름을 공개 workforce 일원은 suspicion의 밑에 있습니다. 모든 발견은 헌신적으로 기록됩니다. PHI-DETECTION logger; 단지 알림은 검출기/텐트/당 (6h)입니다 actor, Redis에서 로그인 권한 규칙 이미 사용). 연락처 식별자 및 수, 기록이 없습니다. 2개의 deliberate 구조상 선택: - EntityManager를 통해 집계는 Spring Data @Query가 아닙니다. 봄 봄 Data는 저장소 bootstrap에서 생성하여 선언된 쿼리를 검증합니다. 실수는 컨텍스트 시작을 실패 — and the securityService that will not 2026-08-03에 따라 모든 로그인을 시작합니다. 여기 최악의 경우 로그와 retries 다음 시간 청소. 또한이 패키지를 제거합니다. @EnableJpaRepositories 질문은 완전히: 저장소 bean 없음, 아무것도 이름 * PhiDetectionQueryTest는 모든 속성 경로가 반영적으로 확인합니다. 이 서비스에 대한 테스트는 컨텍스트를 부팅 할 수 없습니다. - 모든 쿼리는 조직 ID에 의해 처음 수행됩니다. phi access log의 전용 사용 가능한 인덱스는 (ORGANIZATION ID, OCCURRED AT); 혼자 시간에 필터링 풀 스칸은 이제까지 자라낸 테이블입니다. 일정: 이 작업에 참여하기Scheduler (4 스레드, sched-), 이는 7 개의 청소 이미 공유. 그것은 번역을 만지지 않습니다 - 3 번 / 500 큐 @Async Pool은 포화를 관찰하고 모든 실행자를 제출합니다. 시간, 5개의 그룹화한 집합, 검사 안쪽에 네트워크 I/O 없음, 및 reentrancy 래치 그래서 느린 실행은 겹쳐 쌓이기 보다는 오히려 다음 진드기를 건너 뒤에 그것과 그것을 공유하는 풀을 달아. 법인 또는 열이 추가되거나 변경되지 않았습니다.

  4. · EmailService

    PHI ACCESS ALERT의 미리보기 변수

    SampleVariables 팔 없이 관리자 이메일 템플릿 미리보기는 모든 렌더링 placeholder blank, 그래서 누구든지 보안의 낱말을 찬성하는 것을 요구됩니다 alert는 빈 테이블을 참조하십시오. 샘플 모델 식별자 및 계산 만 — 같은 모양은 실제 경고를 운반하기 때문에, 실제 경고는 결코 운반하지 않습니다 이름 *.

  5. · kamo-shared-library

    PHI ACCESS ALERT 대문자 템플릿

    SecurityService의 phi access log의 시간별 리뷰는 어딘가에 보내야 합니다. 무엇을 찾을 수 있습니다. 채널을 발명하는 것보다 그 존재를 사용 거래-이메일 레일, 이는 canonical 키를 의미: absent from CANONICAL KEYS 템플릿은 결코 씨앗이 될 수 없습니다, 절대 자기 치유, 그리고 모든 반환을 반환 영구 404 - 적용처럼 보이는 경고 제어 그리고 아무것도 전달. 템플릿은 식별자, 수 및 시간 창 만 수행합니다. 비밀번호 발견 된 것을 재현 한 artefact는 PHI를 inbox로 재구성했습니다. 보존 정책이 없으므로 위약금은 없습니다. 이름 * PhiAccessAlertTemplateTest 핀, 그리고 두 개의 침묵 실패를 핀 modes: placeholder는 어떤 공급이 빈 문자열로만 렌더링합니다. WARN, 그리고 렌더링자는 HTML escaping, 그래서 아무것도 몸에 도달 탈출 된 트윈을 사용합니다. EmailService는 SecurityService가 시작되기 전에 이 공유된 lib로 redeploy해야 합니다. 전송; 그 때까지 전송은 붙잡고 발견은 검토로만 체재합니다.

  6. · kamo-internal

    클라이언트에 리드 최소 필요 마스크를 미러 (§164.502 (b))

    보안 보안 이제 서비스가 아닌 콜러의 맞춤 정보 답변 리드의 할당 (그리고, 핸들에서Phi tenant, 심지어 오른쪽의 홀더에서 161). 그 마스크는 시행; 이것은 아니다. 두 가지 경로는 여전히 그것을 우회 : - LeadRealtimePublisher는 FULL, unmasked LeadDTO에 넣어 security.leads.rt.{orgId} - 모든 구독자에게 1개의 페이로드가 팬을 추가했습니다. 가능합니다. 그 행사까지 식별자 및 클라이언트 refetches, app/lib/leads/leadFieldMask.ts는 colleague's intake 답변과 모든 열린 리드 팬들 사이의 유일한 것 10 년. LeadViewClient는 이제 실시간 페이로드를 실행합니다. 어떤 상태에 도달하기 전에. - 렌더링 : withheld 양식과 결코 채워진 한 도착 동일하게, 그래서 결정은 재결합되지 않은. 사용자 정의 pane는 응답이 제한될 때 편집 감당류를 떨어뜨립니다 — 공백을 저장하십시오 양식은 실제 답변을 통해 PUT {}, 서버는 이제 403s 어쨌든. Organization.handlesPhi는 기존의 열에 전달됩니다 -> 사이트맵 OrgCon텍스트 경로 (org entity 이미 serialises 그것; zod schema 및 Organization.fromJSON 허용 목록은 누락 된 링크였다), 두 번째 채널이 아닙니다. 새로운 사용자 접근 가능한 사본 없음: explanatory "restricted" 상표는 열쇠를 안으로 필요로 합니다 번역 사전 repo 및 그 변경을 위해 deliberately 왼쪽.

  7. · SecurityService

    납 사용자 정의 형 답변 (§164.502 (b)의 최소 필요성 마스킹

    플랫폼의 유일한 분야 가면은 *********** 적용됩니다 으로 LeadController.getLeadById 으로 전화하는 사람 누구도 신도 아니다 할당자와 VIEW LEAD CONTACT INFO OTHERS (161)가 부족합니다. 이메일, 전화, 날짜를 다룹니다 mailing/property 주소의 탄생과 거리 부분 — 그리고 아무것도 다른. customFormData rode straight through it, 이는 플랫폼에 한 곳입니다. 의료 기관은 실제로 입구와 증상을 넣을 것입니다. LeadFieldMask는 이제 결정과 투영을 소유합니다. - 모든 org: 접촉 가면을 가진 주문 모양 대답 탐. 당신이 볼 수없는 경우 납의 전자 메일 당신은 그것이 대답하는 것을 볼 수 없습니다. - handlesPhi tenants : 답변은 누구나 납이 할당되지 않습니다. 161까지. 그 권리는 자신의 이름에 의해 범위, 접촉 정보; symptom 대답은 정보를 접촉하지 않습니다. 양식 제목은 너무 — "Diabetes Intake Questionnaire"는 자체에 상태를 공개합니다. 양식 입력은 id 만 나르는 마스킹 생존, 그래서 UI 말할 수 있습니다 "restricted" 오히려 빈 설문지를 그리기보다. 로드하지 않는 org는 PHI-handling으로 치료, PhiTenantStatus의 UNKNOWN-denies 자세 일치. PUT /leads/{id}는 대칭문을 얻습니다. 양식 편집기 PUTs 전체 fieldValues 지도, 그래서 없이 회원은 눌러지는 공백 설문지를 보여주었습니다 Save는 {}으로 실제 답변을 대체했습니다. — read mask will have 자동 삭제 정적 유틸리티, 스테레오 타입 및 저장소 없음 : 결정은 순수하고 콜러는 이미 org를 보유하고 있습니다.

  8. · kamo-internal

    PHI 액세스 감사 뷰어 - org 검토 및 per-record 회계

    길을 썼고 아무것도 읽을 수 없었다. 이것은 스크린 반입니다: org-wide access review under Settings → Security, 그리고 "이번에 액세스했습니다. 기록" 대화 상자는 지도 자체에서 열었습니다, 이는 모양입니다 §164.528 accounting request 실제로 도착 — 그들의 파일에 대해 묻는 개인, 글로벌 로그를 필터링 할 때 누군가가 아닙니다. 여기에 세 가지가 화장품이 아닙니다. Timestamps는 절대이며 항상 그들이 렌더링 된 영역, 와 UTC로 전환합니다. 이 증거는 나중에 누군가가 읽은 달입니다. 아니 현재; bare 벽시 다른 영역에서 읽는 조용히 잘못 시간에 의해 액세스, "변화"와 "3am"의 차이입니다. 상대 시간은 예외입니다. - 그들은 페이지가 열 때마다 드리프트합니다. Denied attempts and platform-staff access are looks on the row (tint, 왼쪽 규칙, 아래 아이콘) 열을 왼쪽보다는 눈 건너뛰기 때문에 준수 임원은 수백 개의 행을 스캔해야 할 하나. * 이름 reads are deliberately Plain: 모든 것을 꾸미는 것은 꾸미기와 동일하다 아무것도. 행이 모두 될 때 Denied outranks platform-staff - Kamo 직원 거부는 가장 흥미로운 라인 화면을 표시 할 수 있습니다. 수출은 EXPORT ACCESS LOGS에서 오른쪽으로 표시되며 503 상류에서 표면은 "노팅이 공개되지 않았음"으로 부드럽게 일반적인 오류로. EXPORT는 실패 닫히는 감사 종류입니다: refusal는 의미합니다 disclosure는 기록될 수 없었다, 이는 정확한 outcome 임원 필요 으로 Query Building, timestamp formatting 및 row 분류는 app/lib에서 살고 있습니다. vitest는 그(것)들을 도달할 수 있습니다; 성분은 집합입니다. 403 절대로 떨어졌다 빈 그리드 - "이 레코드를 만지지 않았습니다"는 가장 위험한 잘못입니다. 이 스크린이 줄 수 있는 대답.

  9. · kamo-internal

    Retitle 회원 페이지 프로필, 단축 탭 라벨, 탭 아이콘 추가

    회원 설정 페이지 헤더가 "My {memberLabel} Profile"(또는 "{memberLabel} Profile" 의 또 다른 회원입니다. 내 프로필. 탭 라벨 단축 - Mailbox (s), 전화, 오디오 및 비디오, 권한, 활동 - 전화 및 역할 동안 helpTips는 자신의 유지 새로운를 통해 원고 헤드링 **************** 키. 모든 탭은 이제 탭 바에 아이콘을 운반합니다. 탭 쿼리-param ids 너무 깊은 링크가 작동하지 않습니다.

  10. · kamo-internal

    톤 슬라이더 - 블랙 아웃에 전체 색상에 흰색 세척

    개인 배경Tone ui-preference (0 흰색 / 50 풀 컬러 / 100 black) readability scrim 위에 씻어내어 콘솔 모두 슬라이드 쇼 층과 편집기의 WYSIWYG 단계. 슬라이더는 단계의 삶 라이브 드래그 미리보기, 중심 스냅, persist-on-release와 미디어 크롬.

  11. · kamo-internal

    Launcher card and hero use the org's brand color 대신 per-module 악센트

    홈런치패드의 옵션 카드, 오버레이를 드래그하고, 이제 최초의 영웅 var(--color-primary)의 악센트(org's dynamically set 고정 멀티 컬러보다 테마 색상 --accent-* 가족지도.

  12. · kamo-internal

    Break-glass 신 모드 - 이유 프롬프트, 카운트 다운, 서 표시

    하나님 모드는 kamo-internal의 모든 UI가 없었다 : localStorage boolean 그 마운트 효력은 ***로, 영원히 각 새로운 탭에 reasserted. 그것은 브라우저 플랫폼 직원이 높을지 여부에 대한 권한을, 고 하 고 당신이 할 수없는 무언가가 될 수 있습니다. - GodModeJustificationDialog는 BEFORE가 고안한 이유를 위해 프롬프트합니다. 이름 * 수집 한 후 이미 완료 된 것을 맞는 이유입니다. 비밀번호 일반적으로 어떤 연산자가 볼 수 있는지, 그들의 이름은 그것에 간다. - GodModeIndicator는 전체 폭 밑바닥 막대기 및 전체적인 주위에 빨간 구조입니다 viewport, 라이브 카운트 다운과 "지금 종료" 그들이 누구인지 신 모드는 정확한 시나리오가 제어가 방지하기 위해 존재하므로 미묘한 배지 -하지만 점퍼 일러스트 : 막대기 밖에 아무도 밖에 앉아 외부 레이아웃 흐름, 그래서 클릭을 방해하지 않거나 화면을 다시 흐름. - 둘 다 autoLogoff 옆에 뿌리 배치에서 한 번 거치됩니다, 그래서 표시기는 연산자가 화면에 오히려 종료되는 곳에 존재합니다. 누군가 기억. 세션이 god-ELIGIBLE인 경우 아무것도 렌더링합니다. - 서버는 국가를 소유합니다. app/lib/godMode는 단 하나 탄화된 상점을 붙듭니다; 클라이언트는 expiry SecurityService 스탬프를 읽었으며 결코 연장 할 수 없습니다. 그것. setIsGodMode는 사라집니다 — elevating takes a justification, 그래서 그것은 할 수 없습니다 설정. - 내구성이 맑음으로 상태 poll doubles: GET /session/god-mode는 어디에 있습니다 SecurityService는 Redis의 탈출 된 고도를 기록합니다. 직접 세션을 읽으십시오. usePlatformAdminGuard는 이제 신기록 세션의 신 상태를 기다립니다. localStorage에서 읽을 수 있는 동시에 접근; 대기 없이 열린 창을 가진 통신수는 간격에서 /settings에 반송될 것입니다. 문자열은 ***********에 있습니다. (첫째로, 빌드의 클론 순서 당. npx vitest 실행: 329 전달 (32 파일), 17 의 그들 새로운. npx tsc --noEmit: 청소.

  13. · SecurityService

    PHI 액세스 트레일 읽기 - §164.528 회계 및 활동 검토

    이 길은 잠시 동안 작성되었으며 아무것도 읽을 수 없었다, 두 왼쪽 의무 unmet : 한 개인의 기록에 대한 차별의 회계 (§164.528) 및 정기 정보 시스템 활동 검토 (§164.308(a)(1)(ii)(D)). 둘 다 쿼리입니다. 이 쿼리 표면을 추가합니다. 권한은 그리드가 아닌 기능입니다. 조직은 세션과 다른 곳에서 - deliberately no orgId 매개변수가 없습니다. 핸들러 및 PhiAuditQueryService는 단 하나의 초크 포인트입니다. 필터를 상담하기 전에 사전. 4개의 sibling 질문 방법 그것을 잊을 수있는 4 가지 기회가되었습니다. Scoping는 WHERE 항목이 아닌 반환된 페이지를 필터링 하기 때문에 포스트 필터 총Elements를 떠날 것 이다 콜러 계산은 볼 수 없습니다. 읽힌 측은 그것의 자신의 저장소 공용영역을 얻습니다. 공유 PhiAccessLogRepository finders are deliberately cross-tenant — 정확한 플랫폼 도구, 공개 고객 화면에 넣을 경우 - 그래서 화면은 단지 입력 한 인터페이스를 가져옵니다 점은 명세를 가지고 갑니다. 그것은 com.kamo의 밑에 생활합니다. SecurityService는 기존 @EnableJpaRepositories 항목 이미 커버, 그래서 스캔 변경 필요 그리고 아무도 잊을 수 없습니다. 저작권은 VIEW ACCESS LOGS (29) 및 EXPORT ACCESS LOGS (32) - 쌍 그 이미 인증 로그를 게이트, 그래서 오늘 보안을 관리 누구 하루에 사용할 수 있습니다. 새로운 권리 ID는 죽은 화면을 발송 할 것입니다 : 그것은 KamoInitializer 런을 필요로 하고, 회원이 1을 보유하기 전에 보조금이 필요합니다. 길을 읽는 것은 기록된 것입니다. REPORT/SEARCH로 읽습니다. 복사를 위한 REPORT/EXPORT, 거부된 시도. 검색 기준은 기록되지 않음 - 필터는 회원과 기록 ids, 그리고 상점의 흔적을 운반 식별자의 축적에 대한 검색은 보호해야 합니다. 모든 것은 경계됩니다: 페이지 크기 죔쇠에 200의 10,000의 줄에 수출 모자. 6 년의 트레일은 수백만의 행과 캡처 층은 1 행을 씁니다. 짐 당 격자 줄, 그래서 unclamped 크기는 오히려 도달 가능한 OOM입니다 이론적인 것. Timestamps는 명시된 UTC 즉석으로 출발합니다. 란은 지역이 없는 벽시입니다, 그리고이 증거는 몇 달 후에 누군가에 의해 나중에 읽습니다.

  14. · kamo-internal

    MFA 등록 화면과 신 모드 PHI 경계 제어

    없는 백엔드를 위한 2개의 조정 표면. MFA 등록 (설정 → 내 프로필 → 로그인 보안, 자체 만). SecurityService의 /api/security/mfa 엔드포인트가 완료되었습니다. unachable, 그래서 MFA는 존재하고 플랫폼에 아무도 켜질 수 있었습니다. 더 보기 탭은 호출자의 자신의 사용자를 해결하기 때문에 자기 전용입니다. session and take no user 매개 변수 — 관리자는 다른 사람의 프로필을 열어 그 화면에 자신의 정통을 등록 할 수 있습니다. QR 코드는 qrcode.react, 이미 의존성을 사용합니다. 패키지가 추가되지 않았습니다. 더 보기 secret은 같은 정통 앱이기 때문에, 브라우저로 장치는 화면을 스캔 할 수 없습니다. 2개의 실패 경로는 일반적인 오류 보다는 오히려 일류 취급을 얻습니다. · 409 확인 된 요인이 이미 존재하고, 치료법 (안 administrator reset) - retry가 다시 보낼 사용자를 알려줍니다. 성공할 수 없는 행동 잘못된 확인 코드는 보류를 유지 등록 : 비밀은 한 번 표시되므로 삭제를 의미합니다. 인증자 입력 및 재처리, 서버의 공개 등록 여전히 거기에있을 것입니다, 그래서 재가 다시 올 것입니다 409 그리고 그 물가. 복구 코드는 한 번 표시하고 재발 할 수 없습니다. 대화 상자는 할 수 없습니다 탈출, 백드롭 또는 닫기 버튼에 의해 중단; 끝난 후 잠금 해제 코드는 복사되거나 다운로드되었으며 경고가 인정되었습니다. 둘 다 입니다 필수 : 체크 박스 혼자 클릭 반사, 그리고 클립 보드 혼자는 다음 복사에 의해 overwritten — 그리고 아무것도 사용자까지 잘못 보인다 휴대폰을 잃습니다. PHI 경계 (설정 → 보안 → 건강 데이터, 신도 가능). 탭은 God-eligible 연산자와 내부 제어에 볼 수 있습니다 신 모드 SecurityService re-checks; eligibility는 혼자서 켜지지 않습니다 인증. 작업을 중지하는 모듈을 나열하지 않고도 결코 플립하지 않습니다. — 그 목록은 PhiModule에서 파생된 서버에서 옵니다 PhiTenantGuard, 그래서 그것은 무슨이 집행 된에서 드리프트 할 수 없습니다. 503은 표면 "변경은 기록 할 수 없기 때문에 적용되지 않았습니다." 무슨 일이. Decision 논리는 app/lib/security에 살고 그래서 vitest는 그것을 도달할 수 있습니다; 성분 렌더링을 잡아라. 인증: npx vitest 실행 — 329 테스트, 32 파일, 모든 통과 (43 새로운). npx tsc --noEmit는 3 오류가 발생했습니다. *********** 이 나무에서 다른 세션에서 untracked 파일, 여기에 파일의 아무도.

  15. · SecurityService

    조직의 HIPAA 경계를 읽고 이동하기 위한 엔드포인트

    Organization.handlesPhi는 설정하지 않고 열으로 존재했습니다. PhiTenantGuard는 flag nobody가 켜질 수 있도록 합니다. 이것은 누락된 반: GET/PUT /api/security/phi/tenant. 권위는 신의 자격과 활성 godModeActive toggle, 결코 하나. Eligibility는 2026-07-22까지 플랫폼의 신문을 남긴 것입니다; 여기에 그것은 어떤 신-eligible 연산자는 살아있는 tenant의 모듈을 전환 할 것 1개의 주목할만한 클릭으로. 대상은 항상 콜러의 자신의 세션 org — 아무 OrganId 모수도 없습니다, 그래서 crafted 요구는 도달할 수 있습니다 콜러가 이미 안되지 않습니다. phiEffectiveDate는 첫번째 활성화에 각인되고 결코 rewritten, 위에를 포함하여 나중에 비활성화 / 비활성화. 그것은 breach-assessment 및 보존 창을 범위, 그래서 앞으로 움직이는 것은 조용히 검토 하 여 기간을 수축, 감사 신청은 사전에 증거가 없습니다. 감사 행은 BEFORE 플래그 이동, CONFIGURE 실패, 그래서 작성되지 않은 흔적은 변경을 거부하고 503를 오히려 반환 때의 기록없이 이동 경계를 떠나. 결혼한 시도는 로그아웃 모든 행은 식별자와 전환 만, 절대로 운반 이름 * blockedModules는 PhiTenantGuard를 통해 PhiModule에서 오히려 파생됩니다 목록으로, 그래서 UI 쇼는 감시가 집행하는 것에서 드리프트 할 수 없습니다. 새로운 저장소 패키지 없음: OrganizationRepository는 이미이 서비스에서 @EnableJpaRepositories 목록, 그래서이 bean과 함께 추가 할 아무것도 없다. 인증: 298 테스트, 1 오류 — **************** EntityManager NPE, 사전 제작 (기본 7968a21: 281 테스트, 동일 1 오류). 저장소ScanCoverageTest 및 *********** 모두 패스워드.

  16. · kamo-internal

    견적 양식을 가이드 흐름으로 재구성, 출력 미리보기 추가

    세부 사항 탭은 모든 필드를 준 outlined 상자의 플랫 스택이었다 무게, 그래서 아무것도 신호가 입력 실제로 고객이 보는 것을 변경. · 이제는 4개의 결정으로 견적이 이루어집니다. — 그것이 무엇인지, 무엇일까요? 판매, 조정되는 방법, 고객이 읽는 것 — 1 선 이유에 각각 문제, 그리고 실행 총은 바닥에 묻은 것보다 끈적한 레일에 앉아. 운동은 장식 보다는 오히려 의미를 나릅니다: 단면도는 순서, a에 도착합니다 조건 필드는 정의 된 컨트롤에서 확장, 가격 영역 그 모양이 변경 될 때 크로스 페이드, 그리고 새로운 가치에 총 카운트 그래서 mistyped 단위 가격은 침묵적으로 흡수되지 않는 대신 나타났습니다. 모든 것의 존중 선호하는 모션. 새로운 미리보기 작업은 완성 된 문서를 렌더링합니다 - Letterhead, 옵션 또는 테이블, 총, 용어 — 그리고 자체에 인쇄. CURRENT 편집기 상태는 아닙니다. 저장된 기록, 당신이 완성 된 견적을 볼 필요가 있기 때문에 결정 그것을 보낼지 여부. 브랜딩은 서버의 자체 해상도에서 제공하므로 미리보기 Letterhead는 1개의 고객이 얻고, 선택권 arithmetic는에서 수입됩니다 대신 간단한 편집기.

  17. · kamo-shared-library

    규정 준수에 대한 변경을위한 감사 구급차

    PhiResourceType.ORGANIZATION 및 PhiAccessKind.CONFIGURE를 추가하여 도킹 Organization.handlesPhi on or off는 그것으로 기록될 수 있습니다. 모든 기존 리소스 유형은 사람의 기록입니다. 변경을 제출 그 중 하나에 따라 10 년의 준수 자세는 §164.528에 거짓말을 넣을 것입니다. 파열의 회계, 그리고 "이 10ant가 덮여있는 사람의 비즈니스 동료는"문제의 나머지는에 대한 범위 — 그것은 자신의 행 모양을 필요로, 빌린 것. CONFIGURE는 대량 종류의 다른 이유를 위해 닫힙니다: 아무것도 공개 된, 그래서 refusing cost the operator a retry, 이동 한 경계 §164.402 평가가 재구성될 때의 기록이 없습니다. 스키마 복제 없음. phi access log.RESOURCE TYPE 및 ACCESS KIND는 일반적입니다. PhiAccessLogTableMigration에 의해 생성된 VARCHARs는 enum whitelist CHECK 없이, 그래서 KamoInitializer가 삽입되기 전에 실행할 필요가 없습니다. 단체 또는 @Column은 터치됩니다. 인증 어떤 과도한 스위치 enum 어떤 서비스에 존재합니다.

  18. · SecurityService

    고객 만남 보기

    GET /{uid}/preview는 같은 PublicQuoteView를 반환합니다. 같은 QuotePresentation 해상도, 그래서 미리보기 문자 헤드는 전송과 다를 수 없습니다 한국어 그것은 토큰을 축소하지 않습니다, 보기를 계산하거나 이벤트를 기록 — 보기 당신의 자신의 초안은 고객 참여가 아니며, 활동 트레일에 흠뻑 취합니다. 신호로 뷰 카운터 쓸모를 만들 것입니다.

  19. · ConversionService

    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.

  20. · SecurityService

    Break-glass 신 모드 - 단화 + 30 분 시간 상자

    하나님 모드는 조용히 활성화하고 세션만큼 지속됩니다. 그것은 덮여있는 사람의 보안 검토 푸시를 제어하기 때문에 "당신의 직원은 우리의 환자 자료를 읽을 수 있습니다"는 항상 물어지고, unbounded 고도는 그것에 아무 대답도 없습니다. - POST /api/security/session/god-mode는 이제 입력된 단정을 요구합니다. 맨 위로. Stepping DOWN never does — 안전한 행동을 게이트하는 제어 연산자를 높이는 제어. - 양쪽 가장자리는 PhiAccessRecorder를 통해서만 기록됩니다. platformStaff (true). Identifiers만; justification는 연산자의 자신의 왜 말, 그들은 아무것도 읽었다. - 창은 30 분과 NON-SLIDING입니다. expiry는 절대적인 순간입니다 세션 바디는 TTL이 아니라 슬라이딩 세션은 확장 할 수 없습니다. 그리고 두 번째 탭에서 re-asserting은 원래 expiry를 대신 반환 다른 창을 구입. - KSessionService.getSession는 탈출된 깃발을, 그래서 모든 ~10 기존합니다 `session.get("godModeActive")`문은 변경하지 않고 타임 박스를 나타냅니다. GET /session/god-mode는 Redis를 통해 명확하게 작성합니다. (내에서 사용 getSession은 재조절 될 것입니다) 그리고 카운트다운의 UI polls는 무엇인가. Deliberately 실패는 감사 쓰기에 열려: 신 모드는 어떻게 지원 고침이다 phi access log blinked가 악화되기 때문에 생산 및 혼란 레코더가 이미 확고하게 기록되었습니다. 법인 또는 @Column 변경. PhiResourceType은 상수하지 않습니다. @Enumerated(STRING) ddl-auto : 업데이트 결코 Widens, 그래서 새로운 상수는 KamoInitializer까지 각 삽입을 실패할 것입니다 손으로 실행되었습니다. 고도는 연산자의 자신의 MEMBER에 대한 기록 대신 *********** 접두사로 기록합니다.

  21. · kamo-internal

    Reorder 스튜어드 탭; 파이프 라인 찾기 - 로난 팝업에 접어

    탭 주문은 이제 Pipeline, Documents, Underwriting, 가격, 자본 및 위험입니다. Governance, Ingestion, Catalog — Pipeline은 기본 랜딩 화면이 됩니다. 독립 검문자 탭이 사라집니다. Pipeline의 모습 툴바는 컴팩트한 Find-loan Popover로: UID (기본값) 또는 외부 식별자 (MERS MIN, 대행사 케이스 #, e-sign envelope, etc.) 그것의 대출에, 부유한 결과 카드와 더불어, 대출의 식별자 ledger, lifecycle 역사 및 원클릭 오픈 / 쇼인 파이프 라인.

  22. · kamo-signer-monorepo

    자주 묻는 질문

    선택 가능한 카드로 옵션 렌더링, 그들은 선택하기 때문에 그리고 더 이상. 기간 합계는 헤드 라인입니다; 월간 동등물 다른 청구 조건을 comparable 만드는 그림 옆에 앉아, 그리고 저축 배지는 차이가 naming의 가치가 있을 때만 나타납니다. 평평한 테이블과 결합된 총 구획은 선택권이 때 억압됩니다 현재 - 상호적으로 독점적 인 대안을 통해 웅장한 총은 숫자입니다. 아무도 지불 할 수 없습니다. 인쇄 규칙은 측에 의하여 카드 측을 지킵니다 그래서 인쇄한 따옴표는 아직도 비교합니다.

  23. · kamo-internal

    저자 멀티 옵션은 편집기에서 인용

    견적은 플랫 가격 시트 또는 대안 세트, 그래서 편집기 한 번에 두 개의 존재를 letting 보다는 오히려 형태 toggle를 제안합니다 — 둘 다 보내기 고객이 구입 할 수없는 가격을 표시 할 것입니다. 옵션으로 전환 typed 작업 대신 첫 번째 옵션으로 기존 라인. 각 옵션은 자체 라인 항목, 청구 기간, 약속 길이, 할인을받습니다. 및 설정 수수료, 기간 총의 라이브 미리보기, 월등, 기본에 대한 계약 값 및 절감. 미리보기 미러 QuoteOptionTotals; 서버가 저장하고 그 숫자가 승리합니다. 인용에 좌석 조사, 그래서 40 -> 60 한 번에 각 옵션의 가격.

  24. · SecurityService

    공공 인용문 endpoint에 옵션을 수락

    Multi-option 견적은 블라인드를 허용 할 수 없습니다 — 요청은 지금 운반 선택된 optionUid 및 서비스는 하나없이 수용을 거부합니다.

  25. · kamo-shared-library

    멀티 옵션은 per-option 비교 합계로 인용

    견적은 이제 몇 가지 상호 독점 방법을 제시 할 수 있습니다. — 월, 연간, 3년 — 대신 3개의 별도의 문서를 강제로 강제로 강제로 강제로 강제 현재 좌석 개수가 변경됩니다. - QuoteOption는 자체 라인 아이템과 합계를 소유합니다. siblings는 결코 요약되지 않습니다. - QuoteOptionTotals는 매달 상응하는 각 옵션을 정상화한다. 다른 청구 조건이 비교될 수 있는 유일한 기초, 플러스 계약 총 및 분쇄 기본에 대한 저축. - 빌링 기간 및 약속 길이는 별도로 유지 : 매년 지불하지 않습니다 매년 3 년 기간 청구와 동일한 약속. - Quote.quantity는 공유 드라이버입니다. useQuoteQuantity와 함께 라인 선택 한 번에 모든 옵션의 가격. QuoteTotals는 동일하게 생각합니다. 플랫 시트 그래서 라인은 서로 다른 내부 및 외부 옵션을 가격 할 수 없습니다. - 다 선택권 따옴표를 받아들이는 것은 선택권을 naming 요구합니다; siblings는 것과 같이 닫힙니다 NOT SELECTED 및 AcceptOptionUid는 선택을 기록합니다. QuoteTotalsTest 15, QuoteOptionTotalsTest 11, QuoteShareTokenTest 9 - 모든 패스.

  26. · kamo-internal

    납품 적용, 가격 표시 떨어져, 큰 저장소 패널

    최종 Coming-soon 칩 교체 (헤지 & 적용, 가격 표시-off, 큰 저장소) 새로운 스튜어드 프록시에 유선 라이브 패널.

  27. · SecurityService

    범위, 가격 표시-off, 큰 저장소에 대 한 우회 프록시

    운영자, 세션 스탬프 org+member, 실패 닫히는 소유권 (cross-org 없음) 존재 oracle). unauthenticated-endpoint ratchet에 기반을 둔 새로운 엔드 포인트.

  28. · kamo-shared-library

    WORM 가격 사인 오프 엔터 (mlos pricing signoff)

    얼어붙은 결과에 대한 Append-only 스튜어드 APPROVE/REJECT 판단. @PreUpdate throws (수신은 새로운 행입니다). 테이블 + 4 인덱스 (org, 실행, 결과, 대출) KamoInitializer를 통해 CockroachDB에 적용.

  29. · kamo-internal

    Steward 콘솔 라운드 2 - 예외 큐, 지배, MERS recon

    - 캐피탈 + Underwriting: StewardExceptionQueue (공유된 패널)는 실제에 스튜어드-tasks endpoint - 잠금 예외 **************** 및 가이드라인 예외 **************** 정직한 빈 국가. - 거버넌스: CalibrationReliabilityPanel (구분 당 관찰된 대 예측) 및 PullThroughFunnelPanel (리얼 스테이지 배포, 스냅 샷을 표시 cohort 변환). 2개의 오순 칩을 대체했습니다. - 문서: MERS reconciliation 패널은 실제 내부 서약 recon 읽기. 전체 영역; 일반 문자열 복사 (i18n 후속); tsc --noEmit 청소.

  30. · SecurityService

    스튜어드-tasks, 교정/funnel, MERS 재구성을 위한 게이트웨이 릴레이

    god-eligible, org 서버 샘플 수신 릴레이: **************** ****** ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** MlosDoc조직 ****** ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** (fail-closed org 필터, 비 소유 패키지를 삭제 행 + re-derives 키가 큰). unguarded-endpoints의 모든 4 개의 기본 (사격 게이트 () 가드, 그들의 형제 같은).

당신의 우주는 기다리고 있습니다.

몇 분 안에 무료로 시작하세요. 준비가 되면 언제든지 제품을 추가할 수 있습니다.

영원히 무료 - 신용 카드 필요 없음