diff --git a/docs/README.md b/docs/README.md index 0544232..64a1314 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,6 +17,7 @@ docs/ adr/ ← Architecture Decision Records: 가로지르는 결정 기록 _TEMPLATE.md NNNN-.md + architecture/ ← 현행 시스템 아키텍처 Draw.io 원본과 검토용 SVG/PNG reference/ ← 레퍼런스: 구현된 모듈/함수/설정 사양 (구현 "후" 동기화) guides/ ← How-to / 사용 가이드 / 튜토리얼 (사용자·운영자 대상) pipeline/ ← 개발 프로세스 문서 (큐 프로토콜·런북) diff --git a/docs/architecture/README.md b/docs/architecture/README.md new file mode 100644 index 0000000..c9c95a8 --- /dev/null +++ b/docs/architecture/README.md @@ -0,0 +1,76 @@ +# HMM AI 데이터 접근 아키텍처 + +OCI Draw.io Style Guide의 공식 서비스 도형과 Oracle 색상 규칙으로 정리한 HMM 데모 +아키텍처다. Draw.io 원본은 두 페이지로 구성한다. + +| 페이지 | 설명 | 미리보기 | +|---|---|---| +| `01 · 전체 구성` | HMM 사용자, Compute, Backoffice MCP, ADB, GenAI, Object Storage, AWS RDS federation | [SVG](hmm-ai-data-access-architecture-overview.svg) · [PNG](hmm-ai-data-access-architecture-overview.png) | +| `02 · MCP 요청과 VPD` | Tool 광고 시작 검증, 사용자 Bearer 인증, Agent Tool과 Select AI 분기, `CB_ORDS` VPD 실행 | [SVG](hmm-ai-data-access-architecture-security-flow.svg) · [PNG](hmm-ai-data-access-architecture-security-flow.png) | + +편집 원본: [hmm-ai-data-access-architecture.drawio](hmm-ai-data-access-architecture.drawio) + +## 현행 기준 + +- 사용자별 MCP: `https://hmm-backoffice.cloud-handson.com/mcp` +- 공개 Tool 계약: `BACKOFFICE_MCP_TOOLS` +- ADB Agent Tool: `resolve_hr_term`, `search_hr_policy` +- Java Select AI Tool: `search_hr_data` +- Select AI SQL 생성: ADMIN 세션 +- 보호 SQL 실행: `CB_ORDS` 비면제 읽기 전용 세션 +- VPD 문맥: `HMM_ACCESS_CTX` +- 휴가 정책: `HMM_LEAVE_SCOPE_POLICY` +- 정책 문서: Object Storage PDF → Abstract/Tag/Chunk/Embed 4 Vector +- 선사 실적: AWS RDS PostgreSQL → `HMM_RDS_PG_LINK` → ADB federation View +- 공용 호환 게이트웨이 `hmm-mcp.cloud-handson.com`은 사용자별 VPD MCP 주소가 아니다. + +## 흐름을 읽는 방법 + +- 파란 실선: 사용자 요청 또는 읽기 전용 데이터 실행 +- Oracle red 실선: 인증, 보안 Context, VPD 적용 +- 주황 점선: 모델 호출 또는 문서 적재 +- 회색 실선: 외부 PostgreSQL federation +- 녹색 실선: 정상 결과와 세션 정리 + +`AGENT_TOOL`과 `SELECT_AI`의 DB 세션은 구분한다. + +- `AGENT_TOOL`: 기본 datasource의 같은 connection에서 + `SET_USER_BY_BEARER → DBMS_CLOUD_AI_AGENT.RUN_TOOL → CLEAR_USER` +- `search_hr_data`: ADMIN이 SQL만 생성하고, `CB_ORDS`의 같은 connection에서 + `SET_VPD_CONTEXT → SELECT → ROLLBACK → CLEAR_VPD_CONTEXT` + +## 재생성 + +로컬 OCI 라이브러리 경로를 명시한다. 비밀번호, Token, OCID는 입력하지 않는다. + +```bash +node tools/architecture/generate-hmm-oci-architecture.mjs \ + "/Users/joungminko/Downloads/OCI Style Guide for Drawio/OCI Library.xml" \ + docs/architecture +``` + +SVG와 PNG는 diagrams.net의 embed exporter를 Playwright로 호출해 실제 Draw.io 렌더링과 +동일하게 만든다. 인터넷 연결과 Playwright Chromium이 필요하다. + +```bash +node tools/architecture/export-drawio.mjs \ + docs/architecture/hmm-ai-data-access-architecture.drawio \ + docs/architecture +``` + +구조, 필수 문구, OCI stencil, 비밀값 패턴, 렌더링 크기를 검사한다. + +```bash +node tools/architecture/validate-hmm-architecture.mjs docs/architecture +``` + +## 스타일 기준 + +- 기준 파일: `OCI Library.xml`, `Read-ME.drawio` +- 글꼴: Oracle Sans +- 본문: `#312D2A` +- OCI 경계: `#F5F4F2` / `#9E9892` +- OCI 강조: `#AE562C` +- 보안 강조: `#C74634` +- 외부 Cloud: 흰 배경과 회색 점선 +- Style Guide의 안내용 pink와 Courier New는 사용하지 않는다. diff --git a/docs/architecture/hmm-ai-data-access-architecture-overview.png b/docs/architecture/hmm-ai-data-access-architecture-overview.png new file mode 100644 index 0000000..9db347e Binary files /dev/null and b/docs/architecture/hmm-ai-data-access-architecture-overview.png differ diff --git a/docs/architecture/hmm-ai-data-access-architecture-overview.svg b/docs/architecture/hmm-ai-data-access-architecture-overview.svg new file mode 100644 index 0000000..b69368f --- /dev/null +++ b/docs/architecture/hmm-ai-data-access-architecture-overview.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" style="background: #FFFFFF; background-color: light-dark(#FFFFFF, #121212); color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1840px" height="1120px" viewBox="0 0 1840 1120"><defs/><rect fill="#FFFFFF" width="100%" height="100%" x="0" y="0" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="hmm-overview_background"><g><rect x="19.6" y="20" width="1800" height="1080" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-overview_v_1"><g><rect x="55.6" y="42" width="1728" height="38" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1726px; height: 1px; padding-top: 61px; margin-left: 58px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 25px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">HMM AI 데이터 접근 아키텍처</div></div></div></foreignObject><text x="58" y="69" fill="#312D2A" font-family="'Oracle Sans'" font-size="25px" font-weight="bold" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">HMM AI 데이터 접근 아키텍처</text></switch></g></g></g><g data-cell-id="hmm-overview_v_2"><g><rect x="57.6" y="80" width="1724" height="28" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1722px; height: 1px; padding-top: 94px; margin-left: 60px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #5B5652; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#5B5652, #a6a29e); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">사용자 Bearer MCP · Select AI · VPD · HR 정책 벡터 검색 · AWS RDS PostgreSQL Federation</div></div></div></foreignObject><text x="60" y="98" fill="#5B5652" font-family="'Oracle Sans'" font-size="12px" style="fill: light-dark(rgb(91, 86, 82), rgb(166, 162, 158));">사용자 Bearer MCP · Select AI · VPD · HR 정책 벡터 검색 · AWS RDS PostgreSQL Federation</text></switch></g></g></g><g data-cell-id="hmm-overview_v_3"><g transform="translate(0.5,0.5)"><rect x="55.6" y="112" width="1728" height="3" rx="0.24" ry="0.24" fill="#c74634" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g></g><g data-cell-id="hmm-overview_v_4"><g transform="translate(0.5,0.5)"><rect x="49.6" y="140" width="190" height="790" rx="13.3" ry="13.3" fill="#fcfbfa" stroke="#9e9892" pointer-events="all" style="fill: light-dark(rgb(252, 251, 250), rgb(22, 21, 20)); stroke: light-dark(rgb(158, 152, 146), rgb(110, 105, 99));"/></g></g><g data-cell-id="hmm-overview_v_5"><g><rect x="63.6" y="148" width="162" height="26" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 160px; height: 1px; padding-top: 161px; margin-left: 66px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>HMM 사용자</b></div></div></div></foreignObject><text x="66" y="165" fill="#312D2A" font-family="'Oracle Sans'" font-size="13px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">HMM 사용자</text></switch></g></g></g><g data-cell-id="hmm-overview_oci_6"><g/><g data-cell-id="hmm-overview_ociPart_7"><g><rect x="99.6" y="185" width="76" height="84" fill="none" stroke="none" pointer-events="all"/></g><g data-cell-id="hmm-overview_ociPart_8"><g><path d="M 100.62 268 L 100.62 254 C 100.6 249.44 102.28 245.03 105.34 241.62 C 108.39 238.22 112.62 236.06 117.18 235.56 C 115.39 233.86 113.85 231.9 112.65 229.74 L 112.13 228.82 L 120.19 195.64 C 121.11 192.84 122.9 190.4 125.3 188.67 C 127.71 186.94 130.59 186.01 133.56 186 L 141.62 186 C 144.56 186.05 147.42 186.99 149.8 188.71 C 152.18 190.44 153.95 192.86 154.9 195.62 L 155.16 196.56 L 163.08 228.78 L 162.55 229.7 C 161.36 231.86 159.84 233.84 158.04 235.54 C 162.6 236.04 166.82 238.2 169.87 241.6 C 172.92 245.01 174.6 249.4 174.59 253.96 L 174.59 267.96 L 100.62 268 L 100.62 268" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-overview_ociPart_9"><g><path d="M 141.64 187 C 144.52 187.05 147.32 188.03 149.59 189.8 C 151.86 191.58 153.48 194.04 154.21 196.82 L 162 228.62 L 161.65 229.22 C 160.12 232.05 157.96 234.48 155.34 236.36 L 155.48 236.36 C 157.84 236.3 160.19 236.71 162.38 237.57 C 164.58 238.42 166.58 239.71 168.27 241.36 C 169.95 242.99 171.29 244.95 172.21 247.11 C 173.12 249.28 173.59 251.6 173.59 253.94 L 173.59 267 L 101.64 267 L 101.64 253.94 C 101.64 251.6 102.11 249.28 103.02 247.11 C 103.93 244.95 105.27 242.99 106.96 241.36 C 108.65 239.71 110.65 238.42 112.85 237.57 C 115.04 236.71 117.39 236.3 119.75 236.36 L 119.93 236.36 C 117.31 234.48 115.14 232.05 113.61 229.22 L 113.26 228.62 L 120.96 196.8 C 121.68 194.02 123.3 191.56 125.58 189.79 C 127.85 188.02 130.65 187.04 133.53 187 L 141.57 187 L 141.64 187 L 141.64 187 M 141.57 185 L 133.53 185 C 130.55 185.05 127.66 185.97 125.2 187.65 C 122.76 189.33 120.86 191.69 119.75 194.44 L 119.57 194.44 L 119.06 196.44 L 111.24 228.16 L 111.04 228.92 L 111.44 229.62 L 111.7 230.2 C 112.63 231.87 113.74 233.43 115.02 234.86 C 110.64 235.8 106.72 238.21 103.92 241.68 C 101.11 245.16 99.6 249.49 99.63 253.94 L 99.63 269 L 175.58 269 L 175.58 253.94 C 175.6 249.48 174.07 245.14 171.26 241.67 C 168.45 238.2 164.51 235.79 160.13 234.86 C 161.4 233.43 162.52 231.86 163.47 230.2 L 163.81 229.62 L 164.21 228.92 L 164.01 228.14 L 156.2 196.34 L 155.72 194.34 L 155.52 194.34 C 154.38 191.6 152.46 189.26 149.99 187.6 C 147.52 185.94 144.61 185.03 141.64 185 L 141.57 185 L 141.57 185" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-overview_ociPart_10"><g><path d="M 155.59 236.36 L 155.44 236.36 C 158.07 234.49 160.23 232.05 161.77 229.22 L 162.11 228.62 L 154.3 196.8 C 153.56 194.02 151.93 191.55 149.65 189.78 C 147.36 188.02 144.56 187.04 141.66 187 L 133.6 187 C 130.72 187.05 127.92 188.03 125.66 189.81 C 123.39 191.58 121.77 194.05 121.05 196.82 L 113.17 228.62 L 113.52 229.22 C 115.05 232.05 117.22 234.49 119.84 236.36 L 119.74 236.36 C 117.38 236.3 115.03 236.71 112.82 237.57 C 110.62 238.43 108.62 239.72 106.93 241.36 C 105.24 243 103.9 244.96 102.98 247.13 C 102.07 249.29 101.6 251.62 101.61 253.96 L 101.61 267 L 105.03 267 L 105.03 253.96 C 105.03 252.06 105.42 250.18 106.16 248.43 C 106.91 246.69 108 245.1 109.37 243.78 C 110.74 242.46 112.36 241.42 114.14 240.73 C 115.93 240.04 117.83 239.71 119.74 239.76 L 127.8 239.76 C 128.12 242.12 129.3 244.29 131.11 245.86 C 132.92 247.42 135.24 248.29 137.64 248.29 C 140.05 248.29 142.37 247.42 144.17 245.86 C 145.99 244.29 147.16 242.12 147.49 239.76 L 155.54 239.76 C 157.45 239.72 159.34 240.06 161.12 240.75 C 162.89 241.45 164.5 242.49 165.86 243.81 C 167.23 245.14 168.31 246.71 169.05 248.46 C 169.78 250.2 170.17 252.07 170.17 253.96 L 170.17 267 L 173.6 267 L 173.6 253.96 C 173.6 251.62 173.13 249.29 172.22 247.13 C 171.3 244.97 169.96 243.01 168.26 241.37 C 166.58 239.73 164.58 238.44 162.38 237.58 C 160.18 236.72 157.82 236.3 155.46 236.36 L 155.59 236.36 L 155.59 236.36 M 123.91 210.86 L 123.91 205 C 124.76 205.2 125.62 205.33 126.49 205.38 C 130.52 205.59 134.5 204.3 137.61 201.74 C 140.5 204.08 144.1 205.37 147.82 205.4 L 148.75 205.4 C 149.62 205.34 150.49 205.21 151.33 205 L 151.33 210.84 C 151.39 212.68 151.09 214.52 150.42 216.25 C 149.77 217.97 148.77 219.55 147.49 220.89 C 146.22 222.23 144.69 223.31 142.99 224.06 C 141.3 224.82 139.47 225.23 137.61 225.28 C 135.76 225.23 133.93 224.82 132.24 224.06 C 130.54 223.3 129.01 222.22 127.74 220.89 C 126.47 219.54 125.48 217.97 124.82 216.24 C 124.16 214.52 123.86 212.68 123.91 210.84 L 123.91 210.86 L 123.91 210.86 M 147.49 235.92 L 147.49 225.42 C 149.51 223.92 151.19 222.01 152.43 219.82 C 153.67 217.64 154.43 215.22 154.68 212.72 L 158.44 228.1 C 157.3 230.12 155.72 231.86 153.83 233.22 C 151.94 234.57 149.78 235.5 147.49 235.94 L 147.49 235.92 L 147.49 235.92 M 133.54 190.4 L 141.6 190.4 C 144.24 190.5 146.73 191.63 148.54 193.54 C 150.34 195.45 151.33 197.98 151.27 200.6 L 151.27 201.52 C 149.08 202.14 146.75 202.18 144.55 201.6 C 142.34 201.03 140.32 199.87 138.72 198.26 L 137.55 197.22 L 136.4 198.26 C 134.8 199.87 132.79 201.03 130.58 201.61 C 128.37 202.18 126.04 202.15 123.85 201.52 L 123.85 200.6 C 123.8 197.98 124.77 195.46 126.57 193.55 C 128.37 191.65 130.85 190.51 133.48 190.4 L 133.54 190.4 L 133.54 190.4 M 116.82 228.1 L 120.56 212.78 C 120.82 215.27 121.59 217.68 122.84 219.86 C 124.09 222.03 125.77 223.93 127.8 225.42 L 127.8 235.94 C 125.51 235.5 123.35 234.57 121.46 233.21 C 119.57 231.86 118 230.11 116.86 228.1 L 116.82 228.1 L 116.82 228.1 M 137.65 244.84 C 136.03 244.84 134.48 244.24 133.27 243.16 C 132.08 242.08 131.32 240.6 131.16 239 L 131.16 227.38 C 133.2 228.25 135.4 228.7 137.62 228.7 C 139.84 228.7 142.04 228.25 144.08 227.38 L 144.08 239 C 143.92 240.6 143.18 242.09 141.98 243.18 C 140.79 244.26 139.23 244.86 137.61 244.88" fill="#2c5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(44, 89, 103), rgb(137, 175, 187));"/></g></g></g></g><g data-cell-id="hmm-overview_v_11"><g transform="translate(0.5,0.5)"><rect x="73.6" y="290" width="142" height="150" rx="11.36" ry="11.36" fill="#ffffff" stroke="#d4cfca" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(212, 207, 202), rgb(62, 58, 54));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 132px; height: 1px; padding-top: 365px; margin-left: 79px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>팀장 · E1001</b><br />팀원 · E1002~E1007<br />HR 관리자<br /><br /><span style="color: light-dark(rgb(91, 86, 82), rgb(166, 162, 158));">같은 질문이라도 역할과 보고 관계에 따라 다른 행을 조회</span></div></div></div></foreignObject><text x="145" y="327" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="145" y="327">팀장 · E1001</tspan><tspan x="145" y="341">팀원 · E1002~E1007</tspan><tspan x="145" y="355">HR 관리자</tspan><tspan x="145" y="369"></tspan><tspan x="145" y="383">같은 질문이라도 역할과</tspan><tspan x="145" y="397">보고 관계에 따라 다른 행을</tspan><tspan x="145" y="411">조회</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_12"><g transform="translate(0.5,0.5)"><rect x="73.6" y="485" width="142" height="115" rx="9.2" ry="9.2" fill="#ffffff" stroke="#d4cfca" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(212, 207, 202), rgb(62, 58, 54));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 132px; height: 1px; padding-top: 543px; margin-left: 79px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>외부 Agent</b><br />AI Database Private<br />Agent Factory<br /><br /><span style="color: light-dark(rgb(91, 86, 82), rgb(166, 162, 158));">MCP client</span></div></div></div></foreignObject><text x="145" y="518" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="145" y="518">외부 Agent</tspan><tspan x="145" y="532">AI Database Private</tspan><tspan x="145" y="546">Agent Factory</tspan><tspan x="145" y="560"></tspan><tspan x="145" y="574">MCP client</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_13"><g transform="translate(0.5,0.5)"><rect x="73.6" y="645" width="142" height="210" rx="11.36" ry="11.36" fill="#ffffff" stroke="#ae562c" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 132px; height: 1px; padding-top: 750px; margin-left: 79px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>공개 HTTPS</b><br /><br />hmm.cloud-handson.com<br /><br />hmm-backoffice.cloud-handson.com/mcp<br /><br /><span style="color: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));">사용자 Bearer Token</span><br /><span style="color: light-dark(rgb(91, 86, 82), rgb(166, 162, 158));">TLS · HttpOnly portal cookie</span></div></div></div></foreignObject><text x="145" y="698" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="145" y="698">공개 HTTPS</tspan><tspan x="145" y="712"></tspan><tspan x="145" y="726">hmm.cloud-handson.com</tspan><tspan x="145" y="740"></tspan><tspan x="145" y="754">hmm-backoffice.cloud-handson.com/mcp</tspan><tspan x="145" y="768"></tspan><tspan x="145" y="782">사용자 Bearer Token</tspan><tspan x="145" y="796">TLS · HttpOnly portal</tspan><tspan x="145" y="810">cookie</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_14"><g transform="translate(0.5,0.5)"><rect x="269.6" y="140" width="1260" height="900" rx="63" ry="63" fill="#fbfaf9" stroke="#9e9892" pointer-events="all" style="fill: light-dark(rgb(251, 250, 249), rgb(23, 22, 21)); stroke: light-dark(rgb(158, 152, 146), rgb(110, 105, 99));"/></g></g><g data-cell-id="hmm-overview_v_15"><g><rect x="283.6" y="148" width="1232" height="26" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1230px; height: 1px; padding-top: 161px; margin-left: 286px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Oracle Cloud Infrastructure</b></div></div></div></foreignObject><text x="286" y="165" fill="#312D2A" font-family="'Oracle Sans'" font-size="13px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">Oracle Cloud Infrastructure</text></switch></g></g></g><g data-cell-id="hmm-overview_v_16"><g transform="translate(0.5,0.5)"><rect x="299.6" y="185" width="930" height="815" rx="57.05" ry="57.05" fill="#f5f4f2" stroke="#9e9892" pointer-events="all" style="fill: light-dark(rgb(245, 244, 242), rgb(28, 27, 25)); stroke: light-dark(rgb(158, 152, 146), rgb(110, 105, 99));"/></g></g><g data-cell-id="hmm-overview_v_17"><g><rect x="313.6" y="193" width="902" height="26" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 900px; height: 1px; padding-top: 206px; margin-left: 316px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>OCI Region · ap-seoul-1</b></div></div></div></foreignObject><text x="316" y="210" fill="#312D2A" font-family="'Oracle Sans'" font-size="13px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">OCI Region · ap-seoul-1</text></switch></g></g></g><g data-cell-id="hmm-overview_v_18"><g transform="translate(0.5,0.5)"><rect x="334.6" y="230" width="480" height="320" rx="22.4" ry="22.4" fill="#ffffff" stroke="#ae562c" stroke-dasharray="3 3" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g></g><g data-cell-id="hmm-overview_v_19"><g><rect x="348.6" y="238" width="452" height="26" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 450px; height: 1px; padding-top: 251px; margin-left: 351px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #AE562C; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#AE562C, #d38864); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>VCN · Public application subnet</b></div></div></div></foreignObject><text x="351" y="255" fill="#AE562C" font-family="'Oracle Sans'" font-size="13px" style="fill: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));">VCN · Public application subnet</text></switch></g></g></g><g data-cell-id="hmm-overview_oci_20"><g/><g data-cell-id="hmm-overview_ociPart_21"><g/><g data-cell-id="hmm-overview_ociPart_22"><g><rect x="359.6" y="285" width="84" height="84" fill="none" stroke="none" pointer-events="all"/></g><g data-cell-id="hmm-overview_ociPart_23"><g><rect x="359.6" y="285" width="84" height="84" fill="none" stroke="none" pointer-events="all"/></g><g data-cell-id="hmm-overview_ociPart_24"><g><path d="M 364.99 367.8 C 362.59 367.8 360.6 365.8 360.6 363.41 L 360.6 290.39 C 360.6 287.99 362.59 286 364.99 286 L 438.21 286 C 440.61 286 442.6 287.99 442.6 290.39 L 442.6 363.61 C 442.6 366.01 440.61 368 438.21 368 L 364.99 367.8 L 364.99 367.8" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-overview_ociPart_25"><g><path d="M 438.01 287 C 439.81 287 441.41 288.6 441.41 290.4 L 441.41 363.8 C 441.41 365.6 439.81 367.2 438.01 367.2 L 364.98 367.2 C 363.19 367 361.59 365.4 361.59 363.6 L 361.59 290.4 C 361.59 288.6 363.19 287 364.98 287 L 438.01 287 L 438.01 287 M 438.01 285 L 364.98 285 C 361.99 285 359.6 287.4 359.6 290.4 L 359.6 363.8 C 359.6 366.6 361.99 369 364.98 369 L 438.22 369 C 441.21 369 443.6 366.6 443.6 363.6 L 443.6 290.4 C 443.4 287.4 441 285 438.01 285 L 438.01 285" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g></g><g data-cell-id="hmm-overview_ociPart_26"><g><rect x="361.6" y="287" width="80" height="80" fill="none" stroke="none" pointer-events="all"/></g><g data-cell-id="hmm-overview_ociPart_27"><g><path d="M 438.01 287 L 364.99 287 C 363.19 287 361.6 288.6 361.6 290.4 L 361.6 363.8 C 361.6 365.4 363.19 367 364.99 367 L 438.21 367 C 440.01 367 441.6 365.4 441.6 363.6 L 441.6 290.4 C 441.4 288.6 439.81 287 438.01 287 L 438.01 287 M 438.41 363.6 C 438.41 363.8 438.21 364 438.01 364 L 364.99 364 C 364.79 364 364.59 363.8 364.59 363.6 L 364.59 290.4 C 364.59 290.2 364.79 290 364.99 290 L 438.21 290 C 438.41 290 438.61 290.2 438.61 290.4 L 438.41 363.6 L 438.41 363.6" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_28"><g><path d="M 372.6 355 L 430.6 355 L 430.6 338 L 372.6 338 L 372.6 355 L 372.6 355 M 375.39 340.86 L 427.41 340.86 L 427.41 352.33 L 375.39 352.33 L 375.39 340.86 L 375.39 340.86" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_29"><g><path d="M 420.6 349 C 421.7 349 422.6 348.1 422.6 347 C 422.6 345.9 421.7 345 420.6 345 C 419.49 345 418.6 345.9 418.6 347 C 418.6 348.1 419.49 349 420.6 349 L 420.6 349" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_30"><g><path d="M 389.41 298 L 372.6 298 L 372.6 315 L 389.6 315 L 389.41 298 L 389.41 298 M 386.73 312.14 L 375.27 312.14 L 375.27 300.67 L 386.73 300.67 L 386.73 312.14 L 386.73 312.14" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_31"><g><path d="M 409.6 298 L 392.6 298 L 392.6 315 L 409.6 315 L 409.6 298 L 409.6 298 M 406.93 312.14 L 395.47 312.14 L 395.47 300.67 L 406.93 300.67 L 406.93 312.14 L 406.93 312.14" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_32"><g><path d="M 389.41 318 L 372.6 318 L 372.6 335 L 389.6 335 L 389.41 318 L 389.41 318 M 386.73 332.14 L 375.27 332.14 L 375.27 320.67 L 386.73 320.67 L 386.73 332.14 L 386.73 332.14" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_33"><g><path d="M 409.6 318 L 392.6 318 L 392.6 335 L 409.6 335 L 409.6 318 L 409.6 318 M 406.93 332.14 L 395.47 332.14 L 395.47 320.67 L 406.93 320.67 L 406.93 332.14 L 406.93 332.14" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_34"><g><path d="M 429.6 298 L 412.6 298 L 412.6 315 L 429.6 315 L 429.6 298 L 429.6 298 M 426.93 312.14 L 415.47 312.14 L 415.47 300.67 L 426.93 300.67 L 426.93 312.14 L 426.93 312.14" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_35"><g><path d="M 429.6 318 L 412.6 318 L 412.6 335 L 429.6 335 L 429.6 318 L 429.6 318 M 426.93 332.14 L 415.47 332.14 L 415.47 320.67 L 426.93 320.67 L 426.93 332.14 L 426.93 332.14" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g></g></g></g></g><g data-cell-id="hmm-overview_v_36"><g transform="translate(0.5,0.5)"><rect x="464.6" y="280" width="320" height="235" rx="18.8" ry="18.8" fill="#fcfbfa" stroke="#d4cfca" pointer-events="all" style="fill: light-dark(rgb(252, 251, 250), rgb(22, 21, 20)); stroke: light-dark(rgb(212, 207, 202), rgb(62, 58, 54));"/></g></g><g data-cell-id="hmm-overview_v_37"><g><rect x="481.6" y="294" width="286" height="34" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 284px; height: 1px; padding-top: 311px; margin-left: 484px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; "><b>Compute VM · 132.226.232.69</b></div></div></div></foreignObject><text x="484" y="315" fill="#312D2A" font-family="'Oracle Sans'" font-size="13px" font-weight="bold" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">Compute VM · 132.226.232.69</text></switch></g></g></g><g data-cell-id="hmm-overview_v_38"><g transform="translate(0.5,0.5)"><rect x="489.6" y="340" width="270" height="42" rx="3.36" ry="3.36" fill="#ffffff" stroke="#d4cfca" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(212, 207, 202), rgb(62, 58, 54));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 260px; height: 1px; padding-top: 361px; margin-left: 495px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Nginx</b> · TLS / reverse proxy</div></div></div></foreignObject><text x="625" y="365" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">Nginx · TLS / reverse proxy</text></switch></g></g></g><g data-cell-id="hmm-overview_v_39"><g transform="translate(0.5,0.5)"><rect x="489.6" y="396" width="270" height="46" rx="3.68" ry="3.68" fill="#ffffff" stroke="#2f6f8f" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 260px; height: 1px; padding-top: 419px; margin-left: 495px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>AI Web Agent Console</b><br />Streamlit · 질문/근거/감사 UI</div></div></div></foreignObject><text x="625" y="416" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="625" y="416">AI Web Agent Console</tspan><tspan x="625" y="430">Streamlit · 질문/근거/감사 UI</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_40"><g transform="translate(0.5,0.5)"><rect x="489.6" y="456" width="270" height="46" rx="3.68" ry="3.68" fill="#ffffff" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 260px; height: 1px; padding-top: 479px; margin-left: 495px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>VPD Backoffice</b><br />Spring Boot · `/mcp` · 권한 관리</div></div></div></foreignObject><text x="625" y="476" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="625" y="476">VPD Backoffice</tspan><tspan x="625" y="490">Spring Boot · `/mcp` · 권한 관리</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_oci_41"><g/><g data-cell-id="hmm-overview_ociPart_42"><g><rect x="349.6" y="655" width="84" height="81" fill="none" stroke="none" pointer-events="all"/></g><g data-cell-id="hmm-overview_ociPart_43"><g><path d="M 349.6 734 L 349.6 730.86 L 353.5 728.9 L 353.96 728.9 L 353.96 717.32 L 350.79 717.32 L 350.79 695.52 L 353.96 695.52 L 353.96 687.91 L 350.79 687.91 L 350.79 666.12 L 353.96 666.12 L 353.96 655 L 427.24 655 L 427.24 728.9 L 427.7 728.9 L 431.6 730.86 L 431.6 734 L 349.6 734 L 349.6 734" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-overview_ociPart_44"><g><path d="M 427.31 656.93 L 427.31 730.89 L 428.5 730.89 L 431.68 732.49 L 431.68 734.07 L 351.52 734.07 L 351.52 732.49 L 354.7 730.89 L 355.89 730.89 L 355.89 717.39 L 352.72 717.39 L 352.72 697.43 L 355.89 697.43 L 355.89 687.79 L 352.72 687.79 L 352.72 668.06 L 355.89 668.06 L 355.89 656.93 L 427.31 656.93 L 427.31 656.93 M 429.23 655 L 353.97 655 L 353.97 666.13 L 350.79 666.13 L 350.79 689.87 L 353.97 689.87 L 353.97 695.65 L 350.79 695.65 L 350.79 719.3 L 353.97 719.3 L 353.97 729.1 L 353.83 729.1 L 350.66 730.68 L 349.6 731.29 L 349.6 736 L 433.6 736 L 433.6 731.29 L 432.54 730.75 L 429.37 729.17 L 429.23 729.17 L 429.23 655 L 429.23 655" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-overview_ociPart_45"><g><path d="M 358.6 690 L 355.6 690 L 355.6 694 L 358.6 694 L 358.6 690 L 358.6 690" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_46"><g><path d="M 358.76 664.68 L 358.76 663.1 L 358.76 659.16 L 362.7 659.16 L 419.5 659.16 L 423.44 659.16 L 423.44 663.1 L 423.44 719.9 L 423.44 723.84 L 419.5 723.84 L 362.7 723.84 L 358.76 723.84 L 358.76 719.9 L 358.76 718.33 L 355.6 718.33 L 355.6 727 L 426.6 727 L 426.6 656 L 355.6 656 L 355.6 664.68 L 358.76 664.68 L 358.76 664.68" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_47"><g><path d="M 361.31 716.47 L 361.31 722 L 421.6 722 L 421.6 662 L 361.31 662 L 361.31 667.51 L 352.6 667.51 L 352.6 687.25 L 361.31 687.25 L 361.31 696.82 L 352.6 696.82 L 352.6 716.47 L 361.31 716.47 L 361.31 716.47 M 355.77 710.94 L 358.95 710.94 L 358.95 707.77 L 355.77 707.77 L 355.77 705.42 L 358.95 705.42 L 358.95 702.26 L 355.77 702.26 L 355.77 699.89 L 364.49 699.89 L 364.49 684.09 L 355.77 684.09 L 355.77 681.74 L 358.95 681.74 L 358.95 678.58 L 355.77 678.58 L 355.77 676.21 L 358.95 676.21 L 358.95 673.05 L 355.77 673.05 L 355.77 670.67 L 364.49 670.67 L 364.49 665.16 L 418.45 665.16 L 418.45 718.77 L 364.49 718.77 L 364.49 713.31 L 355.77 713.31 L 355.77 710.94 L 355.77 710.94" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_48"><g><path d="M 427.43 731 L 353.77 731 L 350.6 732.49 L 350.6 734 L 353.77 734 L 427.43 734 L 430.6 734 L 430.6 732.49 L 427.43 731 L 427.43 731" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_49"><g><path d="M 405.47 693.29 C 405.44 694.33 405.3 695.36 405.05 696.37 L 407.9 698 C 408.36 696.45 408.6 694.85 408.6 693.24 C 408.6 689.49 407.32 685.85 404.96 682.91 C 402.6 679.96 399.3 677.88 395.6 677 L 395.6 680.25 C 398.45 681.09 400.96 682.81 402.73 685.16 C 404.51 687.51 405.47 690.36 405.47 693.29 L 405.47 693.29" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_50"><g><path d="M 377.83 693.24 C 377.83 690.32 378.79 687.49 380.55 685.15 C 382.31 682.81 384.78 681.09 387.6 680.25 L 387.6 677 C 383.9 677.87 380.61 679.95 378.25 682.89 C 375.89 685.84 374.6 689.48 374.6 693.24 C 374.6 694.85 374.84 696.45 375.29 698 L 378.2 696.31 C 377.96 695.3 377.84 694.27 377.83 693.24 L 377.83 693.24" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_51"><g><path d="M 391.5 707.24 C 388.11 707.22 384.85 706.06 382.4 704 L 379.6 705.44 C 381.15 706.88 383.01 708.03 385.07 708.81 C 387.13 709.6 389.36 710 391.6 710 C 393.85 710 396.07 709.6 398.13 708.81 C 400.19 708.03 402.05 706.88 403.6 705.44 L 400.71 704.02 C 398.21 706.09 394.92 707.24 391.5 707.24 L 391.5 707.24" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_52"><g><path d="M 389.54 684.04 C 388.73 684.17 387.94 684.39 387.19 684.71 C 385.16 685.57 383.46 687.08 382.36 689 C 381.25 690.93 380.8 693.17 381.07 695.38 C 381.19 696.2 381.39 697 381.68 697.76 L 370.6 704.28 C 371.06 705.22 371.59 706.13 372.17 707 L 383.27 700.48 C 383.8 701.12 384.39 701.69 385.05 702.19 C 386.8 703.49 388.92 704.2 391.1 704.2 C 393.28 704.2 395.4 703.49 397.15 702.19 C 397.81 701.69 398.4 701.12 398.93 700.48 L 410.03 707 C 410.61 706.13 411.14 705.22 411.6 704.28 L 400.5 697.76 C 400.81 697 401.02 696.2 401.13 695.38 C 401.4 693.17 400.94 690.93 399.84 689 C 398.74 687.08 397.04 685.57 395.01 684.71 C 394.26 684.39 393.47 684.17 392.66 684.04 L 392.66 671 C 392.15 671 391.62 671 391.09 671 C 390.56 671 390.05 671 389.54 671 L 389.54 684.04 L 389.54 684.04 M 398.08 694.06 C 398.1 695.47 397.71 696.84 396.95 698.02 C 396.19 699.19 395.11 700.11 393.83 700.66 C 392.56 701.21 391.15 701.37 389.79 701.11 C 388.42 700.84 387.17 700.18 386.18 699.19 C 385.2 698.21 384.52 696.95 384.24 695.57 C 383.97 694.2 384.1 692.77 384.63 691.47 C 385.15 690.17 386.04 689.06 387.2 688.28 C 388.35 687.5 389.71 687.08 391.09 687.08 C 392 687.07 392.91 687.25 393.75 687.6 C 394.6 687.95 395.36 688.46 396.02 689.1 C 396.66 689.75 397.18 690.52 397.53 691.38 C 397.89 692.23 398.07 693.14 398.08 694.06 L 398.08 694.06" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_53"><g><path d="M 390.6 698 C 392.81 698 394.6 696.21 394.6 694 C 394.6 691.79 392.81 690 390.6 690 C 388.39 690 386.6 691.79 386.6 694 C 386.6 696.21 388.39 698 390.6 698 L 390.6 698" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g></g></g><g data-cell-id="hmm-overview_v_54"><g transform="translate(0.5,0.5)"><rect x="439.6" y="662" width="160" height="76" rx="6.08" ry="6.08" fill="#ffffff" stroke="#d4cfca" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(212, 207, 202), rgb(62, 58, 54));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 150px; height: 1px; padding-top: 700px; margin-left: 445px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Vault / Secrets</b><br />DB·OCI 자격증명<br /><span style="color: light-dark(rgb(91, 86, 82), rgb(166, 162, 158));">Git 외부 관리</span></div></div></div></foreignObject><text x="520" y="690" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="520" y="690">Vault / Secrets</tspan><tspan x="520" y="704">DB·OCI 자격증명</tspan><tspan x="520" y="718">Git 외부 관리</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_oci_55"><g/><g data-cell-id="hmm-overview_ociPart_56"><g/><g data-cell-id="hmm-overview_ociPart_57"><g><rect x="364.6" y="820" width="84" height="84" fill="none" stroke="none" pointer-events="all"/></g><g data-cell-id="hmm-overview_ociPart_58"><g><rect x="364.6" y="820" width="84" height="84" fill="none" stroke="none" pointer-events="all"/></g><g data-cell-id="hmm-overview_ociPart_59"><g><path d="M 369.99 902.8 C 367.59 902.8 365.6 900.8 365.6 898.41 L 365.6 825.39 C 365.6 822.99 367.59 821 369.99 821 L 443.21 821 C 445.61 821 447.6 822.99 447.6 825.39 L 447.6 898.61 C 447.6 901.01 445.61 903 443.21 903 L 369.99 902.8 L 369.99 902.8" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-overview_ociPart_60"><g><path d="M 443.01 822 C 444.81 822 446.41 823.6 446.41 825.4 L 446.41 898.8 C 446.41 900.6 444.81 902.2 443.01 902.2 L 369.98 902.2 C 368.19 902 366.59 900.4 366.59 898.6 L 366.59 825.4 C 366.59 823.6 368.19 822 369.98 822 L 443.01 822 L 443.01 822 M 443.01 820 L 369.98 820 C 366.99 820 364.6 822.4 364.6 825.4 L 364.6 898.8 C 364.6 901.6 366.99 904 369.98 904 L 443.22 904 C 446.21 904 448.6 901.6 448.6 898.6 L 448.6 825.4 C 448.4 822.4 446 820 443.01 820 L 443.01 820" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g></g><g data-cell-id="hmm-overview_ociPart_61"><g><rect x="377.6" y="839" width="56" height="54" fill="none" stroke="none" pointer-events="all"/></g><g data-cell-id="hmm-overview_ociPart_62"><g><path d="M 423.85 841.82 L 429.1 851.3 L 423.85 860.78 L 413.35 860.78 L 408.1 851.3 L 413.35 841.82 L 423.85 841.82 L 423.85 841.82 M 425.6 839 L 411.6 839 L 404.6 851.5 L 411.6 864 L 425.6 864 L 432.6 851.5 L 425.6 839 L 425.6 839" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_63"><g><path d="M 404.6 870.82 C 409.63 870.82 413.7 875.06 413.7 880.3 C 413.7 885.54 409.63 889.78 404.6 889.78 C 399.57 889.78 395.5 885.54 395.5 880.3 C 395.5 875.06 399.57 870.82 404.6 870.82 L 404.6 870.82 M 404.6 868 C 398.02 868 392.6 873.65 392.6 880.5 C 392.6 887.36 398.02 893 404.6 893 C 411.18 893 416.6 887.36 416.6 880.5 C 416.6 873.44 411.18 868 404.6 868 L 404.6 868" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_64"><g><path d="M 391 845.05 L 399.67 860.97 L 382.53 860.97 L 391 845.05 L 391 845.05 M 391 839 L 377.6 864 L 404.6 864 L 391 839 L 391 839" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g></g><g data-cell-id="hmm-overview_ociPart_65"><g><path d="M 443.2 902 L 370 902 C 368.2 902 366.6 900.4 366.6 898.6 L 366.6 830 L 446.6 830 L 446.6 898.6 C 446.6 900.4 445 902 443.2 902 L 443.2 902 M 369.6 833 L 369.6 898.8 C 369.6 899 369.8 899.2 370 899.2 L 443.4 899.2 C 443.6 899.2 443.8 899 443.8 898.8 L 443.8 833 L 369.6 833 L 369.6 833" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g><g data-cell-id="hmm-overview_ociPart_66"><g><path d="M 446.6 827 L 366.6 827 L 366.6 824.93 C 366.6 823.38 368.2 822 370 822 L 443.4 822 C 445 822 446.6 823.38 446.6 824.93 L 446.6 827 L 446.6 827" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g></g></g></g><g data-cell-id="hmm-overview_v_67"><g transform="translate(0.5,0.5)"><rect x="464.6" y="824" width="180" height="82" rx="6.56" ry="6.56" fill="#ffffff" stroke="#d4cfca" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(212, 207, 202), rgb(62, 58, 54));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 170px; height: 1px; padding-top: 865px; margin-left: 470px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Object Storage</b><br />HR 규정 PDF 원본<br />파일명·생성일 메타데이터</div></div></div></foreignObject><text x="555" y="855" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="555" y="855">Object Storage</tspan><tspan x="555" y="869">HR 규정 PDF 원본</tspan><tspan x="555" y="883">파일명·생성일 메타데이터</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_oci_68"><g/><g data-cell-id="hmm-overview_ociPart_69"><g><rect x="834.6" y="245" width="84" height="73" fill="none" stroke="none" pointer-events="all"/></g><g data-cell-id="hmm-overview_ociPart_70"><g><path d="M 872.82 316 C 867.43 316 862.23 315.48 858.4 314.62 C 853.36 313.4 850.75 311.5 850.75 308.9 L 850.75 283.79 L 834.6 283.79 L 834.77 281.2 C 835.3 274.78 838.95 269.25 844.68 266.3 C 845.89 265.6 846.76 264.57 847.11 263.18 C 847.97 258.68 851.11 254.87 855.27 253.14 C 857.01 252.45 858.92 251.93 861 251.93 C 861.36 251.93 861.87 251.93 862.4 251.93 C 862.57 251.93 862.74 251.93 862.91 251.93 C 864.14 251.93 865.35 251.4 866.05 250.54 C 869 247.25 872.99 245.35 877.34 245 L 879.08 245 C 885.51 245.17 891.24 248.81 894.02 254.52 C 894.19 254.87 894.53 255.39 894.89 255.74 C 895.23 256.25 895.93 257.12 896.27 257.82 C 901.49 257.99 906.18 260.75 908.96 265.09 L 908.96 265.26 L 909.47 267.86 L 916.6 274.95 L 913.12 278.42 L 910.87 276.17 C 909.47 283.45 903.05 288.81 895.4 288.81 C 895.23 288.81 894.89 288.81 894.71 288.81 L 894.71 308.73 C 894.71 311.32 892.28 313.23 887.06 314.44 C 883.41 315.48 878.21 316 872.82 316 L 872.82 316" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-overview_ociPart_71"><g><path d="M 879.2 246.74 C 885.45 246.74 891.01 250.21 893.79 255.77 C 894.13 256.3 894.31 256.82 894.82 257.17 C 895.17 257.69 895.86 258.73 896.38 259.42 C 901.59 259.42 906.28 262.21 908.88 266.38 L 909.58 269.16 L 916.34 275.94 L 914.09 278.2 L 911.14 275.24 C 910.62 282.89 904.19 288.98 896.38 288.98 C 895.86 288.98 895.34 288.98 894.82 288.8 L 894.82 309.83 C 894.82 311.92 892.57 313.66 887.88 314.7 C 884.06 315.57 879.03 316.09 873.65 316.09 C 868.27 316.09 863.24 315.57 859.42 314.7 C 854.73 313.66 852.48 311.92 852.48 309.83 L 852.48 283.76 L 836.51 283.76 L 836.68 282.02 C 837.2 275.94 840.67 270.55 846.06 267.77 C 847.44 267.25 848.49 265.86 848.83 264.29 C 849.7 260.12 852.48 256.47 856.47 254.73 C 858.2 254.04 859.94 253.69 861.85 253.69 C 862.19 253.69 862.71 253.69 863.06 253.69 C 863.24 253.69 863.41 253.69 863.58 253.69 C 864.97 253.69 866.36 253.17 867.4 252.12 C 870.35 248.83 874.52 247.09 878.86 246.91 L 878.86 248.47 L 878.86 246.91 C 878.86 246.74 879.03 246.74 879.2 246.74 L 879.2 246.74 M 880.42 245 L 878.68 245 L 876.94 245 L 876.94 245.18 C 872.79 245.69 868.79 247.61 865.84 250.74 C 865.32 251.61 864.45 251.95 863.41 251.95 C 863.24 251.95 863.24 251.95 863.06 251.95 C 862.55 251.95 862.19 251.95 861.67 251.95 C 859.59 251.95 857.51 252.48 855.6 253.17 C 851.09 255.08 847.96 259.08 846.92 263.94 C 846.75 264.99 846.06 266.03 845.02 266.55 C 839.11 269.68 835.3 275.59 834.78 282.19 L 834.6 283.93 L 834.6 285.67 L 836.51 285.67 L 850.74 285.67 L 850.74 310.01 C 850.74 314.53 856.99 316.09 859.07 316.61 C 863.06 317.48 868.27 318 873.65 318 C 879.2 318 884.24 317.48 888.23 316.61 C 890.31 316.09 896.56 314.7 896.56 310.01 L 896.56 290.89 C 903.85 290.89 910.27 285.84 912.18 278.89 L 912.7 279.41 L 913.91 280.63 L 915.13 279.41 L 917.38 277.16 L 918.6 275.94 L 917.38 274.72 L 910.96 268.29 L 910.44 266.03 L 910.44 265.68 L 910.27 265.51 C 907.5 260.99 902.63 258.04 897.26 257.69 C 896.9 257.17 896.38 256.47 896.21 256.13 L 896.21 255.95 L 896.04 255.77 C 895.86 255.77 895.52 255.43 895.34 255.08 C 892.57 249.17 886.84 245.52 880.42 245 L 880.42 245" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-overview_ociPart_72"><g><path d="M 839.08 279.64 L 849.17 279.64 L 849.17 282.74 L 835.6 282.74 L 835.78 281.02 C 836.3 274.98 839.78 269.63 845.17 266.87 C 846.56 266.18 847.6 264.8 847.95 263.25 C 848.82 259.11 851.6 255.49 855.6 253.76 C 857.51 252.73 859.78 252.38 862.03 252.73 C 863.78 252.9 865.34 252.38 866.38 251.17 C 869.34 247.9 873.51 246.17 877.86 246 C 878.03 246 878.21 246 878.21 246 C 884.47 246 890.03 249.45 892.82 254.97 C 893.17 255.49 893.34 256.01 893.86 256.35 C 892.64 256.52 891.42 256.69 890.38 257.04 C 890.21 256.87 890.21 256.69 890.03 256.35 C 887.78 251.87 883.25 249.11 878.21 249.11 C 878.03 249.11 878.03 249.11 877.86 249.11 C 874.38 249.11 870.9 250.66 868.47 253.24 C 866.73 255.14 864.12 256.18 861.51 255.83 C 859.78 255.66 858.21 256.01 856.47 256.69 C 853.51 258.08 851.26 260.66 850.73 263.94 C 850.21 266.53 848.64 268.6 846.21 269.81 C 842.56 271.7 839.94 275.33 839.08 279.64 L 839.08 279.64 M 894.03 264.8 L 897.17 264.8 L 901.51 280.15 L 898.03 280.15 L 897.51 276.88 L 893.69 276.88 L 892.82 280.15 L 889.51 280.15 L 894.03 264.8 L 894.03 264.8 M 894.21 274.29 L 896.82 274.29 L 895.42 268.6 L 894.21 274.29 L 894.21 274.29 M 880.82 272.22 L 877.86 269.29 L 875.6 271.53 L 882.38 278.26 L 889.17 271.53 L 886.9 269.29 L 884.12 272.05 C 884.64 266.18 889.69 261.7 895.6 261.7 C 899.94 261.7 903.78 264.11 905.86 267.73 L 908.12 265.49 C 905.51 261.35 900.82 258.59 895.6 258.59 C 887.78 258.59 881.34 264.63 880.82 272.22 L 880.82 272.22 M 915.6 274.81 L 908.82 268.25 L 902.03 274.98 L 904.3 277.22 L 907.08 274.46 C 906.56 280.33 901.51 284.81 895.6 284.81 C 891.26 284.81 887.42 282.4 885.34 278.78 L 883.08 281.02 C 885.69 285.16 890.38 287.92 895.6 287.92 C 903.42 287.92 909.86 281.88 910.38 274.29 L 913.34 277.22 L 915.6 274.81 L 915.6 274.81 M 890.73 289.99 C 891.78 290.33 892.82 290.51 893.86 290.68 L 893.86 308.79 C 893.86 310.86 891.6 312.59 886.9 313.62 C 883.08 314.48 878.03 315 872.64 315 C 867.26 315 862.21 314.48 858.38 313.62 C 853.69 312.59 851.42 310.86 851.42 308.79 L 851.42 274.81 C 851.42 272.74 853.69 271.18 858.38 270.15 C 862.03 269.29 867.08 268.94 872.64 268.94 C 872.82 268.94 873.17 268.94 873.51 268.94 L 873.51 272.05 C 873.34 272.05 872.99 272.05 872.64 272.05 C 861.17 272.05 855.42 273.94 854.73 274.98 L 854.73 275.15 C 855.42 276.36 862.03 278.26 872.64 278.26 C 874.9 278.26 876.82 278.26 878.73 278.09 C 879.08 279.12 879.42 280.15 879.95 281.19 C 877.69 281.36 875.26 281.54 872.64 281.54 C 867.26 281.54 862.21 281.02 858.38 280.15 C 856.82 279.81 855.6 279.46 854.56 278.95 L 854.56 286.37 C 855.26 287.57 861.86 289.47 872.47 289.47 C 878.38 289.47 883.08 288.78 886.21 288.09 C 887.78 288.78 889.17 289.47 890.73 289.99 C 889.69 290.51 888.47 290.85 886.9 291.19 C 883.08 292.06 878.03 292.58 872.64 292.58 C 867.26 292.58 862.21 292.06 858.38 291.19 C 856.82 290.85 855.6 290.51 854.56 289.99 L 854.56 297.4 C 855.26 298.61 861.86 300.51 872.47 300.51 C 883.08 300.51 889.69 298.44 890.38 297.4 L 890.73 289.99 L 890.73 289.99 M 890.73 301.2 C 889.69 301.72 888.47 302.06 886.9 302.41 C 883.08 303.27 878.03 303.79 872.64 303.79 C 867.26 303.79 862.21 303.27 858.38 302.41 C 856.82 302.06 855.6 301.72 854.56 301.2 L 854.56 308.62 C 855.26 309.65 861.17 311.72 872.47 311.72 C 883.78 311.72 889.86 309.48 890.38 308.62 L 890.73 301.2 L 890.73 301.2" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g></g></g><g data-cell-id="hmm-overview_v_73"><g><rect x="924.6" y="240" width="270" height="690" rx="21.6" ry="21.6" fill="#ffffff" stroke="#c74634" stroke-width="2" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g></g><g data-cell-id="hmm-overview_v_74"><g><rect x="939.6" y="258" width="238" height="40" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 236px; height: 1px; padding-top: 278px; margin-left: 942px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 14px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; "><b>Autonomous Database · HMMAIPOC</b></div></div></div></foreignObject><text x="942" y="274" fill="#312D2A" font-family="'Oracle Sans'" font-size="14px" font-weight="bold" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="942" y="274">Autonomous Database ·</tspan><tspan x="942" y="291">HMMAIPOC</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_75"><g transform="translate(0.5,0.5)"><rect x="944.6" y="314" width="230" height="72" rx="5.76" ry="5.76" fill="#fff7f2" stroke="#ae562c" pointer-events="all" style="fill: light-dark(rgb(255, 247, 242), rgb(30, 23, 19)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 220px; height: 1px; padding-top: 350px; margin-left: 950px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>MCP Tool 계약</b><br />BACKOFFICE_MCP_TOOLS<br /><span style="color: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));">시작 시 USER_AI_AGENT_TOOLS.ENABLED 검증</span></div></div></div></foreignObject><text x="1060" y="333" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1060" y="333">MCP Tool 계약</tspan><tspan x="1060" y="347">BACKOFFICE_MCP_TOOLS</tspan><tspan x="1060" y="361">시작 시</tspan><tspan x="1060" y="375">USER_AI_AGENT_TOOLS.ENABLED 검증</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_76"><g transform="translate(0.5,0.5)"><rect x="944.6" y="402" width="230" height="78" rx="6.24" ry="6.24" fill="#fcfbfa" stroke="#d4cfca" pointer-events="all" style="fill: light-dark(rgb(252, 251, 250), rgb(22, 21, 20)); stroke: light-dark(rgb(212, 207, 202), rgb(62, 58, 54));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 220px; height: 1px; padding-top: 441px; margin-left: 950px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>ADB Agent Tools</b><br />resolve_hr_term<br />search_hr_policy<br /><span style="color: light-dark(rgb(91, 86, 82), rgb(166, 162, 158));">DBMS_CLOUD_AI_AGENT.RUN_TOOL</span></div></div></div></foreignObject><text x="1060" y="424" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1060" y="424">ADB Agent Tools</tspan><tspan x="1060" y="438">resolve_hr_term</tspan><tspan x="1060" y="452">search_hr_policy</tspan><tspan x="1060" y="466">DBMS_CLOUD_AI_AGENT.RUN_TOOL</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_77"><g transform="translate(0.5,0.5)"><rect x="944.6" y="495" width="230" height="80" rx="6.4" ry="6.4" fill="#f4f8fa" stroke="#2f6f8f" pointer-events="all" style="fill: light-dark(rgb(244, 248, 250), rgb(22, 25, 27)); stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 220px; height: 1px; padding-top: 535px; margin-left: 950px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>search_hr_data · SELECT_AI</b><br />ADMIN: SHOWSQL 생성/검증<br />CB_ORDS: 읽기 전용 SQL 실행</div></div></div></foreignObject><text x="1060" y="525" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1060" y="525">search_hr_data · SELECT_AI</tspan><tspan x="1060" y="539">ADMIN: SHOWSQL 생성/검증</tspan><tspan x="1060" y="553">CB_ORDS: 읽기 전용 SQL 실행</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_78"><g transform="translate(0.5,0.5)"><rect x="944.6" y="590" width="230" height="92" rx="7.36" ry="7.36" fill="#fff7f2" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(255, 247, 242), rgb(30, 23, 19)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 220px; height: 1px; padding-top: 636px; margin-left: 950px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Bearer → Secure Context → VPD</b><br />HMM_ACCESS_CTX<br />HMM_LEAVE_SCOPE_POLICY<br /><span style="color: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));">SELF · MANAGED_TEAM · ALL</span></div></div></div></foreignObject><text x="1060" y="619" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1060" y="619">Bearer → Secure Context → VPD</tspan><tspan x="1060" y="633">HMM_ACCESS_CTX</tspan><tspan x="1060" y="647">HMM_LEAVE_SCOPE_POLICY</tspan><tspan x="1060" y="661">SELF · MANAGED_TEAM · ALL</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_79"><g transform="translate(0.5,0.5)"><rect x="944.6" y="698" width="230" height="72" rx="5.76" ry="5.76" fill="#fcfbfa" stroke="#d4cfca" pointer-events="all" style="fill: light-dark(rgb(252, 251, 250), rgb(22, 21, 20)); stroke: light-dark(rgb(212, 207, 202), rgb(62, 58, 54));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 220px; height: 1px; padding-top: 734px; margin-left: 950px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>HMM HR 정형 데이터</b><br />직원·팀·휴가·근태<br />역할·그룹·권한·Token hash</div></div></div></foreignObject><text x="1060" y="724" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1060" y="724">HMM HR 정형 데이터</tspan><tspan x="1060" y="738">직원·팀·휴가·근태</tspan><tspan x="1060" y="752">역할·그룹·권한·Token hash</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_80"><g transform="translate(0.5,0.5)"><rect x="944.6" y="785" width="230" height="62" rx="4.96" ry="4.96" fill="#fcfbfa" stroke="#d4cfca" pointer-events="all" style="fill: light-dark(rgb(252, 251, 250), rgb(22, 21, 20)); stroke: light-dark(rgb(212, 207, 202), rgb(62, 58, 54));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 220px; height: 1px; padding-top: 816px; margin-left: 950px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>정책 지식</b><br />Abstract · Tag · Chunk · Embed 4 Vector</div></div></div></foreignObject><text x="1060" y="813" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1060" y="813">정책 지식</tspan><tspan x="1060" y="827">Abstract · Tag · Chunk · Embed 4 Vector</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_81"><g transform="translate(0.5,0.5)"><rect x="944.6" y="862" width="230" height="52" rx="4.16" ry="4.16" fill="#fcfbfa" stroke="#d4cfca" pointer-events="all" style="fill: light-dark(rgb(252, 251, 250), rgb(22, 21, 20)); stroke: light-dark(rgb(212, 207, 202), rgb(62, 58, 54));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 220px; height: 1px; padding-top: 888px; margin-left: 950px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Federation View</b><br />HMM_RDS_*_V · 선사 배정 View</div></div></div></foreignObject><text x="1060" y="885" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1060" y="885">Federation View</tspan><tspan x="1060" y="899">HMM_RDS_*_V · 선사 배정 View</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_82"><g transform="translate(0.5,0.5)"><rect x="1254.6" y="185" width="240" height="300" rx="16.8" ry="16.8" fill="#f5f4f2" stroke="#9e9892" pointer-events="all" style="fill: light-dark(rgb(245, 244, 242), rgb(28, 27, 25)); stroke: light-dark(rgb(158, 152, 146), rgb(110, 105, 99));"/></g></g><g data-cell-id="hmm-overview_v_83"><g><rect x="1268.6" y="193" width="212" height="26" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 210px; height: 1px; padding-top: 206px; margin-left: 1271px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>OCI Region · us-chicago-1</b></div></div></div></foreignObject><text x="1271" y="210" fill="#312D2A" font-family="'Oracle Sans'" font-size="13px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">OCI Region · us-chicago-1</text></switch></g></g></g><g data-cell-id="hmm-overview_oci_84"><g/><g data-cell-id="hmm-overview_ociPart_85"><g><rect x="1289.6" y="240" width="78" height="84" fill="none" stroke="none" pointer-events="all"/></g><g data-cell-id="hmm-overview_ociPart_86"><g><path d="M 1327.9 323 C 1325.5 323 1323.12 322 1321.51 320.39 C 1319.52 318.39 1318.73 315.78 1318.93 312.98 L 1305.56 305.35 C 1303.96 306.76 1301.77 307.76 1299.58 307.76 C 1297.19 307.76 1294.79 306.76 1293.2 305.16 C 1291.4 303.35 1290.6 301.15 1290.6 298.74 C 1290.6 296.33 1291.59 293.93 1293.2 292.32 C 1294.19 291.32 1295.39 290.72 1296.59 290.12 L 1296.59 274.69 C 1295.39 274.28 1294.19 273.48 1293.2 272.48 C 1291.4 270.68 1290.6 268.47 1290.6 266.06 C 1290.6 263.66 1291.4 261.25 1293 259.44 C 1294.79 257.84 1296.99 256.84 1299.38 256.84 C 1301.57 256.84 1303.56 257.64 1305.16 258.84 L 1318.73 251.02 C 1318.33 248.22 1319.32 245.61 1321.31 243.61 C 1323.12 241.8 1325.3 241 1327.7 241 C 1330.09 241 1332.48 242 1334.07 243.61 C 1336.07 245.61 1337.07 248.62 1336.67 251.42 L 1349.84 259.04 C 1351.44 257.64 1353.63 256.84 1355.62 256.84 C 1358.01 256.84 1360.41 257.84 1362 259.44 C 1363.8 261.25 1364.6 263.45 1364.6 265.86 C 1364.6 268.27 1363.61 270.68 1362 272.27 C 1361.21 273.08 1359.81 274.08 1358.21 274.69 L 1358.21 289.92 C 1359.81 290.32 1361.01 291.12 1362 291.92 C 1363.8 293.73 1364.6 295.93 1364.6 298.34 C 1364.6 300.75 1363.61 303.15 1362 304.76 C 1360.21 306.56 1358.01 307.36 1355.62 307.36 C 1353.23 307.36 1351.04 306.56 1349.44 304.96 L 1336.47 312.37 C 1336.87 315.18 1335.88 317.99 1333.88 319.99 C 1332.48 322 1330.29 323 1327.9 323 L 1327.9 323" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-overview_ociPart_87"><g><path d="M 1328.5 242 C 1330.52 242 1332.73 242.8 1334.35 244.39 C 1336.36 246.38 1337.16 249.18 1336.56 251.97 L 1351.28 260.35 C 1352.69 258.76 1354.7 257.96 1356.72 257.96 C 1358.73 257.96 1360.95 258.76 1362.56 260.35 C 1364.18 261.95 1364.99 263.94 1364.99 266.14 C 1364.99 268.33 1364.18 270.32 1362.56 271.92 C 1361.36 273.12 1359.95 273.92 1358.53 274.32 L 1358.53 291.08 C 1360.15 291.48 1361.36 291.88 1362.56 293.07 C 1364.18 294.67 1364.99 296.67 1364.99 298.86 C 1364.99 301.05 1364.18 303.05 1362.56 304.65 C 1360.95 306.24 1358.93 307.04 1356.72 307.04 C 1354.7 307.04 1352.49 306.24 1350.87 304.65 C 1350.67 304.44 1350.67 304.44 1350.67 304.25 L 1336.36 312.42 C 1336.96 315.02 1336.16 318.01 1334.14 319.81 C 1332.53 321.4 1330.52 322.2 1328.3 322.2 C 1326.09 322.2 1324.07 321.4 1322.45 319.81 C 1320.64 318.01 1319.63 315.22 1320.24 312.63 L 1305.73 303.85 L 1305.53 304.05 C 1303.91 305.65 1301.89 306.44 1299.68 306.44 C 1297.67 306.44 1295.44 305.65 1293.84 304.05 C 1292.42 302.65 1291.61 300.45 1291.61 298.46 C 1291.61 296.26 1292.42 294.27 1294.03 292.68 C 1295.04 291.68 1296.25 290.88 1297.67 290.68 L 1297.67 273.92 C 1296.25 273.52 1295.04 272.92 1294.03 271.92 C 1292.42 270.13 1291.61 268.13 1291.61 265.94 C 1291.61 263.75 1292.42 261.75 1294.03 260.15 C 1295.64 258.76 1297.67 257.96 1299.68 257.96 C 1301.7 257.96 1303.7 258.76 1305.32 260.15 L 1320.24 251.58 C 1319.63 248.98 1320.43 246.18 1322.45 244.39 C 1324.26 242.8 1326.29 242 1328.5 242 L 1328.5 242 M 1328.5 240 C 1325.89 240 1323.26 241 1321.24 242.99 C 1319.23 244.99 1318.23 247.78 1318.23 250.58 L 1305.53 257.76 C 1303.91 256.56 1301.89 255.96 1299.68 255.96 C 1297.06 255.96 1294.44 256.96 1292.63 258.96 C 1290.61 260.95 1289.6 263.34 1289.6 266.14 C 1289.6 268.73 1290.61 271.32 1292.63 273.32 C 1293.43 274.12 1294.64 274.92 1295.64 275.31 L 1295.64 289.28 C 1294.44 289.88 1293.43 290.48 1292.63 291.28 C 1290.61 293.27 1289.6 295.67 1289.6 298.46 C 1289.6 301.05 1290.61 303.65 1292.63 305.65 C 1294.64 307.64 1297.06 308.64 1299.87 308.64 C 1302.1 308.64 1304.31 307.84 1306.13 306.65 L 1318.43 313.63 C 1318.43 316.41 1319.43 319.01 1321.44 321.01 C 1323.46 323 1325.89 324 1328.7 324 C 1331.32 324 1333.94 323 1335.96 321.01 C 1337.97 319.01 1339.18 316.02 1338.99 313.22 L 1350.87 306.44 C 1352.69 307.84 1354.9 308.64 1357.33 308.64 C 1359.95 308.64 1362.56 307.64 1364.58 305.65 C 1366.59 303.65 1367.6 301.25 1367.6 298.46 C 1367.6 295.87 1366.59 293.27 1364.58 291.28 C 1363.57 290.28 1362.56 289.68 1361.16 289.08 L 1361.16 275.31 C 1362.36 274.72 1363.57 273.92 1364.58 272.92 C 1366.59 270.93 1367.6 268.53 1367.6 265.74 C 1367.6 263.14 1366.59 260.55 1364.58 258.56 C 1362.56 256.56 1360.15 255.57 1357.33 255.57 C 1355.1 255.57 1353.09 256.16 1351.28 257.56 L 1338.99 250.58 C 1339.18 247.59 1338.17 244.79 1335.96 242.6 C 1333.74 241 1331.13 240 1328.5 240 L 1328.5 240" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-overview_ociPart_88"><g><path d="M 1357.99 290.73 L 1357.99 273.88 C 1359.6 273.48 1361 272.68 1361.99 271.47 C 1363.6 269.87 1364.4 267.87 1364.4 265.66 C 1364.4 263.45 1363.6 261.45 1361.99 259.85 C 1358.8 256.64 1353.8 256.64 1350.61 259.85 L 1336 251.83 C 1336.6 249.22 1335.8 246.22 1333.81 244.21 C 1330.6 241 1325.6 241 1322.41 244.21 C 1320.4 246.22 1319.6 248.82 1320.2 251.42 L 1305.4 260.04 C 1302.21 257.04 1297.21 257.04 1294 260.25 C 1292.41 261.65 1291.6 263.66 1291.6 265.86 C 1291.6 268.07 1292.41 270.07 1294 271.67 C 1295 272.68 1296.21 273.48 1297.61 273.68 L 1297.61 290.52 C 1296.21 290.92 1295 291.53 1294 292.52 C 1292.41 294.33 1291.6 296.34 1291.6 298.54 C 1291.6 300.75 1292.41 302.75 1294 304.36 C 1295.6 305.76 1297.61 306.56 1299.6 306.56 C 1301.61 306.56 1303.8 305.76 1305.4 304.16 L 1305.61 303.95 L 1320.2 312.38 C 1319.8 314.99 1320.6 317.59 1322.41 319.59 C 1324 321.2 1326 322 1328.2 322 C 1330.2 322 1332.4 321.2 1334.01 319.59 C 1336 317.59 1336.8 314.78 1336.2 312.17 L 1350.39 303.95 C 1350.39 304.16 1350.61 304.16 1350.61 304.36 C 1352.2 305.96 1354.2 306.76 1356.4 306.76 C 1358.4 306.76 1360.6 305.96 1362.2 304.36 C 1363.8 302.75 1364.6 300.75 1364.6 298.54 C 1364.6 296.34 1363.8 294.33 1362.2 292.73 C 1360.8 291.53 1359.4 291.12 1357.99 290.73 L 1357.99 290.73 M 1334.41 308.76 C 1334.2 308.57 1334.01 308.37 1333.81 308.17 C 1332.8 307.16 1331.4 306.36 1330.01 306.16 L 1330.01 292.13 C 1332.6 291.92 1335.01 290.92 1337.2 289.52 L 1348.4 295.93 C 1348 297.34 1347.8 298.95 1348.4 300.55 L 1334.41 308.76 L 1334.41 308.76 M 1322.41 308.17 C 1322.2 308.37 1321.81 308.76 1321.6 308.97 L 1307.4 300.75 C 1307.8 299.14 1307.8 297.54 1307.4 295.93 L 1318.6 289.32 C 1321 290.73 1323.6 291.72 1326.41 291.92 L 1326.41 305.96 C 1325 306.36 1323.6 306.97 1322.41 308.17 L 1322.41 308.17 M 1301.4 273.88 C 1303 273.48 1304.41 272.88 1305.4 271.67 C 1305.61 271.47 1305.61 271.47 1305.81 271.28 L 1315.6 276.89 C 1314.41 278.09 1313.41 279.49 1312.59 281.1 L 1312 281.9 L 1312.4 282.71 C 1313.21 284.31 1314.21 285.71 1315.4 286.91 L 1305.4 292.73 C 1304.2 291.53 1302.81 290.92 1301.4 290.52 L 1301.4 273.88 L 1301.4 273.88 M 1321.81 254.83 C 1322 255.04 1322.2 255.43 1322.41 255.64 C 1323.6 256.84 1325 257.44 1326.41 257.84 L 1326.41 271.67 C 1323.6 271.88 1321 272.88 1318.6 274.28 L 1307.6 267.87 C 1308 266.26 1308 264.66 1307.4 263.06 L 1321.81 254.83 L 1321.81 254.83 M 1333.81 255.64 C 1334.01 255.43 1334.2 255.23 1334.2 255.04 L 1348.4 263.26 C 1347.8 264.86 1347.8 266.47 1348.2 267.87 L 1337.6 274.28 C 1335.4 272.88 1332.8 271.88 1330.2 271.67 L 1330.2 257.64 C 1331.4 257.44 1332.8 256.64 1333.81 255.64 L 1333.81 255.64 M 1338.2 284.31 C 1332.6 289.92 1323.8 289.92 1318.2 284.31 C 1317.41 283.51 1316.8 282.71 1316.2 281.9 C 1316.8 281.1 1317.41 280.3 1318.2 279.49 C 1323.8 273.88 1332.6 273.88 1338.2 279.49 C 1339.01 280.3 1339.6 281.1 1340.2 281.9 C 1339.4 282.71 1338.8 283.51 1338.2 284.31 L 1338.2 284.31 M 1350.61 292.73 C 1350.61 292.73 1350.39 292.73 1350.61 292.73 L 1340.6 287.11 C 1340.6 287.11 1340.8 287.11 1340.8 286.91 C 1341.99 285.71 1343.01 284.31 1343.8 282.71 L 1344.2 281.9 L 1343.8 281.1 C 1343.01 279.49 1341.99 278.09 1340.8 276.89 L 1350.39 271.28 C 1350.61 271.47 1350.61 271.47 1350.8 271.67 C 1351.8 272.68 1353.2 273.48 1354.59 273.88 L 1354.59 290.73 C 1352.8 290.92 1351.6 291.72 1350.61 292.73 L 1350.61 292.73 M 1353.2 262.85 C 1355 261.05 1357.6 261.05 1359.4 262.85 C 1360.2 263.66 1360.6 264.86 1360.6 265.86 C 1360.6 267.07 1360.2 268.07 1359.4 268.87 C 1358.59 269.67 1357.39 270.27 1356.2 270.07 C 1355 270.07 1353.99 269.67 1353.2 268.87 C 1351.8 267.46 1351.4 265.26 1352.6 263.45 C 1352.8 263.26 1353 263.06 1353.2 262.85 L 1353.2 262.85 M 1325 246.82 C 1326.8 245.01 1329.4 245.01 1331.2 246.82 C 1332.6 248.22 1332.8 250.23 1332 251.83 C 1331.8 252.23 1331.4 252.63 1331.2 253.03 C 1329.4 254.83 1326.8 254.83 1325 253.03 C 1324.6 252.63 1324.2 252.23 1324 251.63 C 1323.4 250.02 1323.8 248.01 1325 246.82 L 1325 246.82 M 1295.4 265.86 C 1295.4 264.66 1295.8 263.66 1296.61 262.85 C 1298.4 261.05 1301.01 261.05 1302.81 262.85 C 1303 263.06 1303.2 263.26 1303.4 263.45 C 1304.61 265.26 1304.41 267.46 1302.81 269.07 C 1302 269.87 1300.81 270.48 1299.6 270.27 C 1298.4 270.27 1297.4 269.87 1296.61 269.07 C 1295.8 268.26 1295.4 267.07 1295.4 265.86 L 1295.4 265.86 M 1296.61 301.55 C 1295.8 300.75 1295.4 299.55 1295.4 298.54 C 1295.4 297.34 1295.8 296.34 1296.61 295.54 C 1297.4 294.74 1298.4 294.33 1299.6 294.33 C 1300.81 294.33 1302 294.74 1302.81 295.54 C 1304.2 296.94 1304.41 299.14 1303.4 300.75 C 1303.2 301.15 1303 301.35 1302.81 301.75 C 1301.01 303.35 1298.4 303.35 1296.61 301.55 L 1296.61 301.55 M 1331.2 316.99 C 1329.4 318.79 1326.8 318.79 1325 316.99 C 1323.8 315.79 1323.4 313.98 1324 312.17 C 1324.2 311.58 1324.6 311.17 1325 310.77 C 1326.8 308.97 1329.4 308.97 1331.2 310.77 C 1331.6 311.17 1331.8 311.58 1332 311.97 C 1332.8 313.78 1332.6 315.79 1331.2 316.99 L 1331.2 316.99 M 1359.4 301.55 C 1357.6 303.35 1355 303.35 1353.2 301.55 C 1353 301.15 1352.6 300.95 1352.4 300.55 C 1351.4 298.95 1351.8 296.74 1353.2 295.33 C 1353.99 294.53 1355 294.13 1356.2 294.13 C 1357.39 294.13 1358.59 294.53 1359.4 295.33 C 1360.2 296.14 1360.6 297.34 1360.6 298.34 C 1360.6 299.75 1360.2 300.75 1359.4 301.55 L 1359.4 301.55 M 1333 281.9 C 1333 284.51 1331.01 286.51 1328.4 286.51 C 1325.81 286.51 1323.8 284.51 1323.8 281.9 C 1323.8 279.3 1325.81 277.29 1328.4 277.29 C 1330.8 277.29 1333 279.3 1333 281.9 L 1333 281.9" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g></g></g><g data-cell-id="hmm-overview_v_89"><g transform="translate(0.5,0.5)"><rect x="1279.6" y="340" width="190" height="110" rx="8.8" ry="8.8" fill="#ffffff" stroke="#ae562c" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 180px; height: 1px; padding-top: 395px; margin-left: 1285px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>OCI Generative AI</b><br /><br />GPT-5.4 Mini<br /><span style="color: light-dark(rgb(91, 86, 82), rgb(166, 162, 158));">질문 계획 · SQL 생성 · 답변</span><br /><br />Cohere Embed 4<br /><span style="color: light-dark(rgb(91, 86, 82), rgb(166, 162, 158));">용어·문서 Vector</span></div></div></div></foreignObject><text x="1375" y="357" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1375" y="357">OCI Generative AI</tspan><tspan x="1375" y="371"></tspan><tspan x="1375" y="385">GPT-5.4 Mini</tspan><tspan x="1375" y="399">질문 계획 · SQL 생성 · 답변</tspan><tspan x="1375" y="413"></tspan><tspan x="1375" y="427">Cohere Embed 4</tspan><tspan x="1375" y="441">용어·문서 Vector</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_90"><g transform="translate(0.5,0.5)"><rect x="1554.6" y="140" width="235" height="900" rx="16.45" ry="16.45" fill="#ffffff" stroke="#6b7280" stroke-dasharray="3 3" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(107, 114, 128), rgb(134, 140, 152));"/></g></g><g data-cell-id="hmm-overview_v_91"><g><rect x="1568.6" y="148" width="207" height="26" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 205px; height: 1px; padding-top: 161px; margin-left: 1571px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #6B7280; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#6B7280, #868c98); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>3rd Party Cloud · AWS</b></div></div></div></foreignObject><text x="1571" y="165" fill="#6B7280" font-family="'Oracle Sans'" font-size="13px" style="fill: light-dark(rgb(107, 114, 128), rgb(134, 140, 152));">3rd Party Cloud · AWS</text></switch></g></g></g><g data-cell-id="hmm-overview_v_92"><g transform="translate(0.5,0.5)"><path d="M 1589.6 565 C 1589.6 556.72 1626.54 550 1672.1 550 C 1693.98 550 1714.96 551.58 1730.44 554.39 C 1745.91 557.21 1754.6 561.02 1754.6 565 L 1754.6 715 C 1754.6 723.28 1717.66 730 1672.1 730 C 1626.54 730 1589.6 723.28 1589.6 715 Z" fill="#f9fafb" stroke="#6b7280" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(249, 250, 251), rgb(21, 22, 23)); stroke: light-dark(rgb(107, 114, 128), rgb(134, 140, 152));"/><path d="M 1754.6 565 C 1754.6 573.28 1717.66 580 1672.1 580 C 1626.54 580 1589.6 573.28 1589.6 565" fill="none" stroke="#6b7280" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(107, 114, 128), rgb(134, 140, 152));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 163px; height: 1px; padding-top: 659px; margin-left: 1591px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>AWS RDS PostgreSQL</b><br /><br />hmm_demo.carriers<br />carrier_monthly_performance<br /><br /><span style="color: light-dark(rgb(91, 86, 82), rgb(166, 162, 158));">가상 선사 8개<br />월간 실적 144행</span></div></div></div></foreignObject><text x="1672" y="620" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1672" y="620">AWS RDS PostgreSQL</tspan><tspan x="1672" y="634"></tspan><tspan x="1672" y="648">hmm_demo.carriers</tspan><tspan x="1672" y="662">carrier_monthly_performance</tspan><tspan x="1672" y="676"></tspan><tspan x="1672" y="690">가상 선사 8개</tspan><tspan x="1672" y="704">월간 실적 144행</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_e_93"><g><path d="M 215.6 342.5 L 342.6 342.5 Q 352.6 342.5 352.6 351.75 L 352.6 356.38 Q 352.6 361 362.6 361 L 479.36 361" fill="none" stroke="#2f6f8f" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/><path d="M 487.36 361 L 479.36 365 L 479.36 357 Z" fill="#2f6f8f" stroke="#2f6f8f" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(47, 111, 143), rgb(106, 161, 189)); stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 352px; margin-left: 353px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">HTTPS · 질문/관리</div></div></div></foreignObject><text x="353" y="355" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">HTTPS · 질문/관리</text></switch></g></g></g><g data-cell-id="hmm-overview_e_94"><g><path d="M 215.6 542.5 L 342.6 542.5 Q 352.6 542.5 352.6 532.5 L 352.6 489 Q 352.6 479 362.6 479 L 479.36 479" fill="none" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/><path d="M 487.36 479 L 479.36 483 L 479.36 475 Z" fill="#c74634" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 511px; margin-left: 353px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">MCP initialize · tools/list · tools/call</div></div></div></foreignObject><text x="353" y="514" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">MCP initialize · tools/list · tools/call</text></switch></g></g></g><g data-cell-id="hmm-overview_e_95"><g><path d="M 624.6 382 L 624.6 385.76" fill="none" stroke="#2f6f8f" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/><path d="M 624.6 393.76 L 620.6 385.76 L 628.6 385.76 Z" fill="#2f6f8f" stroke="#2f6f8f" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(47, 111, 143), rgb(106, 161, 189)); stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/></g></g><g data-cell-id="hmm-overview_e_96"><g><path d="M 759.6 419 L 789.6 419 Q 799.6 419 799.6 429 L 799.6 469 Q 799.6 479 789.6 479 L 769.84 479" fill="none" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/><path d="M 761.84 479 L 769.84 475 L 769.84 483 Z" fill="#c74634" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 449px; margin-left: 800px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">MCP</div></div></div></foreignObject><text x="800" y="452" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">MCP</text></switch></g></g></g><g data-cell-id="hmm-overview_e_97"><g><path d="M 759.6 479 L 814.6 479 Q 824.6 479 834.6 479 L 894.6 479 Q 904.6 479 904.6 469 L 904.6 360 Q 904.6 350 914.6 350 L 934.36 350" fill="none" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/><path d="M 942.36 350 L 934.36 354 L 934.36 346 Z" fill="#c74634" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 466px; margin-left: 905px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">JDBC · Tool 호출</div></div></div></foreignObject><text x="905" y="470" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">JDBC · Tool 호출</text></switch></g></g></g><g data-cell-id="hmm-overview_e_98"><g><path d="M 1059.6 386 L 1059.6 391.76" fill="none" stroke="#2f6b4f" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/><path d="M 1059.6 399.76 L 1055.6 391.76 L 1063.6 391.76 Z" fill="#2f6b4f" stroke="#2f6b4f" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(47, 107, 79), rgb(119, 171, 147)); stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 394px; margin-left: 1060px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">ENABLED</div></div></div></foreignObject><text x="1060" y="397" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">ENABLED</text></switch></g></g></g><g data-cell-id="hmm-overview_e_99"><g><path d="M 1174.6 350 L 1182.1 350 Q 1189.6 350 1189.6 360 L 1189.6 525 Q 1189.6 535 1187.22 535 L 1184.84 535" fill="none" stroke="#2f6f8f" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/><path d="M 1176.84 535 L 1184.84 531 L 1184.84 539 Z" fill="#2f6f8f" stroke="#2f6f8f" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(47, 111, 143), rgb(106, 161, 189)); stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 443px; margin-left: 1190px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">Java Tool</div></div></div></foreignObject><text x="1190" y="446" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">Java Tool</text></switch></g></g></g><g data-cell-id="hmm-overview_e_100"><g><path d="M 1059.6 575 L 1059.6 579.76" fill="none" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/><path d="M 1059.6 587.76 L 1055.6 579.76 L 1063.6 579.76 Z" fill="#c74634" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 583px; margin-left: 1060px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">동일 CB_ORDS session</div></div></div></foreignObject><text x="1060" y="586" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">동일 CB_ORDS session</text></switch></g></g></g><g data-cell-id="hmm-overview_e_101"><g><path d="M 1059.6 682 L 1059.6 687.76" fill="none" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/><path d="M 1059.6 695.76 L 1055.6 687.76 L 1063.6 687.76 Z" fill="#c74634" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 690px; margin-left: 1060px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">predicate 자동 적용</div></div></div></foreignObject><text x="1060" y="693" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">predicate 자동 적용</text></switch></g></g></g><g data-cell-id="hmm-overview_e_102"><g><path d="M 644.6 865 L 784.6 865 Q 794.6 865 794.6 855 L 794.6 826 Q 794.6 816 804.6 816 L 934.36 816" fill="none" stroke="#ae562c" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke" style="stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/><path d="M 942.36 816 L 934.36 820 L 934.36 812 Z" fill="#ae562c" stroke="#ae562c" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(174, 86, 44), rgb(211, 136, 100)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 840px; margin-left: 795px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">PDF ingest · 청킹</div></div></div></foreignObject><text x="795" y="843" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">PDF ingest · 청킹</text></switch></g></g></g><g data-cell-id="hmm-overview_e_103"><g><path d="M 519.6 662 L 519.6 598.5 Q 519.6 588.5 509.6 588.5 L 474.6 588.5 Q 464.6 588.5 464.6 578.5 L 464.6 525.24" fill="none" stroke="#9e9892" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke" style="stroke: light-dark(rgb(158, 152, 146), rgb(110, 105, 99));"/><path d="M 464.6 517.24 L 468.6 525.24 L 460.6 525.24 Z" fill="#9e9892" stroke="#9e9892" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(158, 152, 146), rgb(110, 105, 99)); stroke: light-dark(rgb(158, 152, 146), rgb(110, 105, 99));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 589px; margin-left: 492px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">runtime secret</div></div></div></foreignObject><text x="492" y="592" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">runtime secret</text></switch></g></g></g><g data-cell-id="hmm-overview_e_104"><g><path d="M 1194.6 433.2 L 1227.1 433.24 Q 1237.1 433.25 1237.1 423.25 L 1237.1 410.5 Q 1237.1 400.5 1247.1 400.5 L 1269.36 400.5" fill="none" stroke="#ae562c" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke" style="stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/><path d="M 1277.36 400.5 L 1269.36 404.5 L 1269.36 396.5 Z" fill="#ae562c" stroke="#ae562c" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(174, 86, 44), rgb(211, 136, 100)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 417px; margin-left: 1237px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">모델 호출</div></div></div></foreignObject><text x="1237" y="420" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">모델 호출</text></switch></g></g></g><g data-cell-id="hmm-overview_e_105"><g><path d="M 1174.6 888 L 1372.1 888 Q 1382.1 888 1382.1 878 L 1382.1 650 Q 1382.1 640 1392.1 640 L 1579.36 640" fill="none" stroke="#6b7280" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(107, 114, 128), rgb(134, 140, 152));"/><path d="M 1587.36 640 L 1579.36 644 L 1579.36 636 Z" fill="#6b7280" stroke="#6b7280" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(107, 114, 128), rgb(134, 140, 152)); stroke: light-dark(rgb(107, 114, 128), rgb(134, 140, 152));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 764px; margin-left: 1382px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">HMM_RDS_PG_LINK · TLS 5432</div></div></div></foreignObject><text x="1382" y="768" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">HMM_RDS_PG_LINK · TLS 5432</text></switch></g></g></g><g data-cell-id="hmm-overview_v_106"><g transform="translate(0.5,0.5)"><rect x="1564.6" y="850" width="215" height="105" rx="8.4" ry="8.4" fill="#f9fafb" stroke="#6b7280" pointer-events="all" style="fill: light-dark(rgb(249, 250, 251), rgb(21, 22, 23)); stroke: light-dark(rgb(107, 114, 128), rgb(134, 140, 152));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 205px; height: 1px; padding-top: 903px; margin-left: 1570px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>읽기 책임 분리</b><br />RDS: 선사 실적 원장<br />ADB: 직원·배정·권한·VPD<br />MCP: 허용된 View만 자연어 조회</div></div></div></foreignObject><text x="1672" y="885" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1672" y="885">읽기 책임 분리</tspan><tspan x="1672" y="899">RDS: 선사 실적 원장</tspan><tspan x="1672" y="913">ADB: 직원·배정·권한·VPD</tspan><tspan x="1672" y="927">MCP: 허용된 View만 자연어 조회</tspan></text></switch></g></g></g><g data-cell-id="hmm-overview_v_107"><g><rect x="299.6" y="1005" width="1195" height="24" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1193px; height: 1px; padding-top: 1017px; margin-left: 302px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #5B5652; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#5B5652, #a6a29e); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">※ hmm-mcp.cloud-handson.com은 공용 호환 게이트웨이입니다. 사용자별 VPD MCP의 기준 주소는 hmm-backoffice.cloud-handson.com/mcp입니다.</div></div></div></foreignObject><text x="302" y="1020" fill="#5B5652" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(91, 86, 82), rgb(166, 162, 158));">※ hmm-mcp.cloud-handson.com은 공용 호환 게이트웨이입니다. 사용자별 VPD MCP의 기준 주소는 hmm-backoffice.cloud-handson.com/mcp입니다.</text></switch></g></g></g></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file diff --git a/docs/architecture/hmm-ai-data-access-architecture-security-flow.png b/docs/architecture/hmm-ai-data-access-architecture-security-flow.png new file mode 100644 index 0000000..ed22042 Binary files /dev/null and b/docs/architecture/hmm-ai-data-access-architecture-security-flow.png differ diff --git a/docs/architecture/hmm-ai-data-access-architecture-security-flow.svg b/docs/architecture/hmm-ai-data-access-architecture-security-flow.svg new file mode 100644 index 0000000..3817318 --- /dev/null +++ b/docs/architecture/hmm-ai-data-access-architecture-security-flow.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" style="background: #FFFFFF; background-color: light-dark(#FFFFFF, #121212); color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1840px" height="1090px" viewBox="0 0 1840 1090"><defs/><rect fill="#FFFFFF" width="100%" height="100%" x="0" y="0" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="hmm-security-flow_background"><g><rect x="19.7" y="19.45" width="1800" height="1050" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-security-flow_v_1"><g><rect x="55.7" y="41.45" width="1728" height="38" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1726px; height: 1px; padding-top: 60px; margin-left: 58px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 25px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">MCP Tool Discovery와 사용자별 VPD 실행 흐름</div></div></div></foreignObject><text x="58" y="68" fill="#312D2A" font-family="'Oracle Sans'" font-size="25px" font-weight="bold" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">MCP Tool Discovery와 사용자별 VPD 실행 흐름</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_2"><g><rect x="57.7" y="79.45" width="1724" height="28" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1722px; height: 1px; padding-top: 93px; margin-left: 60px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #5B5652; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#5B5652, #a6a29e); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">광고 계약 검증은 시작 시 1회 · 사용자 인증과 Context 설정·SQL 실행·정리는 요청마다 같은 세션에서 수행</div></div></div></foreignObject><text x="60" y="97" fill="#5B5652" font-family="'Oracle Sans'" font-size="12px" style="fill: light-dark(rgb(91, 86, 82), rgb(166, 162, 158));">광고 계약 검증은 시작 시 1회 · 사용자 인증과 Context 설정·SQL 실행·정리는 요청마다 같은 세션에서 수행</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_3"><g transform="translate(0.5,0.5)"><rect x="55.7" y="111.45" width="1728" height="3" rx="0.24" ry="0.24" fill="#c74634" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g></g><g data-cell-id="hmm-security-flow_v_4"><g transform="translate(0.5,0.5)"><rect x="54.7" y="139.45" width="1730" height="185" rx="12.95" ry="12.95" fill="#fff7f2" stroke="#ae562c" pointer-events="all" style="fill: light-dark(rgb(255, 247, 242), rgb(30, 23, 19)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g></g><g data-cell-id="hmm-security-flow_v_5"><g><rect x="68.7" y="147.45" width="1702" height="26" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1700px; height: 1px; padding-top: 160px; margin-left: 71px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #AE562C; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#AE562C, #d38864); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>서버 시작 · Tool 광고 전 Fail-Closed Gate</b></div></div></div></foreignObject><text x="71" y="164" fill="#AE562C" font-family="'Oracle Sans'" font-size="13px" style="fill: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));">서버 시작 · Tool 광고 전 Fail-Closed Gate</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_6"><g transform="translate(0.5,0.5)"><rect x="114.7" y="204.45" width="300" height="78" rx="6.24" ry="6.24" fill="#ffffff" stroke="#ae562c" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 252px; height: 1px; padding-top: 243px; margin-left: 147px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>BACKOFFICE_MCP_TOOLS</b><br />공개 이름 · 설명 · 입력 schema<br />AGENT_TOOL targetName</div></div></div></foreignObject><text x="147" y="234" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="147" y="234">BACKOFFICE_MCP_TOOLS</tspan><tspan x="147" y="247">공개 이름 · 설명 · 입력 schema</tspan><tspan x="147" y="260">AGENT_TOOL targetName</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_7"><g transform="translate(0.5,0.5)"><ellipse cx="117.7" cy="229.45" rx="15" ry="15" fill="#ae562c" stroke="#ae562c" pointer-events="all" style="fill: light-dark(rgb(174, 86, 44), rgb(211, 136, 100)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 229px; margin-left: 104px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">A</span></b></div></div></div></foreignObject><text x="118" y="233" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">A</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_8"><g transform="translate(0.5,0.5)"><rect x="529.7" y="204.45" width="330" height="78" rx="6.24" ry="6.24" fill="#ffffff" stroke="#ae562c" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 282px; height: 1px; padding-top: 243px; margin-left: 562px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>McpAgentToolStartupValidator</b><br />AGENT_TOOL targetName 중복 제거<br />SELECT_AI는 DB Tool 검증에서 제외</div></div></div></foreignObject><text x="562" y="234" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="562" y="234">McpAgentToolStartupValidator</tspan><tspan x="562" y="247">AGENT_TOOL targetName 중복 제거</tspan><tspan x="562" y="260">SELECT_AI는 DB Tool 검증에서 제외</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_9"><g transform="translate(0.5,0.5)"><ellipse cx="532.7" cy="229.45" rx="15" ry="15" fill="#ae562c" stroke="#ae562c" pointer-events="all" style="fill: light-dark(rgb(174, 86, 44), rgb(211, 136, 100)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 229px; margin-left: 519px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">B</span></b></div></div></div></foreignObject><text x="533" y="233" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">B</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_10"><g transform="translate(0.5,0.5)"><rect x="974.7" y="204.45" width="330" height="78" rx="6.24" ry="6.24" fill="#ffffff" stroke="#ae562c" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 282px; height: 1px; padding-top: 243px; margin-left: 1007px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>USER_AI_AGENT_TOOLS</b><br />Tool 존재 + STATUS=ENABLED 확인</div></div></div></foreignObject><text x="1007" y="240" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1007" y="240">USER_AI_AGENT_TOOLS</tspan><tspan x="1007" y="253">Tool 존재 + STATUS=ENABLED 확인</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_11"><g transform="translate(0.5,0.5)"><ellipse cx="977.7" cy="229.45" rx="15" ry="15" fill="#ae562c" stroke="#ae562c" pointer-events="all" style="fill: light-dark(rgb(174, 86, 44), rgb(211, 136, 100)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 229px; margin-left: 964px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">C</span></b></div></div></div></foreignObject><text x="978" y="233" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">C</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_12"><g transform="translate(0.5,0.5)"><rect x="1419.7" y="204.45" width="285" height="78" rx="6.24" ry="6.24" fill="#ffffff" stroke="#2f6b4f" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 237px; height: 1px; padding-top: 243px; margin-left: 1452px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Endpoint Ready</b><br />모두 정상일 때만 tools/list 광고<br /><span style="color: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));">누락·비활성·조회 오류는 기동 실패</span></div></div></div></foreignObject><text x="1452" y="234" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1452" y="234">Endpoint Ready</tspan><tspan x="1452" y="247">모두 정상일 때만 tools/list 광고</tspan><tspan x="1452" y="260">누락·비활성·조회 오류는 기동 실패</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_13"><g transform="translate(0.5,0.5)"><ellipse cx="1422.7" cy="229.45" rx="15" ry="15" fill="#2f6b4f" stroke="#2f6b4f" pointer-events="all" style="fill: light-dark(rgb(47, 107, 79), rgb(119, 171, 147)); stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 229px; margin-left: 1409px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">D</span></b></div></div></div></foreignObject><text x="1423" y="233" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">D</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_14"><g><path d="M 414.7 243.45 L 519.46 243.45" fill="none" stroke="#ae562c" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/><path d="M 527.46 243.45 L 519.46 247.45 L 519.46 239.45 Z" fill="#ae562c" stroke="#ae562c" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(174, 86, 44), rgb(211, 136, 100)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 243px; margin-left: 472px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">구성 로드</div></div></div></foreignObject><text x="472" y="247" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">구성 로드</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_15"><g><path d="M 859.7 243.45 L 964.46 243.45" fill="none" stroke="#ae562c" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/><path d="M 972.46 243.45 L 964.46 247.45 L 964.46 239.45 Z" fill="#ae562c" stroke="#ae562c" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(174, 86, 44), rgb(211, 136, 100)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 243px; margin-left: 917px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">시작 시 1회 조회</div></div></div></foreignObject><text x="917" y="247" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">시작 시 1회 조회</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_16"><g><path d="M 1304.7 243.45 L 1409.46 243.45" fill="none" stroke="#2f6b4f" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/><path d="M 1417.46 243.45 L 1409.46 247.45 L 1409.46 239.45 Z" fill="#2f6b4f" stroke="#2f6b4f" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(47, 107, 79), rgb(119, 171, 147)); stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 243px; margin-left: 1362px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">모두 ENABLED</div></div></div></foreignObject><text x="1362" y="247" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">모두 ENABLED</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_17"><g transform="translate(0.5,0.5)"><rect x="54.7" y="349.45" width="225" height="665" rx="15.75" ry="15.75" fill="#f9fafb" stroke="#9e9892" pointer-events="all" style="fill: light-dark(rgb(249, 250, 251), rgb(21, 22, 23)); stroke: light-dark(rgb(158, 152, 146), rgb(110, 105, 99));"/></g></g><g data-cell-id="hmm-security-flow_v_18"><g><rect x="68.7" y="357.45" width="197" height="26" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 195px; height: 1px; padding-top: 370px; margin-left: 71px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>MCP Client</b></div></div></div></foreignObject><text x="71" y="374" fill="#312D2A" font-family="'Oracle Sans'" font-size="13px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">MCP Client</text></switch></g></g></g><g data-cell-id="hmm-security-flow_oci_19"><g/><g data-cell-id="hmm-security-flow_ociPart_20"><g><rect x="114.7" y="404.45" width="76" height="84" fill="none" stroke="none" pointer-events="all"/></g><g data-cell-id="hmm-security-flow_ociPart_21"><g><path d="M 115.72 487.45 L 115.72 473.45 C 115.7 468.89 117.38 464.48 120.44 461.07 C 123.49 457.67 127.72 455.51 132.28 455.01 C 130.49 453.31 128.95 451.35 127.75 449.19 L 127.23 448.27 L 135.29 415.09 C 136.21 412.29 138 409.85 140.4 408.12 C 142.81 406.39 145.69 405.46 148.66 405.45 L 156.72 405.45 C 159.66 405.5 162.52 406.44 164.9 408.16 C 167.28 409.89 169.05 412.31 170 415.07 L 170.26 416.01 L 178.18 448.23 L 177.65 449.15 C 176.46 451.31 174.94 453.29 173.14 454.99 C 177.7 455.49 181.92 457.65 184.97 461.05 C 188.02 464.46 189.7 468.85 189.69 473.41 L 189.69 487.41 L 115.72 487.45 L 115.72 487.45" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-security-flow_ociPart_22"><g><path d="M 156.74 406.45 C 159.62 406.5 162.42 407.48 164.69 409.25 C 166.96 411.03 168.58 413.49 169.31 416.27 L 177.1 448.07 L 176.75 448.67 C 175.22 451.5 173.06 453.93 170.44 455.81 L 170.58 455.81 C 172.94 455.75 175.29 456.16 177.48 457.02 C 179.68 457.87 181.68 459.16 183.37 460.81 C 185.05 462.44 186.39 464.4 187.31 466.56 C 188.22 468.73 188.69 471.05 188.69 473.39 L 188.69 486.45 L 116.74 486.45 L 116.74 473.39 C 116.74 471.05 117.21 468.73 118.12 466.56 C 119.03 464.4 120.37 462.44 122.06 460.81 C 123.75 459.16 125.75 457.87 127.95 457.02 C 130.14 456.16 132.49 455.75 134.85 455.81 L 135.03 455.81 C 132.41 453.93 130.24 451.5 128.71 448.67 L 128.36 448.07 L 136.06 416.25 C 136.78 413.47 138.4 411.01 140.68 409.24 C 142.95 407.47 145.75 406.49 148.63 406.45 L 156.67 406.45 L 156.74 406.45 L 156.74 406.45 M 156.67 404.45 L 148.63 404.45 C 145.65 404.5 142.76 405.42 140.3 407.1 C 137.86 408.78 135.96 411.14 134.85 413.89 L 134.67 413.89 L 134.16 415.89 L 126.34 447.61 L 126.14 448.37 L 126.54 449.07 L 126.8 449.65 C 127.73 451.32 128.84 452.88 130.12 454.31 C 125.74 455.25 121.82 457.66 119.02 461.13 C 116.21 464.61 114.7 468.94 114.73 473.39 L 114.73 488.45 L 190.68 488.45 L 190.68 473.39 C 190.7 468.93 189.17 464.59 186.36 461.12 C 183.55 457.65 179.61 455.24 175.23 454.31 C 176.5 452.88 177.62 451.31 178.57 449.65 L 178.91 449.07 L 179.31 448.37 L 179.11 447.59 L 171.3 415.79 L 170.82 413.79 L 170.62 413.79 C 169.48 411.05 167.56 408.71 165.09 407.05 C 162.62 405.39 159.71 404.48 156.74 404.45 L 156.67 404.45 L 156.67 404.45" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-security-flow_ociPart_23"><g><path d="M 170.69 455.81 L 170.54 455.81 C 173.17 453.94 175.33 451.5 176.87 448.67 L 177.21 448.07 L 169.4 416.25 C 168.66 413.47 167.03 411 164.75 409.23 C 162.46 407.47 159.66 406.49 156.76 406.45 L 148.7 406.45 C 145.82 406.5 143.02 407.48 140.76 409.26 C 138.49 411.03 136.87 413.5 136.15 416.27 L 128.27 448.07 L 128.62 448.67 C 130.15 451.5 132.32 453.94 134.94 455.81 L 134.84 455.81 C 132.48 455.75 130.13 456.16 127.92 457.02 C 125.72 457.88 123.72 459.17 122.03 460.81 C 120.34 462.45 119 464.41 118.08 466.58 C 117.17 468.74 116.7 471.07 116.71 473.41 L 116.71 486.45 L 120.13 486.45 L 120.13 473.41 C 120.13 471.51 120.52 469.63 121.26 467.88 C 122.01 466.14 123.1 464.55 124.47 463.23 C 125.84 461.91 127.46 460.87 129.24 460.18 C 131.03 459.49 132.93 459.16 134.84 459.21 L 142.9 459.21 C 143.22 461.57 144.4 463.74 146.21 465.31 C 148.02 466.87 150.34 467.74 152.74 467.74 C 155.15 467.74 157.47 466.87 159.27 465.31 C 161.09 463.74 162.26 461.57 162.59 459.21 L 170.64 459.21 C 172.55 459.17 174.44 459.51 176.22 460.2 C 177.99 460.9 179.6 461.94 180.96 463.26 C 182.33 464.59 183.41 466.16 184.15 467.91 C 184.88 469.65 185.27 471.52 185.27 473.41 L 185.27 486.45 L 188.7 486.45 L 188.7 473.41 C 188.7 471.07 188.23 468.74 187.32 466.58 C 186.4 464.42 185.06 462.46 183.36 460.82 C 181.68 459.18 179.68 457.89 177.48 457.03 C 175.28 456.17 172.92 455.75 170.56 455.81 L 170.69 455.81 L 170.69 455.81 M 139.01 430.31 L 139.01 424.45 C 139.86 424.65 140.72 424.78 141.59 424.83 C 145.62 425.04 149.6 423.75 152.71 421.19 C 155.6 423.53 159.2 424.82 162.92 424.85 L 163.85 424.85 C 164.72 424.79 165.59 424.66 166.43 424.45 L 166.43 430.29 C 166.49 432.13 166.19 433.97 165.52 435.7 C 164.87 437.42 163.87 439 162.59 440.34 C 161.32 441.68 159.79 442.76 158.09 443.51 C 156.4 444.27 154.57 444.68 152.71 444.73 C 150.86 444.68 149.03 444.27 147.34 443.51 C 145.64 442.75 144.11 441.67 142.84 440.34 C 141.57 438.99 140.58 437.42 139.92 435.69 C 139.26 433.97 138.96 432.13 139.01 430.29 L 139.01 430.31 L 139.01 430.31 M 162.59 455.37 L 162.59 444.87 C 164.61 443.37 166.29 441.46 167.53 439.27 C 168.77 437.09 169.53 434.67 169.78 432.17 L 173.54 447.55 C 172.4 449.57 170.82 451.31 168.93 452.67 C 167.04 454.02 164.88 454.95 162.59 455.39 L 162.59 455.37 L 162.59 455.37 M 148.64 409.85 L 156.7 409.85 C 159.34 409.95 161.83 411.08 163.64 412.99 C 165.44 414.9 166.43 417.43 166.37 420.05 L 166.37 420.97 C 164.18 421.59 161.85 421.63 159.65 421.05 C 157.44 420.48 155.42 419.32 153.82 417.71 L 152.65 416.67 L 151.5 417.71 C 149.9 419.32 147.89 420.48 145.68 421.06 C 143.47 421.63 141.14 421.6 138.95 420.97 L 138.95 420.05 C 138.9 417.43 139.87 414.91 141.67 413 C 143.47 411.1 145.95 409.96 148.58 409.85 L 148.64 409.85 L 148.64 409.85 M 131.92 447.55 L 135.66 432.23 C 135.92 434.72 136.69 437.13 137.94 439.31 C 139.19 441.48 140.87 443.38 142.9 444.87 L 142.9 455.39 C 140.61 454.95 138.45 454.02 136.56 452.66 C 134.67 451.31 133.1 449.56 131.96 447.55 L 131.92 447.55 L 131.92 447.55 M 152.75 464.29 C 151.13 464.29 149.58 463.69 148.37 462.61 C 147.18 461.53 146.42 460.05 146.26 458.45 L 146.26 446.83 C 148.3 447.7 150.5 448.15 152.72 448.15 C 154.94 448.15 157.14 447.7 159.18 446.83 L 159.18 458.45 C 159.02 460.05 158.28 461.54 157.08 462.63 C 155.89 463.71 154.33 464.31 152.71 464.33" fill="#2c5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(44, 89, 103), rgb(137, 175, 187));"/></g></g></g></g><g data-cell-id="hmm-security-flow_v_24"><g transform="translate(0.5,0.5)"><rect x="89.7" y="519.45" width="160" height="100" rx="8" ry="8" fill="#ffffff" stroke="#2f6f8f" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 112px; height: 1px; padding-top: 569px; margin-left: 122px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Agent 요청</b><br />initialize<br />tools/list<br />tools/call</div></div></div></foreignObject><text x="122" y="553" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="122" y="553">Agent 요청</tspan><tspan x="122" y="566">initialize</tspan><tspan x="122" y="579">tools/list</tspan><tspan x="122" y="592">tools/call</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_25"><g transform="translate(0.5,0.5)"><ellipse cx="92.7" cy="544.45" rx="15" ry="15" fill="#2f6f8f" stroke="#2f6f8f" pointer-events="all" style="fill: light-dark(rgb(47, 111, 143), rgb(106, 161, 189)); stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 544px; margin-left: 79px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">1</span></b></div></div></div></foreignObject><text x="93" y="548" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">1</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_26"><g transform="translate(0.5,0.5)"><rect x="89.7" y="819.45" width="160" height="115" rx="9.2" ry="9.2" fill="#ffffff" stroke="#2f6b4f" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 112px; height: 1px; padding-top: 877px; margin-left: 122px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>필터링 결과</b><br />허용 행 + 근거만 반환<br />Token·내부 SQL은 미노출</div></div></div></foreignObject><text x="122" y="861" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="122" y="861">필터링 결과</tspan><tspan x="122" y="874">허용 행 + 근거만 반환</tspan><tspan x="122" y="887">Token·내부 SQL은</tspan><tspan x="122" y="900">미노출</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_27"><g transform="translate(0.5,0.5)"><ellipse cx="92.7" cy="844.45" rx="15" ry="15" fill="#2f6b4f" stroke="#2f6b4f" pointer-events="all" style="fill: light-dark(rgb(47, 107, 79), rgb(119, 171, 147)); stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 844px; margin-left: 79px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">10</span></b></div></div></div></foreignObject><text x="93" y="848" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">10</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_28"><g transform="translate(0.5,0.5)"><rect x="304.7" y="349.45" width="650" height="665" rx="45.5" ry="45.5" fill="#fcfbfa" stroke="#9e9892" pointer-events="all" style="fill: light-dark(rgb(252, 251, 250), rgb(22, 21, 20)); stroke: light-dark(rgb(158, 152, 146), rgb(110, 105, 99));"/></g></g><g data-cell-id="hmm-security-flow_v_29"><g><rect x="318.7" y="357.45" width="622" height="26" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 620px; height: 1px; padding-top: 370px; margin-left: 321px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>VPD Backoffice · Spring Boot</b></div></div></div></foreignObject><text x="321" y="374" fill="#312D2A" font-family="'Oracle Sans'" font-size="13px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">VPD Backoffice · Spring Boot</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_30"><g transform="translate(0.5,0.5)"><rect x="349.7" y="419.45" width="250" height="110" rx="8.8" ry="8.8" fill="#ffffff" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 202px; height: 1px; padding-top: 474px; margin-left: 382px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Bearer 인증</b><br />Token SHA-256 hash<br />만료·회수·재직 상태 검증<br /><span style="color: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));">실패: HTTP 401</span></div></div></div></foreignObject><text x="382" y="458" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="382" y="458">Bearer 인증</tspan><tspan x="382" y="471">Token SHA-256 hash</tspan><tspan x="382" y="484">만료·회수·재직 상태 검증</tspan><tspan x="382" y="497">실패: HTTP 401</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_31"><g transform="translate(0.5,0.5)"><ellipse cx="352.7" cy="444.45" rx="15" ry="15" fill="#c74634" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 444px; margin-left: 339px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">2</span></b></div></div></div></foreignObject><text x="353" y="448" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">2</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_32"><g transform="translate(0.5,0.5)"><rect x="669.7" y="419.45" width="235" height="110" rx="8.8" ry="8.8" fill="#ffffff" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 187px; height: 1px; padding-top: 474px; margin-left: 702px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>MCP Tool Router</b><br />catalog에서 이름·인자 검증<br />AGENT_TOOL / SELECT_AI 분기</div></div></div></foreignObject><text x="702" y="465" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="702" y="465">MCP Tool Router</tspan><tspan x="702" y="478">catalog에서 이름·인자 검증</tspan><tspan x="702" y="491">AGENT_TOOL / SELECT_AI 분기</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_33"><g transform="translate(0.5,0.5)"><ellipse cx="672.7" cy="444.45" rx="15" ry="15" fill="#c74634" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 444px; margin-left: 659px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">3</span></b></div></div></div></foreignObject><text x="673" y="448" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">3</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_34"><g transform="translate(0.5,0.5)"><rect x="369.7" y="609.45" width="250" height="130" rx="10.4" ry="10.4" fill="#ffffff" stroke="#ae562c" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 202px; height: 1px; padding-top: 674px; margin-left: 402px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 10px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>ADB AGENT_TOOL</b><br />resolve_hr_term · search_hr_policy<br />동일 기본 JDBC session<br />SET_USER_BY_BEARER<br />→ RUN_TOOL → CLEAR_USER</div></div></div></foreignObject><text x="402" y="653" fill="#312D2A" font-family="'Oracle Sans'" font-size="10px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="402" y="653">ADB AGENT_TOOL</tspan><tspan x="402" y="665">resolve_hr_term · search_hr_policy</tspan><tspan x="402" y="677">동일 기본 JDBC session</tspan><tspan x="402" y="689">SET_USER_BY_BEARER</tspan><tspan x="402" y="701">→ RUN_TOOL → CLEAR_USER</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_35"><g transform="translate(0.5,0.5)"><ellipse cx="372.7" cy="634.45" rx="15" ry="15" fill="#ae562c" stroke="#ae562c" pointer-events="all" style="fill: light-dark(rgb(174, 86, 44), rgb(211, 136, 100)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 634px; margin-left: 359px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">4</span></b></div></div></div></foreignObject><text x="373" y="638" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">4</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_36"><g transform="translate(0.5,0.5)"><rect x="669.7" y="609.45" width="235" height="125" rx="10" ry="10" fill="#ffffff" stroke="#2f6f8f" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 187px; height: 1px; padding-top: 672px; margin-left: 702px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>search_hr_data</b><br />ADMIN 생성 세션<br />DBMS_CLOUD_AI.GENERATE<br />action=showsql<br />SELECT/WITH + 승인 객체 검증</div></div></div></foreignObject><text x="702" y="649" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="702" y="649">search_hr_data</tspan><tspan x="702" y="662">ADMIN 생성 세션</tspan><tspan x="702" y="675">DBMS_CLOUD_AI.GENERATE</tspan><tspan x="702" y="688">action=showsql</tspan><tspan x="702" y="701">SELECT/WITH + 승인 객체 검증</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_37"><g transform="translate(0.5,0.5)"><ellipse cx="672.7" cy="634.45" rx="15" ry="15" fill="#2f6f8f" stroke="#2f6f8f" pointer-events="all" style="fill: light-dark(rgb(47, 111, 143), rgb(106, 161, 189)); stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 634px; margin-left: 659px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">5</span></b></div></div></div></foreignObject><text x="673" y="638" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">5</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_38"><g><path d="M 249.7 569.45 L 289.7 569.45 Q 299.7 569.45 299.7 559.45 L 299.7 484.51 Q 299.7 474.51 309.7 474.51 L 339.46 474.51" fill="none" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/><path d="M 347.46 474.51 L 339.46 478.51 L 339.46 470.51 Z" fill="#c74634" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 522px; margin-left: 300px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">Authorization: Bearer …</div></div></div></foreignObject><text x="300" y="525" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">Authorization: Bearer …</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_39"><g><path d="M 599.7 474.45 L 659.46 474.45" fill="none" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/><path d="M 667.46 474.45 L 659.46 478.45 L 659.46 470.45 Z" fill="#c74634" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 474px; margin-left: 635px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">인증된 employee</div></div></div></foreignObject><text x="635" y="478" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">인증된 employee</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_40"><g><path d="M 728.45 529.45 L 728.51 559.45 Q 728.52 569.45 718.52 569.45 L 504.76 569.45 Q 494.76 569.45 494.74 579.45 L 494.72 599.21" fill="none" stroke="#ae562c" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/><path d="M 494.7 607.21 L 490.72 599.21 L 498.72 599.22 Z" fill="#ae562c" stroke="#ae562c" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(174, 86, 44), rgb(211, 136, 100)); stroke: light-dark(rgb(174, 86, 44), rgb(211, 136, 100));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 569px; margin-left: 612px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">AGENT_TOOL</div></div></div></foreignObject><text x="612" y="573" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">AGENT_TOOL</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_41"><g><path d="M 845.95 529.45 L 846.03 559.45 Q 846.05 569.45 836.05 569.45 L 797.23 569.45 Q 787.23 569.45 787.22 579.45 L 787.21 599.21" fill="none" stroke="#2f6f8f" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/><path d="M 787.2 607.21 L 783.21 599.21 L 791.21 599.22 Z" fill="#2f6f8f" stroke="#2f6f8f" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(47, 111, 143), rgb(106, 161, 189)); stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 569px; margin-left: 817px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">SELECT_AI</div></div></div></foreignObject><text x="817" y="573" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">SELECT_AI</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_42"><g transform="translate(0.5,0.5)"><rect x="979.7" y="349.45" width="805" height="665" rx="46.55" ry="46.55" fill="#f5f4f2" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(245, 244, 242), rgb(28, 27, 25)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g></g><g data-cell-id="hmm-security-flow_v_43"><g><rect x="993.7" y="357.45" width="777" height="26" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 775px; height: 1px; padding-top: 370px; margin-left: 996px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Autonomous Database · 보안 실행 경계</b></div></div></div></foreignObject><text x="996" y="374" fill="#312D2A" font-family="'Oracle Sans'" font-size="13px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">Autonomous Database · 보안 실행 경계</text></switch></g></g></g><g data-cell-id="hmm-security-flow_oci_44"><g/><g data-cell-id="hmm-security-flow_ociPart_45"><g><rect x="1024.7" y="389.45" width="84" height="73" fill="none" stroke="none" pointer-events="all"/></g><g data-cell-id="hmm-security-flow_ociPart_46"><g><path d="M 1062.92 460.45 C 1057.53 460.45 1052.33 459.93 1048.5 459.07 C 1043.46 457.85 1040.85 455.95 1040.85 453.35 L 1040.85 428.24 L 1024.7 428.24 L 1024.87 425.65 C 1025.4 419.23 1029.05 413.7 1034.78 410.75 C 1035.99 410.05 1036.86 409.02 1037.21 407.63 C 1038.07 403.13 1041.21 399.32 1045.37 397.59 C 1047.11 396.9 1049.02 396.38 1051.1 396.38 C 1051.46 396.38 1051.97 396.38 1052.5 396.38 C 1052.67 396.38 1052.84 396.38 1053.01 396.38 C 1054.24 396.38 1055.45 395.85 1056.15 394.99 C 1059.1 391.7 1063.09 389.8 1067.44 389.45 L 1069.18 389.45 C 1075.61 389.62 1081.34 393.26 1084.12 398.97 C 1084.29 399.32 1084.63 399.84 1084.99 400.19 C 1085.33 400.7 1086.03 401.57 1086.37 402.27 C 1091.59 402.44 1096.28 405.2 1099.06 409.54 L 1099.06 409.71 L 1099.57 412.31 L 1106.7 419.4 L 1103.22 422.87 L 1100.97 420.62 C 1099.57 427.9 1093.15 433.26 1085.5 433.26 C 1085.33 433.26 1084.99 433.26 1084.81 433.26 L 1084.81 453.18 C 1084.81 455.77 1082.38 457.68 1077.16 458.89 C 1073.51 459.93 1068.31 460.45 1062.92 460.45 L 1062.92 460.45" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-security-flow_ociPart_47"><g><path d="M 1069.3 391.19 C 1075.55 391.19 1081.11 394.66 1083.89 400.22 C 1084.23 400.75 1084.41 401.27 1084.92 401.62 C 1085.27 402.14 1085.96 403.18 1086.48 403.87 C 1091.69 403.87 1096.38 406.66 1098.98 410.83 L 1099.68 413.61 L 1106.44 420.39 L 1104.19 422.65 L 1101.24 419.69 C 1100.72 427.34 1094.29 433.43 1086.48 433.43 C 1085.96 433.43 1085.44 433.43 1084.92 433.25 L 1084.92 454.28 C 1084.92 456.37 1082.67 458.11 1077.98 459.15 C 1074.16 460.02 1069.13 460.54 1063.75 460.54 C 1058.37 460.54 1053.34 460.02 1049.52 459.15 C 1044.83 458.11 1042.58 456.37 1042.58 454.28 L 1042.58 428.21 L 1026.61 428.21 L 1026.78 426.47 C 1027.3 420.39 1030.77 415 1036.16 412.22 C 1037.54 411.7 1038.59 410.31 1038.93 408.74 C 1039.8 404.57 1042.58 400.92 1046.57 399.18 C 1048.3 398.49 1050.04 398.14 1051.95 398.14 C 1052.29 398.14 1052.81 398.14 1053.16 398.14 C 1053.34 398.14 1053.51 398.14 1053.68 398.14 C 1055.07 398.14 1056.46 397.62 1057.5 396.57 C 1060.45 393.28 1064.62 391.54 1068.96 391.36 L 1068.96 392.92 L 1068.96 391.36 C 1068.96 391.19 1069.13 391.19 1069.3 391.19 L 1069.3 391.19 M 1070.52 389.45 L 1068.78 389.45 L 1067.04 389.45 L 1067.04 389.63 C 1062.89 390.14 1058.89 392.06 1055.94 395.19 C 1055.42 396.06 1054.55 396.4 1053.51 396.4 C 1053.34 396.4 1053.34 396.4 1053.16 396.4 C 1052.65 396.4 1052.29 396.4 1051.77 396.4 C 1049.69 396.4 1047.61 396.93 1045.7 397.62 C 1041.19 399.53 1038.06 403.53 1037.02 408.39 C 1036.85 409.44 1036.16 410.48 1035.12 411 C 1029.21 414.13 1025.4 420.04 1024.88 426.64 L 1024.7 428.38 L 1024.7 430.12 L 1026.61 430.12 L 1040.84 430.12 L 1040.84 454.46 C 1040.84 458.98 1047.09 460.54 1049.17 461.06 C 1053.16 461.93 1058.37 462.45 1063.75 462.45 C 1069.3 462.45 1074.34 461.93 1078.33 461.06 C 1080.41 460.54 1086.66 459.15 1086.66 454.46 L 1086.66 435.34 C 1093.95 435.34 1100.37 430.29 1102.28 423.34 L 1102.8 423.86 L 1104.01 425.08 L 1105.23 423.86 L 1107.48 421.61 L 1108.7 420.39 L 1107.48 419.17 L 1101.06 412.74 L 1100.54 410.48 L 1100.54 410.13 L 1100.37 409.96 C 1097.6 405.44 1092.73 402.49 1087.36 402.14 C 1087 401.62 1086.48 400.92 1086.31 400.58 L 1086.31 400.4 L 1086.14 400.22 C 1085.96 400.22 1085.62 399.88 1085.44 399.53 C 1082.67 393.62 1076.94 389.97 1070.52 389.45 L 1070.52 389.45" fill="#ffffff" stroke="none" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));"/></g></g><g data-cell-id="hmm-security-flow_ociPart_48"><g><path d="M 1029.18 424.09 L 1039.27 424.09 L 1039.27 427.19 L 1025.7 427.19 L 1025.88 425.47 C 1026.4 419.43 1029.88 414.08 1035.27 411.32 C 1036.66 410.63 1037.7 409.25 1038.05 407.7 C 1038.92 403.56 1041.7 399.94 1045.7 398.21 C 1047.61 397.18 1049.88 396.83 1052.13 397.18 C 1053.88 397.35 1055.44 396.83 1056.48 395.63 C 1059.44 392.35 1063.61 390.62 1067.96 390.45 C 1068.13 390.45 1068.31 390.45 1068.31 390.45 C 1074.57 390.45 1080.13 393.9 1082.92 399.42 C 1083.27 399.94 1083.44 400.46 1083.96 400.8 C 1082.74 400.97 1081.52 401.14 1080.48 401.49 C 1080.31 401.32 1080.31 401.14 1080.13 400.8 C 1077.88 396.32 1073.35 393.56 1068.31 393.56 C 1068.13 393.56 1068.13 393.56 1067.96 393.56 C 1064.48 393.56 1061 395.11 1058.57 397.69 C 1056.83 399.59 1054.22 400.63 1051.61 400.28 C 1049.88 400.11 1048.31 400.46 1046.57 401.14 C 1043.61 402.53 1041.36 405.11 1040.83 408.39 C 1040.31 410.98 1038.74 413.05 1036.31 414.26 C 1032.66 416.15 1030.04 419.78 1029.18 424.09 L 1029.18 424.09 M 1084.13 409.25 L 1087.27 409.25 L 1091.61 424.61 L 1088.13 424.61 L 1087.61 421.33 L 1083.79 421.33 L 1082.92 424.61 L 1079.61 424.61 L 1084.13 409.25 L 1084.13 409.25 M 1084.31 418.74 L 1086.92 418.74 L 1085.52 413.05 L 1084.31 418.74 L 1084.31 418.74 M 1070.92 416.67 L 1067.96 413.74 L 1065.7 415.98 L 1072.48 422.71 L 1079.27 415.98 L 1077 413.74 L 1074.22 416.5 C 1074.74 410.63 1079.79 406.15 1085.7 406.15 C 1090.04 406.15 1093.88 408.56 1095.96 412.18 L 1098.22 409.94 C 1095.61 405.8 1090.92 403.04 1085.7 403.04 C 1077.88 403.04 1071.44 409.08 1070.92 416.67 L 1070.92 416.67 M 1105.7 419.26 L 1098.92 412.7 L 1092.13 419.43 L 1094.4 421.67 L 1097.18 418.91 C 1096.66 424.78 1091.61 429.26 1085.7 429.26 C 1081.36 429.26 1077.52 426.85 1075.44 423.23 L 1073.18 425.47 C 1075.79 429.61 1080.48 432.37 1085.7 432.37 C 1093.52 432.37 1099.96 426.33 1100.48 418.74 L 1103.44 421.67 L 1105.7 419.26 L 1105.7 419.26 M 1080.83 434.44 C 1081.88 434.78 1082.92 434.96 1083.96 435.13 L 1083.96 453.24 C 1083.96 455.31 1081.7 457.04 1077 458.07 C 1073.18 458.93 1068.13 459.45 1062.74 459.45 C 1057.36 459.45 1052.31 458.93 1048.48 458.07 C 1043.79 457.04 1041.52 455.31 1041.52 453.24 L 1041.52 419.26 C 1041.52 417.19 1043.79 415.63 1048.48 414.6 C 1052.13 413.74 1057.18 413.39 1062.74 413.39 C 1062.92 413.39 1063.27 413.39 1063.61 413.39 L 1063.61 416.5 C 1063.44 416.5 1063.09 416.5 1062.74 416.5 C 1051.27 416.5 1045.52 418.39 1044.83 419.43 L 1044.83 419.6 C 1045.52 420.81 1052.13 422.71 1062.74 422.71 C 1065 422.71 1066.92 422.71 1068.83 422.54 C 1069.18 423.57 1069.52 424.61 1070.05 425.64 C 1067.79 425.81 1065.36 425.99 1062.74 425.99 C 1057.36 425.99 1052.31 425.47 1048.48 424.61 C 1046.92 424.26 1045.7 423.91 1044.66 423.4 L 1044.66 430.82 C 1045.36 432.02 1051.96 433.92 1062.57 433.92 C 1068.48 433.92 1073.18 433.23 1076.31 432.54 C 1077.88 433.23 1079.27 433.92 1080.83 434.44 C 1079.79 434.96 1078.57 435.3 1077 435.64 C 1073.18 436.51 1068.13 437.03 1062.74 437.03 C 1057.36 437.03 1052.31 436.51 1048.48 435.64 C 1046.92 435.3 1045.7 434.96 1044.66 434.44 L 1044.66 441.86 C 1045.36 443.06 1051.96 444.96 1062.57 444.96 C 1073.18 444.96 1079.79 442.89 1080.48 441.86 L 1080.83 434.44 L 1080.83 434.44 M 1080.83 445.65 C 1079.79 446.17 1078.57 446.51 1077 446.86 C 1073.18 447.72 1068.13 448.24 1062.74 448.24 C 1057.36 448.24 1052.31 447.72 1048.48 446.86 C 1046.92 446.51 1045.7 446.17 1044.66 445.65 L 1044.66 453.07 C 1045.36 454.1 1051.27 456.17 1062.57 456.17 C 1073.88 456.17 1079.96 453.93 1080.48 453.07 L 1080.83 445.65 L 1080.83 445.65" fill="#2d5967" stroke="none" pointer-events="all" style="fill: light-dark(rgb(45, 89, 103), rgb(138, 175, 187));"/></g></g></g></g><g data-cell-id="hmm-security-flow_v_49"><g transform="translate(0.5,0.5)"><rect x="1119.7" y="409.45" width="285" height="110" rx="8.8" ry="8.8" fill="#ffffff" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 237px; height: 1px; padding-top: 464px; margin-left: 1152px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>CB_ORDS 동일 JDBC 세션</b><br />CB_ORDS_HANDLER_PKG<br />SET_VPD_CONTEXT<br />Runtime principal·context 일치 검증</div></div></div></foreignObject><text x="1152" y="448" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1152" y="448">CB_ORDS 동일 JDBC 세션</tspan><tspan x="1152" y="461">CB_ORDS_HANDLER_PKG</tspan><tspan x="1152" y="474">SET_VPD_CONTEXT</tspan><tspan x="1152" y="487">Runtime principal·context 일치 검증</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_50"><g transform="translate(0.5,0.5)"><ellipse cx="1122.7" cy="434.45" rx="15" ry="15" fill="#c74634" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 434px; margin-left: 1109px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">6</span></b></div></div></div></foreignObject><text x="1123" y="438" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">6</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_51"><g transform="translate(0.5,0.5)"><rect x="1464.7" y="409.45" width="270" height="110" rx="8.8" ry="8.8" fill="#ffffff" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 222px; height: 1px; padding-top: 464px; margin-left: 1497px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Secure Application Context</b><br />HMM_ACCESS_CTX_PKG<br />SET_USER_BY_BEARER<br />EMPLOYEE_ID · CODE · TEAM_ID</div></div></div></foreignObject><text x="1497" y="448" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1497" y="448">Secure Application Context</tspan><tspan x="1497" y="461">HMM_ACCESS_CTX_PKG</tspan><tspan x="1497" y="474">SET_USER_BY_BEARER</tspan><tspan x="1497" y="487">EMPLOYEE_ID · CODE · TEAM_ID</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_52"><g transform="translate(0.5,0.5)"><ellipse cx="1467.7" cy="434.45" rx="15" ry="15" fill="#c74634" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 434px; margin-left: 1454px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">7</span></b></div></div></div></foreignObject><text x="1468" y="438" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">7</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_53"><g transform="translate(0.5,0.5)"><rect x="1119.7" y="604.45" width="285" height="125" rx="10" ry="10" fill="#ffffff" stroke="#2f6f8f" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 237px; height: 1px; padding-top: 667px; margin-left: 1152px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>읽기 전용 SQL 실행</b><br />CB_ORDS · SET TRANSACTION READ ONLY<br />EXEMPT ACCESS POLICY 없음<br />승인된 HR Table/View만 조회</div></div></div></foreignObject><text x="1152" y="651" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1152" y="651">읽기 전용 SQL 실행</tspan><tspan x="1152" y="664">CB_ORDS · SET TRANSACTION READ ONLY</tspan><tspan x="1152" y="677">EXEMPT ACCESS POLICY 없음</tspan><tspan x="1152" y="690">승인된 HR Table/View만 조회</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_54"><g transform="translate(0.5,0.5)"><ellipse cx="1122.7" cy="629.45" rx="15" ry="15" fill="#2f6f8f" stroke="#2f6f8f" pointer-events="all" style="fill: light-dark(rgb(47, 111, 143), rgb(106, 161, 189)); stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 629px; margin-left: 1109px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">8</span></b></div></div></div></foreignObject><text x="1123" y="633" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">8</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_55"><g transform="translate(0.5,0.5)"><rect x="1464.7" y="604.45" width="270" height="125" rx="10" ry="10" fill="#ffffff" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 222px; height: 1px; padding-top: 667px; margin-left: 1497px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>HMM_LEAVE_SCOPE_POLICY</b><br />SYS_CONTEXT 기반 predicate 자동 적용<br /><b>VIEWER → SELF</b><br /><b>MANAGER → MANAGED_TEAM</b><br /><b>ADMIN role → ALL</b></div></div></div></foreignObject><text x="1497" y="644" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1497" y="644">HMM_LEAVE_SCOPE_POLICY</tspan><tspan x="1497" y="657">SYS_CONTEXT 기반 predicate 자동 적용</tspan><tspan x="1497" y="670">VIEWER → SELF</tspan><tspan x="1497" y="683">MANAGER → MANAGED_TEAM</tspan><tspan x="1497" y="696">ADMIN role → ALL</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_56"><g transform="translate(0.5,0.5)"><ellipse cx="1467.7" cy="629.45" rx="15" ry="15" fill="#c74634" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 629px; margin-left: 1454px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">8a</span></b></div></div></div></foreignObject><text x="1468" y="633" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">8a</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_57"><g transform="translate(0.5,0.5)"><rect x="1119.7" y="824.45" width="615" height="95" rx="7.6" ry="7.6" fill="#ffffff" stroke="#2f6b4f" pointer-events="all" style="fill: light-dark(rgb(255, 255, 255), rgb(18, 18, 18)); stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 567px; height: 1px; padding-top: 872px; margin-left: 1152px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>항상 정리</b><br />결과 읽기 → ROLLBACK → CB_ORDS_HANDLER_PKG · CLEAR_VPD_CONTEXT<br /><span style="color: light-dark(rgb(91, 86, 82), rgb(166, 162, 158));">성공·실패와 무관하게 session context와 client identifier 제거</span></div></div></div></foreignObject><text x="1152" y="862" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="1152" y="862">항상 정리</tspan><tspan x="1152" y="875">결과 읽기 → ROLLBACK → CB_ORDS_HANDLER_PKG · CLEAR_VPD_CONTEXT</tspan><tspan x="1152" y="888">성공·실패와 무관하게 session context와 client identifier 제거</tspan></text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_58"><g transform="translate(0.5,0.5)"><ellipse cx="1122.7" cy="849.45" rx="15" ry="15" fill="#2f6b4f" stroke="#2f6b4f" pointer-events="all" style="fill: light-dark(rgb(47, 107, 79), rgb(119, 171, 147)); stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 849px; margin-left: 1109px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 13px; font-family: 'Oracle Sans'; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><span style="color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));">9</span></b></div></div></div></foreignObject><text x="1123" y="853" fill="#000000" font-family="'Oracle Sans'" font-size="13px" text-anchor="middle" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));">9</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_59"><g><path d="M 904.7 671.92 L 1252.17 671.92 Q 1262.17 671.92 1262.17 661.92 L 1262.17 529.69" fill="none" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/><path d="M 1262.17 521.69 L 1266.17 529.69 L 1258.17 529.69 Z" fill="#c74634" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 672px; margin-left: 1160px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">검증된 SQL + 원문 Bearer</div></div></div></foreignObject><text x="1160" y="675" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">검증된 SQL + 원문 Bearer</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_60"><g><path d="M 619.7 674.45 L 644.76 674.49 Q 654.76 674.51 654.76 684.51 L 654.76 769.45 Q 654.76 779.45 644.76 779.45 L 309.7 779.45 Q 299.7 779.45 299.7 789.45 L 299.7 864.51 Q 299.7 874.51 289.7 874.51 L 259.7 874.51 Q 249.7 874.51 249.7 870.61 L 249.7 866.71" fill="none" stroke="#2f6b4f" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke" style="stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/><path d="M 249.7 874.71 L 245.7 866.71 L 253.7 866.71 Z" fill="#2f6b4f" stroke="#2f6b4f" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(47, 107, 79), rgb(119, 171, 147)); stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 779px; margin-left: 474px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">Agent Tool 결과 · CLEAR_USER</div></div></div></foreignObject><text x="474" y="783" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">Agent Tool 결과 · CLEAR_USER</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_61"><g><path d="M 1404.7 464.45 L 1454.46 464.45" fill="none" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/><path d="M 1462.46 464.45 L 1454.46 468.45 L 1454.46 460.45 Z" fill="#c74634" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 464px; margin-left: 1435px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">SET_USER_BY_BEARER</div></div></div></foreignObject><text x="1435" y="468" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">SET_USER_BY_BEARER</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_62"><g><path d="M 1262.2 519.45 L 1262.2 594.21" fill="none" stroke="#2f6f8f" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/><path d="M 1262.2 602.21 L 1258.2 594.21 L 1266.2 594.21 Z" fill="#2f6f8f" stroke="#2f6f8f" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(47, 111, 143), rgb(106, 161, 189)); stroke: light-dark(rgb(47, 111, 143), rgb(106, 161, 189));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 562px; margin-left: 1262px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">context 확인 후 실행</div></div></div></foreignObject><text x="1262" y="565" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">context 확인 후 실행</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_63"><g><path d="M 1599.7 519.45 L 1599.7 594.21" fill="none" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/><path d="M 1599.7 602.21 L 1595.7 594.21 L 1603.7 594.21 Z" fill="#c74634" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 562px; margin-left: 1600px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">SYS_CONTEXT</div></div></div></foreignObject><text x="1600" y="565" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">SYS_CONTEXT</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_64"><g><path d="M 1404.7 666.95 L 1454.46 666.95" fill="none" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/><path d="M 1462.46 666.95 L 1454.46 670.95 L 1454.46 662.95 Z" fill="#c74634" stroke="#c74634" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(199, 70, 52), rgb(243, 132, 117)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 667px; margin-left: 1435px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">SELECT → predicate 주입</div></div></div></foreignObject><text x="1435" y="670" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">SELECT → predicate 주입</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_65"><g><path d="M 1599.7 729.45 L 1599.7 766.98 Q 1599.7 776.98 1605.7 776.98 L 1608.7 776.98 Q 1611.7 776.98 1611.7 786.98 L 1611.7 814.21" fill="none" stroke="#2f6b4f" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/><path d="M 1611.7 822.21 L 1607.7 814.21 L 1615.7 814.21 Z" fill="#2f6b4f" stroke="#2f6b4f" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(47, 107, 79), rgb(119, 171, 147)); stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 777px; margin-left: 1605px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">허용 행</div></div></div></foreignObject><text x="1605" y="780" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">허용 행</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_66"><g><path d="M 1262.2 729.45 L 1262.18 766.98 Q 1262.17 776.98 1252.46 776.98 L 1247.61 776.98 Q 1242.76 776.98 1242.75 786.98 L 1242.71 814.21" fill="none" stroke="#2f6b4f" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/><path d="M 1242.7 822.21 L 1238.71 814.21 L 1246.71 814.22 Z" fill="#2f6b4f" stroke="#2f6b4f" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(47, 107, 79), rgb(119, 171, 147)); stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 777px; margin-left: 1252px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">result set</div></div></div></foreignObject><text x="1252" y="780" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">result set</text></switch></g></g></g><g data-cell-id="hmm-security-flow_e_67"><g><path d="M 1119.7 871.95 L 1119.7 954.51 Q 1119.7 964.51 1109.7 964.51 L 979.7 964.51 Q 969.7 964.51 959.7 964.51 L 259.7 964.51 Q 249.7 964.51 249.7 954.51 L 249.7 887.19" fill="none" stroke="#2f6b4f" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/><path d="M 249.7 879.19 L 253.7 887.19 L 245.7 887.19 Z" fill="#2f6b4f" stroke="#2f6b4f" stroke-width="2" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(47, 107, 79), rgb(119, 171, 147)); stroke: light-dark(rgb(47, 107, 79), rgb(119, 171, 147));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 965px; margin-left: 688px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #312D2A; background-color: #FFFFFF; "><div style="display: inline-block; font-size: 11px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; background-color: light-dark(#FFFFFF, #121212); white-space: nowrap; ">정제된 Tool 결과</div></div></div></foreignObject><text x="688" y="968" fill="#312D2A" font-family="'Oracle Sans'" font-size="11px" text-anchor="middle" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));">정제된 Tool 결과</text></switch></g></g></g><g data-cell-id="hmm-security-flow_v_68"><g transform="translate(0.5,0.5)"><rect x="349.7" y="809.45" width="555" height="110" rx="8.8" ry="8.8" fill="#fff7f2" stroke="#c74634" pointer-events="all" style="fill: light-dark(rgb(255, 247, 242), rgb(30, 23, 19)); stroke: light-dark(rgb(199, 70, 52), rgb(243, 132, 117));"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 537px; height: 1px; padding-top: 864px; margin-left: 360px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; color: #312D2A; "><div style="display: inline-block; font-size: 12px; font-family: 'Oracle Sans'; color: light-dark(#312D2A, #c8c5c2); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>보안 불변조건</b><br />• Token 원문은 DB·로그·응답·Git에 저장하지 않음<br />• SQL 생성 ADMIN과 실행 CB_ORDS를 분리<br />• 컨텍스트 설정과 보호 객체 SELECT는 반드시 같은 connection<br />• 권한 또는 메타데이터가 불완전하면 결과를 축소하는 대신 요청/기동 실패</div></div></div></foreignObject><text x="360" y="840" fill="#312D2A" font-family="'Oracle Sans'" font-size="12px" style="fill: light-dark(rgb(49, 45, 42), rgb(200, 197, 194));"><tspan x="360" y="840">보안 불변조건</tspan><tspan x="360" y="854">• Token 원문은 DB·로그·응답·Git에 저장하지 않음</tspan><tspan x="360" y="868">• SQL 생성 ADMIN과 실행 CB_ORDS를 분리</tspan><tspan x="360" y="882">• 컨텍스트 설정과 보호 객체 SELECT는 반드시 같은 connection</tspan><tspan x="360" y="896">• 권한 또는 메타데이터가 불완전하면 결과를 축소하는 대신 요청/기동 실패</tspan></text></switch></g></g></g></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file diff --git a/docs/architecture/hmm-ai-data-access-architecture.drawio b/docs/architecture/hmm-ai-data-access-architecture.drawio new file mode 100644 index 0000000..78cf895 --- /dev/null +++ b/docs/architecture/hmm-ai-data-access-architecture.drawio @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mxfile host="app.diagrams.net" modified="2026-08-04T00:00:00.000Z" agent="cloud-handson" version="24.2" type="device" compressed="false"> +<diagram id="hmm-overview" name="01 · 전체 구성"><mxGraphModel dx="1600" dy="1000" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1800" pageHeight="1080" background="#FFFFFF" math="0" shadow="0"><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="hmm-overview_background" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=none;locked=1;" vertex="1" connectable="0" parent="1"><mxGeometry x="0" y="0" width="1800" height="1080" as="geometry"/></mxCell><mxCell id="hmm-overview_v_1" value="HMM AI 데이터 접근 아키텍처" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=25;fontStyle=1;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="36" y="22" width="1728" height="38" as="geometry"/></mxCell><mxCell id="hmm-overview_v_2" value="사용자 Bearer MCP · Select AI · VPD · HR 정책 벡터 검색 · AWS RDS PostgreSQL Federation" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#5B5652;fontSize=12;fontStyle=0;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="38" y="60" width="1724" height="28" as="geometry"/></mxCell><mxCell id="hmm-overview_v_3" value="" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#C74634;strokeColor=#C74634;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="36" y="92" width="1728" height="3" as="geometry"/></mxCell><mxCell id="hmm-overview_v_4" value="" style="rounded=1;arcSize=7;whiteSpace=wrap;html=1;fillColor=#FCFBFA;strokeColor=#9E9892;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="30" y="120" width="190" height="790" as="geometry"/></mxCell><mxCell id="hmm-overview_v_5" value="<b>HMM 사용자</b>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=13;fontStyle=0;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="44" y="128" width="162" height="26" as="geometry"/></mxCell><mxCell id="hmm-overview_oci_6" value="" style="group" vertex="1" connectable="0" parent="1"><mxGeometry x="80" y="165" width="76.00000000000007" height="90" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_7" style="vsdxID=27;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_oci_6"><mxGeometry width="76" height="84" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_8" style="vsdxID=28;fillColor=#FFFFFF;gradientColor=none;shape=stencil(pVXbchshDP2afdUgCRA8p+l/ZBqn3qlrZxynTf++UFhYlDEvfQOttEeXo8PCD2/Hp9fDQubtdr38OPxen2/Hhb8sROv5eLiut3Ra+HHhh5fL9fD9enk/P5f761P2zKefl1/5Dx8lzoDhHETmTzGgMf/uX4v3aT3PvANB5L3/t/dr+T3WiOperyLAvpg+qJgISKpTtQhCjNWJi8mDrT6bQSBMgdGA4xHcM/gwgqMHsiO6RzBuRE85WlT4Bqyd4keIYcR3AVgUvkDEEd85iDLi5yzDiO8YeMAfB4UO3BZRA1Kf6X5A7rAMAYggflYhCQiNFYYtqVYgG0BWBfYu1GI4FaPqY6ApOHvwarwI6EZwu+MANQbjCG4tOEWuyQak6dhxBcwsTRc7c7BloDYg8VKvAAKpNH0a0KceMc7AfQQZsV3LZsMWAsW/0De04sjn8WRy8P0upQhRskIQwv2AYHVbE19RJgHcydc2guKsHUmrUM0i7xqPDQmmrX8j7I7WW0sEPI0tyYowHUdOOSpFwiaoDT/2OXd+eDWSmExakZIiTvGj9KFscpyUVpFx0/+uxkmySaHvtI1bc2fz3Ud0i7sf8J/vkvJOh/4AvqynU3k/99/1g5lM5bHlx78=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_7"><mxGeometry x="1" y="1" width="74" height="82" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_9" style="vsdxID=29;fillColor=#FFFFFF;gradientColor=none;shape=stencil(pVjbVhsxDPyafdWxLV+fKf0PTgklpxQ4Adr076vtrr32uPFC+xaMlLGkkTTOxFcv9zfPh8mol9fT07fDz+Pt6/3EnyZjjo/3h9PxVT5NfD3x1d3T6fD19PT2eLv8/XwzW86fvj/9mL/hvPg5R6xnL6N+LSeGOP45+LzYf3k7LQ569Uiks4fOLtYuJ2eznHhDIa1G6xGTX93OvBo5CmE1Wo/kxIzAfaTgW/BAkVvwoAiwtSpuGTxoir4F15ZUqNEfjo9VqqKhNlNOU+KBvSbvWgdD3o7CC4k8t+E5T0pDfL5LrouUILuBiW0boNek7eULi4fj5sKdQ3dh311YfNYsbhdOuazlwmLloCKS38yQcmFDbkjG6MgBvPCsRY+RNAO6K0cZPSliB+iBVBqhJ7leAPhECnohWWLAF/JxAHyJBMol9UjD7Cchgm3xpSDOAH4g9oCfyETAD138UpBRP9Qe5cSbyw5S3/hf9t2FMCGVh+4jLYMIq1HlbA3dEuRitxYyuQC5qnEGIguFqOmSC0E+TR/jodal+wsPK4bnIWg3hmX4rVnyDJQ7MsDvNaGR1jEAX7X3iiV5txrgq1GxghmpBQ6B8dQSj9DScHdqVRTI1avmpylRWdfet57FOV+x7L6yw3DKt/eVDKeW1jt7xETYO/OecsP4UjYoAc4bEOYSS5pgjcguhfjYko4QHw17kANpaAXZK6nFtooiJNcU4pUmtDmRBRvFSZspETOmXWC79jvi56P2nbiC+6jLX15H+xdjTLNkMACJFSnoOfaUYPFK0aHlmbuJw9noUo2lN6DGbvveXFAhepiAX2m/32WamXG/m9Dkac/BbbpideDh3tFdmaVDR7wQB9UpPZOGDg5mgKR8fKVSyOKw9uqlpSB9CENA+Ai7UMaXh6HsZCkDQ4RZBhgirwAeUmTeNqgMhTWAn8qOrFZSVhXnMnA8jCDZiHa4kmSiphZc1rEHYaSAnL48RzKyKtv5nZqocshzd9DyKW0d8k/mu4Iof1+tDwP0qaiwhHtAoy4QEYsUmIswBBdJ7aAKc3VBloiE73TBNl7KayZ1u2CXgvIAQ10yk9sBfv9UlT7JR+VxYjsqdB0Izz9LNn/vu3pcEqFg7IyniCCA8pnnlL/sEGxpwG0SuoG9RAh01sMQ5hdkHDt0L0ihMGr28jI/bzLZoRbrpKP3BMqVd3SzsLHTSfm6BVtoZuDBoDrRXiuDPDsup+lDumDHWD5sv+3cHR8elp+G6v/jb0FytPyOxNe/AQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_7"><mxGeometry width="76" height="84" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_10" style="vsdxID=30;fillColor=#2c5967;gradientColor=none;shape=stencil(nVrbklQ3DPyaeXX5fnkm5D+osIStEJZaIIG/j5wZS3Zrjs8ub8tgj2S51WrJcwlvvn589+Xh4u3Xb89Pfz38+/j+28dL+O3i/ePnjw/Pj9/or0t4ewlvPjw9P/z5/PT98/vrv7+86yv7X38//dO/4cd1X4mm1b7L25/XT7Iz5f8Pfr+u//T4eV1f9uv/+P58NeBuO6qJ4bbj9lFqJuTrRz/89aPqZNXto5RNcLdV4bYqmFRuq24fJW/Kxt8ajY2Lv7TB+s0Bg3Ft2eC88Wl7Qm9cWU9Yh1N8wNxMg/OZ3Nbj5WxKWI8XTKw725kiklfbzniwTfHOeTVujU2r8UT+xNW4PQ5TjCamJUx252a0JsbVTfIAMBCynMXzWSBGgSLiMEbJ7YwHazzEKHGgh3G6shss2Hg1FfDni7FgvKNjgz+XjS2XV+CPNqSEG8o2w1w1ucL5ptwZB3SMt5+CC87DccJkAkBwTwi0AfLljBDIkeZWd2lLhvvoh0qru5nyLK7uumRSA3eD8Vs40I0lIKQcBWc3Y80UNJ8MYLEYSJhcTNtSReK0G6aLhSSQcHqmlwi5ShH0q+VC15B3lq2Ec1gupkIGWkgAKzQ2KEElAHHyBh7T+pvrdscqbO+XVqMrioVkw+Bpx3BnsjRQh6iAjRLJRG0C3Hwh6m4728UEsE2lNEOOEuPoy+fMGJdvhymxboeLx5jn5B+Yp+T3kHNxwFdAL7TI9gn2gD7C/R59TqrfMJ8NMjDlZQTriQMyEZTDjE+QdStMqKwEYCjcoCpGNhXKFQUCGCKQsCmrv8XJlQaufCywxm2xijnCKS0ArCTmrGE+EuKgYBEI0XySMjtBNW8JMgUDh5+/WNRZRvOTk8N8My688vS9GODxnbLfab5eEKsoqIISVCdg6Xp4HOuFYCEeTZDaU6kQKoVo9QSAzKpedNqUWVteqZQP/oJQRWlVC1d6tq+Lf21D6cptuUHgB/abMw5vi44BCrR5Vc07/UE1b0GEjIC1+q39aJBXsZIn44FXOu2j7WnViyrbvOEFxWr85y8tPitsst4x3LABaXTfeAWTAhhhIOzgFZxJi5ZZKE8QiABBuqgG11BEHbB9rwUdiaq9fSuwnRIQa2tRdE2yD/iK2kXsLjrRbBHYwQTtRVeqaTVPKsJCbZ9V74h1lFC+SH7/Qv9+sn6dD1Dv1NbiScp4zUiotnqDN/ti6we+OH60pUD8qO9DBqNVDeATohoQ9FX7amtV+04qfOQ2l9uk2qfeUQGD93IL2ogambjFT4rGQj9C3xzg/FRJbdDnh/TtjQwcPxzfFWVJhLsKO0/7fEJdVANd0tNV+VnQzyZtcbgPE3C1YR/dcbh1tqnC1JEGzlYRCJ4hBKWBToRJKaOK41CB4CW5WNB6GpMLtk5gVFMhIn+oTNGPZDjWUA2uKsokbMJUhZJAMA9gPxVBybCfR9t0hOnErTrbL3ouRaoAzBfubTYpRavqllJoAY6b5m/2HJGmzHtoeCnUKenTbzO6Mwrcfo9rXc0TICwUpChU8EOQFgB8p7ffWRCPb1laTYzqIPwzRod9rzRh4BHVkX3pqn+KSwC+XigA/FN+BlkE2MO8Py0/r65XuGGtiHNPwcnmdtSlNsQKI8A77KEuMCtJQeRVoQWizhGplkQW9BTRDZQdD7RHazKxF/A89XEBrIek0odWcZcqiNqFq49bYADqxuzkuANDBUY9LGR7l7GQbtTDWpjslGkIIfy3n7/20T6Ei5gV9W+vCID3bJWAuNexuuH4C+H1ajyqDSviiZU4vLdP4EVkNUDkn/brVbloQ2ML3hVfkqjOALikqkXW46EK4VPXV1DVOMsHmJ5vkKydxJGtV0VX26uryD0kFt02Ur2xAWagPUqDeeZx9rayIpiGMxmonVad3BQxE7w1uMIpw4U9yCvhsJ+5/2H7TpVWF0eY7098Gx9VHud2z3/EtAGadLSgijcRLXSzs+9CtEyRXsdBhn9YPHuE98W7GIcRnu5OijeOavsqsN+LmzK/44Zpwz343nlZq1Do56yYyjqiwXKfNrVuOPypJ7OvO6FK8mY3KWqQ+FFpXKI4D8b3HPdaTjxfv3IudYAO3q2xCsI7XEakd+W2VRm0BR8FqIIHyGVf5NVEZCK3p6LKUCW7k0QjlegBPF2+4JR9evKXybcDkTPP+Id9FFmnrwJYZ5XD/LIog56pgouu9cC9sxqQl2Scc3WdsWUGgkxDmSPPy9MzCnIv0bF6RnGqTp4B7NWIPN+wYr53emuP34XoLiK9EQTdwFuWyQ30OUUqDzNAUKW7jJn9kXWv2pwuyUGlUx6ohwrsMZ16pMk7LpmWc+Ti2YtShVTv1RdEDiUWFhVq0R2+6ViZRAVcdfykhEV1/mbR40qiT16ybAHjeHhQo/j2t/WzSvI4uKzhUdG/DKhqjp5EMsxw2uIpRfVLqQ5UPTTxEKQiQNxMTfqq5fD0h/ws7MPjp0/XX5XN/48/I6OPrj9BC2//Aw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_7"><mxGeometry x="2" y="2" width="72" height="80" as="geometry"/></mxCell><mxCell id="hmm-overview_v_11" value="<b>팀장 · E1001</b><br>팀원 · E1002~E1007<br>HR 관리자<br><br><font color="#5B5652">같은 질문이라도 역할과 보고 관계에 따라 다른 행을 조회</font>" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#D4CFCA;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="54" y="270" width="142" height="150" as="geometry"/></mxCell><mxCell id="hmm-overview_v_12" value="<b>외부 Agent</b><br>AI Database Private<br>Agent Factory<br><br><font color="#5B5652">MCP client</font>" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#D4CFCA;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="54" y="465" width="142" height="115" as="geometry"/></mxCell><mxCell id="hmm-overview_v_13" value="<b>공개 HTTPS</b><br><br>hmm.cloud-handson.com<br><br>hmm-backoffice.cloud-handson.com/mcp<br><br><font color="#AE562C">사용자 Bearer Token</font><br><font color="#5B5652">TLS · HttpOnly portal cookie</font>" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#AE562C;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="54" y="625" width="142" height="210" as="geometry"/></mxCell><mxCell id="hmm-overview_v_14" value="" style="rounded=1;arcSize=7;whiteSpace=wrap;html=1;fillColor=#FBFAF9;strokeColor=#9E9892;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="250" y="120" width="1260" height="900" as="geometry"/></mxCell><mxCell id="hmm-overview_v_15" value="<b>Oracle Cloud Infrastructure</b>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=13;fontStyle=0;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="264" y="128" width="1232" height="26" as="geometry"/></mxCell><mxCell id="hmm-overview_v_16" value="" style="rounded=1;arcSize=7;whiteSpace=wrap;html=1;fillColor=#F5F4F2;strokeColor=#9E9892;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="280" y="165" width="930" height="815" as="geometry"/></mxCell><mxCell id="hmm-overview_v_17" value="<b>OCI Region · ap-seoul-1</b>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=13;fontStyle=0;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="294" y="173" width="902" height="26" as="geometry"/></mxCell><mxCell id="hmm-overview_v_18" value="" style="rounded=1;arcSize=7;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#AE562C;strokeWidth=1;dashed=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="315" y="210" width="480" height="320" as="geometry"/></mxCell><mxCell id="hmm-overview_v_19" value="<b>VCN · Public application subnet</b>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#AE562C;fontSize=13;fontStyle=0;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="329" y="218" width="452" height="26" as="geometry"/></mxCell><mxCell id="hmm-overview_oci_20" value="" style="group" vertex="1" connectable="0" parent="1"><mxGeometry x="340" y="265" width="84" height="90" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_21" value="" style="group" vertex="1" connectable="0" parent="hmm-overview_oci_20"><mxGeometry y="2.2737367544323206e-13" width="84" height="130" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_22" style="vsdxID=53;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_21"><mxGeometry width="84" height="84" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_23" style="vsdxID=54;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_22"><mxGeometry width="84" height="84" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_24" style="vsdxID=55;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZPRDoIwDEW/Zq9LWUHCs+J/EAVZRCATFP/eYYdsAzW+td2922mzMtxey6zNmYBrp5pzfpfHrmS4Y0LIusyV7HTEMGW4LRqVn1TT10fK22xUjtGluY03DOSLOEajScCDCknC482rsif9oVdkCEggeIjGEfgWGASVwChMmsQchVGgqzBpEvLQfrWStUUJDuKb+QMhuHgz8ERnteDyTnDWVBzcVTiNvnFnCN/o9Cyi2CUEFy8Ab3xWB+hLfOJVxFnuI3+AnA1L6kEsG/HJB1zOxkNfBf39Hf/V62D++4WsKlod+9zfFV2iPcP0CQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_23"><mxGeometry x="1" y="1" width="82" height="82" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_25" style="vsdxID=56;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZXRdoIwDIafprc9aUMpvXb6Hp6JgzMmHsSNvf1gLbQNCHpX4h/88iehDHe34njNmYRb29Sf+U95aguGb0zK8lLkTdn2J4Z7hrtz3eQfTX2/nOzz9Tgoh9NX/T28obN5BjmqIUvCr41Ijtl/4GD17/fGJgiXoXhiXIYgKdBJJ9IcR5ELJVy6SIdzkQulPMHwz6vyEsIGCRN+JlZpgxRfgFEEN6jJV5ClhDfwCqlqEbgvR8S8VE95e5c0wdU8lTFu77cmtIprEdMGIs+v9GPYIGG5GZQ1SBCzHstZPXI2LDhzCZdnkIzB5sy+qt/aCXihxbBuWaZiyyD2C6hZdAghdmp9YSAi21wWYHTyREInb+J3EQHANro5Sh41R8U7TeQLGy2Ih56BQgXbPJWCVPPcenj9c9thDNcp/U5O3Ry5Um5EjErsXPjorLu5Nrr9wV8E57Kq7D0S/k4vjj5kLx3c/wE=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_23"><mxGeometry width="84" height="84" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_26" style="vsdxID=57;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_22"><mxGeometry x="2" y="2" width="80" height="80" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_27" style="vsdxID=58;fillColor=#2d5967;gradientColor=none;shape=stencil(lZXLcoMwDEW/xlvGWDzidZr8R6YhhSmFDCEt+ftCbbAkB+Lu/LgyR/IVFrC/ladrIZS89V37WfxU574U8CaUqpqy6Kp+HAk4CNhf2q746Np7czbz62lSTqOv9ns6YTBxOo3SeIpS8mFW5N/saMR11SBxEqlkXft+78zJsdmMI62tOsZyOSgyfdipsrtAd2H5drpOJgmWzra4JIXSO0qFsOcVKSkaqgNQyVO4scZ5RgCZnBPqXSRjSukYONRMueQBXAAOY6OETv+84B6kno9bIBVF1LnLm175AL774KX9XniVGTtzNVzJ38so88puneRSSr2UxihbqK20nCqsszw9hwWvuzCImkV5wmkpKlKE2QQFhPkEBdiVhEPyhoPFWesdB5uUfstxfcDlIwx01+z6EwqKFUF/rgCf/jtgHLj//aWqa/Nc4H3+PoxL5m2Bwy8=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_26"><mxGeometry width="80" height="80" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_28" style="vsdxID=59;fillColor=#2d5967;gradientColor=none;shape=stencil(pZJbDsIgFERXwy+hQBW/a91Hk1IhIjQUX7sXcmNsNaWx/s1wz32EDGLVoJpeIkqG4N1J3nQbFGJ7RKm2SnodokKsRqzqnJdH7y62Bd83iUzq7K5pwh36SOqg5AGuIOAPgBptR+iruArOoCvB7PosOv0BjkUxpTdYlPOjdxyXf/GCY7qd57/u+ZVfuGeZj+Idl04bA2kb1z/jFZ8gmqx+Ag==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_26"><mxGeometry x="11" y="51" width="58" height="17" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_29" style="vsdxID=60;fillColor=#2d5967;gradientColor=none;shape=stencil(jVLRDoMgDPwaXg2UOeezc/9hJk4ypwZ107+fpCRClxnf2nLH9eCYzIa66BUDPoyme6qPLseaySsD0G2tjB7XismcyazqjHqYbmpL7PvCIm316t72hhl5MbcU4Au2gmN/Q+x9MggWeJwk0Vk4gggZfAYyWGAjgcNIinGDUxql6Z7yxnADgEheQmV/OzfioW5MZHfNWoUkFCVWiVF/JRkijtokJv2ng9+t6Iv/s0l+tdHt4QSsxRadSjcNJs8/p1FbRxhTmX8B);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_26"><mxGeometry x="57" y="58" width="4" height="4" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_30" style="vsdxID=61;fillColor=#2d5967;gradientColor=none;shape=stencil(pZLbDsIgEES/Zl8JZW3E51r/o0mpEBEa2nr5e0Fi2qrpRd92Z8+QCRnArJFFLYDRpnX2JK6qbCXgHhhTRgqnWj8B5oBZZZ04OtuZMu51Ecgwne0lvHCLvh0nnAcXo/eo0Od2iLBWZgDT38CETqCv4yJ4VdoZePwPHEmyGcFBSSdyp2SL/xl65avhM9Jqw0ykBQY/9NWplNaxecP7e9W8FGuK+QM=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_26"><mxGeometry x="11" y="11" width="17" height="17" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_31" style="vsdxID=62;fillColor=#2d5967;gradientColor=none;shape=stencil(pZJJDoMwDEVP422UxGXYU3oPJEKJmhIUoMPtm8iqCnSE7vzj920r+oBZVxetAsm73tmDOuuyrwG3IKVuauV07yvAHDCrrFN7Z4emJN0WgQzV0Z7ChAv5BOfBI/mVNKkdoUY3I3QleN/wEp2vXwSvRac/kG6YTCZwikxEH2bHLI3/M4iIJfje8HzSYsOXk34w+OIRmkobQ5kb9+ch808UUMxv);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_26"><mxGeometry x="31" y="11" width="17" height="17" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_32" style="vsdxID=63;fillColor=#2d5967;gradientColor=none;shape=stencil(pZLbDsIgEES/Zl8JZW3E51r/o0mpEBEa2nr5e0Fi2qrpRd92Z8+QCRnArJFFLYDRpnX2JK6qbCXgHhhTRgqnWj8B5oBZZZ04OtuZMu51Ecgwne0lvHCLvh0nnAcXo/eo0Od2iLBWZgDT38CETqCv4yJ4VdoZePwPHEmyGcFBSSdyp2SL/xl65avhM9Jqw0ykBQY/9NWplNaxecP7e9W8FGuK+QM=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_26"><mxGeometry x="11" y="31" width="17" height="17" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_33" style="vsdxID=64;fillColor=#2d5967;gradientColor=none;shape=stencil(pZJJDoMwDEVP422UxGXYU3oPJEKJmhIUoMPtm8iqCnSE7vzj920r+oBZVxetAsm73tmDOuuyrwG3IKVuauV07yvAHDCrrFN7Z4emJN0WgQzV0Z7ChAv5BOfBI/mVNKkdoUY3I3QleN/wEp2vXwSvRac/kG6YTCZwikxEH2bHLI3/M4iIJfje8HzSYsOXk34w+OIRmkobQ5kb9+ch808UUMxv);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_26"><mxGeometry x="31" y="31" width="17" height="17" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_34" style="vsdxID=65;fillColor=#2d5967;gradientColor=none;shape=stencil(pZJJDoMwDEVP422UxGXYU3oPJEKJmhIUoMPtm8iqCnSE7vzj920r+oBZVxetAsm73tmDOuuyrwG3IKVuauV07yvAHDCrrFN7Z4emJN0WgQzV0Z7ChAv5BOfBI/mVNKkdoUY3I3QleN/wEp2vXwSvRac/kG6YTCZwikxEH2bHLI3/M4iIJfje8HzSYsOXk34w+OIRmkobQ5kb9+ch808UUMxv);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_26"><mxGeometry x="51" y="11" width="17" height="17" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_35" style="vsdxID=66;fillColor=#2d5967;gradientColor=none;shape=stencil(pZJJDoMwDEVP422UxGXYU3oPJEKJmhIUoMPtm8iqCnSE7vzj920r+oBZVxetAsm73tmDOuuyrwG3IKVuauV07yvAHDCrrFN7Z4emJN0WgQzV0Z7ChAv5BOfBI/mVNKkdoUY3I3QleN/wEp2vXwSvRac/kG6YTCZwikxEH2bHLI3/M4iIJfje8HzSYsOXk34w+OIRmkobQ5kb9+ch808UUMxv);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_26"><mxGeometry x="51" y="31" width="17" height="17" as="geometry"/></mxCell><mxCell id="hmm-overview_v_36" value="" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FCFBFA;strokeColor=#D4CFCA;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="445" y="260" width="320" height="235" as="geometry"/></mxCell><mxCell id="hmm-overview_v_37" value="<b>Compute VM · 132.226.232.69</b>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=13;fontStyle=1;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="462" y="274" width="286" height="34" as="geometry"/></mxCell><mxCell id="hmm-overview_v_38" value="<b>Nginx</b> · TLS / reverse proxy" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#D4CFCA;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="470" y="320" width="270" height="42" as="geometry"/></mxCell><mxCell id="hmm-overview_v_39" value="<b>AI Web Agent Console</b><br>Streamlit · 질문/근거/감사 UI" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#2F6F8F;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="470" y="376" width="270" height="46" as="geometry"/></mxCell><mxCell id="hmm-overview_v_40" value="<b>VPD Backoffice</b><br>Spring Boot · `/mcp` · 권한 관리" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C74634;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="470" y="436" width="270" height="46" as="geometry"/></mxCell><mxCell id="hmm-overview_oci_41" value="" style="group" vertex="1" connectable="0" parent="1"><mxGeometry x="330" y="635" width="83.99999999999994" height="90" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_42" style="vsdxID=58;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_oci_41"><mxGeometry width="84" height="81" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_43" style="vsdxID=59;fillColor=#FFFFFF;gradientColor=none;shape=stencil(pdTNDoMgDADgp+Ha8C+enXsPE3GSOTHo/t5+ErJsM2EbemvhK+mhBbFibKtBI4rHydmjvpp6ahHbIUpN32pnpjlCrESsaKzTB2fPfR3yofLSRyd78S/cQh32FRTfQ0ZwyPeBdqaP0lwCpnHMIZOfnoHgcS+A0U0+U6BU3BPgYpMXBGie0E+q5wSkTOgn1RMOOEvoJ9V/GZycg1Tr8Y9JyAVQnlLwHPI/J3nJE3ZkPZ2D18Y2puvCwr/fLzd8Pgq/Aysf);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_42"><mxGeometry width="82" height="79" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_44" style="vsdxID=60;fillColor=#FFFFFF;gradientColor=none;shape=stencil(pZbbboMwDIafJreWE+dArrvuPSqVDjQGFaU7vP1gUbUShDeXO+N8Dr+NTaJod6kO51IZvAx991p+1MehUvSkjKnbquzrYbQU7RXtTl1fvvTdtT2m5/NhIifrrXufdvhMcdGA01OUwa/kMUDFj+M58U3dsnwk8JEJIIgkCggQsjc48EEUEMCb9QADJm7jeUEeMEgyDmDjJj4EQEY/5fWR8o7viYUeKW8RLMMv9Eh57UEz+S70SHnpyGzlsxG2UMxwXN/bgXkU1WNZ7TquwW7jLQG6/8sR4g5BMyO1UCPlQ2S/aS5HiEfNNrwDtBJeg/H5D8fSOo9z2LKlmcMamRa7LT4E/yEjFrf2u0vSMVM97hd9XkXHnTv53El5JlmeHY3f8/xUN026Dtyv5+f/6Ep3B9p/Aw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_42"><mxGeometry width="84" height="81" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_45" style="vsdxID=61;fillColor=#2d5967;gradientColor=none;shape=stencil(nZBLCoAwDERPk31tjuDnHoLVBmsrtf5ub0sQRdzobiZ5ycAA5pOuRwVSTMG7Xq3UBA1YgJRktfIUogIsAfPWedV5N9uG/VgnMqnBLenDxneZEOlGip09u4pRQ/aG/gTPhFf0Gf8J/otGcdXRkjHc5n3/rC+OuHosDw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_42"><mxGeometry x="6" y="35" width="3" height="4" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_46" style="vsdxID=62;fillColor=#2d5967;gradientColor=none;shape=stencil(pdTdDoIgFAfwp+GW8aEzr83ew00MlolD+nr7IMpaFnns7vDnB4MxDuLFIKteIEYGa/ROnFRtJeJrxJjqpDDKugrxEvGi0UZsjT50dRj3lZe+2uuj3+Ec1iU4Sf0iRi4hoAwzfks2wbeqi3oCwGPwkd+3modzEE5xCjnJ1MeuOdU5TI/JnJv+0BSkJy8E9pDnX2U4y797shxTEjnHY3IRjtCFEPzD/vWueH7/RrVt6B6v8+/twkWh1fDyCg==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_42"><mxGeometry x="6" y="1" width="71" height="71" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_47" style="vsdxID=63;fillColor=#2d5967;gradientColor=none;shape=stencil(pZbdboMwDIWfJrdWYueP6657j0qlIxqDitJtffvCsmkrqB4ud8H5TnRiO8iKNqdqdywV6lPfta/lR9r3laInhZiaquxSP6wUbRVtDm1XvnTtudnn7+NuJMfVW/s+nvCZdQbB06hCfcmRQkOIX5HnLKhTwwqM1gz+vfkQzKEzGyK4AFPc5/XDrEXQDDw3Iha4CNoutSOCxYVfL7jtRQv+Bo8GnL9/fgG4Bg8ekMn81IwUR6AgMCPDfQCz3IuQJjCOqWoApHUC8hBxuSEpjsDUaZpJGY3hp6UXWZHiBJ55TzMzMtxEsII2kOIWrKgJxAIHyL1uB3YdXwxXYi48NyQWRAdOkFIpzv/+/sWHxe+QcEh1nWeMv/vToWII5YGEtlc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_42"><mxGeometry x="3" y="7" width="69" height="60" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_48" style="vsdxID=64;fillColor=#2d5967;gradientColor=none;shape=stencil(nZLdDsIgDIWfhltS6ULC9ZzvsWRMiDgWhk7fXrAxTk32491p+7Wh9DAsB1P3mgkYYvAnPdomGoZ7JoTtjA42JsWwYli2Puhj8JeuobivM5nV2V/zhBv1KcmhyF0C7pSBZ3Qg2NluAiNXci0LH2ChuFRr4R1secMs/bveLP4q/gUv7LjppxfgJN4Hba1z5Idp/dsAKUXmweoB);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_42"><mxGeometry x="1" y="76" width="80" height="3" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_49" style="vsdxID=65;fillColor=#2d5967;gradientColor=none;shape=stencil(jZTdboMwDIWfJrdWYuf3uuveo1rpQOtKRenG3n5hSQBHarW7cLD9HTsYQbtbe7g2AuVtHPqP5rs7jq2gF4HYXdpm6MZ4ErQXtDv1Q/M+9PfLMT1fD3PkfPrsv+YKU8pzBgLNWSh/suLA+D/lNSW83YeUoZYUV1Ky5BEMJmnCHKXBlqgseQc6SxPlKARrc1SWAgLiln/uLhvDIdY1zLCS8pnd4EF5bjciirdiNwQIvrKrIQRut6AWs3FYpJ7Sw1Kk0E0AbSu6BIWcrhGUroal1lpZQl8SH/ANgTecrzQojo9VTEUH5OyqbzZxfkElMsNMafaBQYxN1QbjgBx3qBVU80EH1nOPRoN33Cf5Ij3A29h6hTcSZHU/85Zozre0fkO0RpGovw++THxW/9i+eFh399Sdz2n1t+/rXY9S+k/Q/hc=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_42"><mxGeometry x="46" y="22" width="13" height="21" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_50" style="vsdxID=66;fillColor=#2d5967;gradientColor=none;shape=stencil(hZRNcoMwDIVPw1ZjSza212lyj0xDClMKGULa5PY1tSlI05Kd/ZD4HvqhoN21Pl6qAtV1HPr36qs5jXVBLwVi09XV0IzxVNC+oN25H6q3ob91p3S/HKfI6fTRf05vuKc8NODtlIXqkRTngPSPckgJr7chZeglxeeULJUExiTpjkkiBNQ5KksmQJijKEsWXJYeWSIPfpNvA6DjfHRQOs53HjBwvg5gAudrpThdWzDlmt423apcS3y6qy2jToO13KgBLepkSkBh04AibhM9KMeNTpLdosdio4AjKM/p6hc102N1jaCLEj0dkPhSQfYGQuBkDV58d0AoBdkCEYfPDfizO9MYlKw/QUPYrFJEeNEj70Bbbjb2LYhh9nG+xTCvd+m/WgnDz7cvHpbdPTdtm1Z//VzuepTSf4L23w==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_42"><mxGeometry x="25" y="22" width="13" height="21" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_51" style="vsdxID=67;fillColor=#2d5967;gradientColor=none;shape=stencil(lZTdUoNADIWfhtvMJtnf69q+R8dSYUToUKr49oK7yAanHb1bDkm+k7Ch4N21Ol7KgtR16LvX8qM+DVXBTwVR3VZlXw/TqeB9wbtz15cvfXdrT/H5cpwj59Nb9z5XGGOeDmDcnEXqMypGg+Jv5RATnm99zMAYwAa0SSlJMgzWR2mkKBGCDykqSayBE2vkKCGCXWolSeXspm4zs0oYJYZgHhm1oLX0qR0EJ32iBtz4tA4QpU8icEH69ArQP5wTAgfJDwxkJV+rdQKLJaUk3SiJXgLugE0AthK8llx69GBRYnNzCeQcEP6zbW/Ao6TnA11hxkp+/nE2jf7Qf31zeUH8VGKpmq4M0EO3U4dmM6vpmnraTIvBs3Q7r4mWbvNd4jWK7/v9w/ZNh3V3z3XTxNXP3293fZLif4L3Xw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_42"><mxGeometry x="30" y="49" width="24" height="6" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_52" style="vsdxID=68;fillColor=#2d5967;gradientColor=none;shape=stencil(lVjbVhsxDPyavOrYlq/PtP0PTgklpxQ4Adrw99WStS3Psht4WxzLI0ujkcyOr57vrp/2O2eeX46Pv/f/Djcvdzv+tnPu8HC3Px5e5GvH33d8dft43P86Pr4+3Jz/frqedk5ffx7/TiecznY+ki2TlTNv5xWO5Oz7yo+zwc/X49nCziaepl/fTWyzCfm8dHLzLkc8b5pXONFsduJ5jyEf503zEmcyaQudAwU7oqtjKjpb4jTCi9sxjvguU8wjfjBkNm/vApU84ofQwCq+85TziB8thQL4chc/4sdEiS/gZ4h+LFQK4EdiO+InV/Pa8RMZN+InT+w1/v3hQdHFDFQpjrzfctaS5dHXEshAruQQcLWkTqfKC8o8emqNWfeTDY2sznZeWKOV63UwL2XuhKm0kiU/+poDuQC+yhKkNcdquIZfKEBaiyEH+BOHC8TKtWo8NQ6P4H3LCvhEYKgpfWwlsJQZcFq7WAnsKcUvXj4KW+OIr8Na8RNlIIpOUcUvZAEeUj8ypYgAVqX4kFjo7EROYIrma41MpgwCpKkPHNap8hvlJzVceHB2Ua/obuKucbadgrmVYywQK5nRV9mCYn1RrFIgi2KlZLCDG0isltSKL5IOYnVRrKMIPAiQbgOuUdbD5XVLqWBlIdYXm1WQAI3wqgn2qyYoK91OKzp38nPbNTbqkSvaQov3mquOAtSgAUctOaA0UMSX3hv5E5g+L7gJmD7VeljFVAPMR5hjUD4x7nzZYByoouqpjV5z3a+xNFUa9SpJVJCl4gm2dNuoo+TXQZVKEZqwiS+iA1WacusILf2FEqQ/myZyjaexlVfTXzl+k3lMIYzwoutV5xq86VJS4X1rG4oNQMCpRWxqlGfyEH3xGCRq0gPsPbaGtTf+3IWMMZDr8yyUneQLu4nMHSWM8CLiBmckJge3FwF0m9yTuQfgJzX0AK/ajhoGIPXs24D51tmQL03zHpqp0AHHHhHNCNSb6ADX92o+qUv5QoOQ5DvA9zJgw/2FVXGEn7oIwi/Fr+9aF10ovMkE5p7gF9wTH60f4SXUjcZKGjfRMwXsjl2K9NgH6LklrcmObU8Q1Zzd5sgdpe6h8CQeBipP6JiBexIQx4Af+mCslGgTPi4angRkobppMZvIXRfXXz6kFqo/9pVPtAn56K/228P9/fnRr3/HV74snf9DwN//Aw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_42"><mxGeometry x="21" y="16" width="41" height="36" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_53" style="vsdxID=69;fillColor=#2d5967;gradientColor=none;shape=stencil(jVLbDoIwDP2avZKtDRKfEf/DyJBFBDJA4e9lKYatBMNbL+fs9HQVmHblrdUCZNfb5qk/Ju9LgRcBYOpSW9PPkcBMYFo0Vj9sM9Q55e3NIV30at7uhZF4sXQUkBOlSlJ+Jex9sARW1E6S6KQWggoZcgRWmGBDGpFjMBhjR3aFLwWACM+hrD/aUpKhaMw0/0p6Cj9R5pO59EfCEHHII3PoL22rMPFd73lk/1mZ+vDfz8F6NIWpKro5v8+PbC7RgWL2BQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_42"><mxGeometry x="37" y="35" width="8" height="8" as="geometry"/></mxCell><mxCell id="hmm-overview_v_54" value="<b>Vault / Secrets</b><br>DB·OCI 자격증명<br><font color="#5B5652">Git 외부 관리</font>" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#D4CFCA;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="420" y="642" width="160" height="76" as="geometry"/></mxCell><mxCell id="hmm-overview_oci_55" value="" style="group" vertex="1" connectable="0" parent="1"><mxGeometry x="330" y="800" width="114" height="90" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_56" value="" style="group" vertex="1" connectable="0" parent="hmm-overview_oci_55"><mxGeometry width="114" height="109" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_57" style="vsdxID=70;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_56"><mxGeometry x="15" width="84" height="84" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_58" style="vsdxID=71;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_57"><mxGeometry width="84" height="84" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_59" style="vsdxID=72;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZPRDoIwDEW/Zq9LWUHCs+J/EAVZRCATFP/eYYdsAzW+td2922mzMtxey6zNmYBrp5pzfpfHrmS4Y0LIusyV7HTEMGW4LRqVn1TT10fK22xUjtGluY03DOSLOEajScCDCknC482rsif9oVdkCEggeIjGEfgWGASVwChMmsQchVGgqzBpEvLQfrWStUUJDuKb+QMhuHgz8ERnteDyTnDWVBzcVTiNvnFnCN/o9Cyi2CUEFy8Ab3xWB+hLfOJVxFnuI3+AnA1L6kEsG/HJB1zOxkNfBf39Hf/V62D++4WsKlod+9zfFV2iPcP0CQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_58"><mxGeometry x="1" y="1" width="82" height="82" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_60" style="vsdxID=73;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lZXRdoIwDIafprc9aUMpvXb6Hp6JgzMmHsSNvf1gLbQNCHpX4h/88iehDHe34njNmYRb29Sf+U95aguGb0zK8lLkTdn2J4Z7hrtz3eQfTX2/nOzz9Tgoh9NX/T28obN5BjmqIUvCr41Ijtl/4GD17/fGJgiXoXhiXIYgKdBJJ9IcR5ELJVy6SIdzkQulPMHwz6vyEsIGCRN+JlZpgxRfgFEEN6jJV5ClhDfwCqlqEbgvR8S8VE95e5c0wdU8lTFu77cmtIprEdMGIs+v9GPYIGG5GZQ1SBCzHstZPXI2LDhzCZdnkIzB5sy+qt/aCXihxbBuWaZiyyD2C6hZdAghdmp9YSAi21wWYHTyREInb+J3EQHANro5Sh41R8U7TeQLGy2Ih56BQgXbPJWCVPPcenj9c9thDNcp/U5O3Ry5Um5EjErsXPjorLu5Nrr9wV8E57Kq7D0S/k4vjj5kLx3c/wE=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_58"><mxGeometry width="84" height="84" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_61" style="vsdxID=74;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_57"><mxGeometry x="13" y="19" width="56" height="54" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_62" style="vsdxID=75;fillColor=#2d5967;gradientColor=none;shape=stencil(lZPLDoMgEEW/hi2BoVZdW/sfJmIhpWJQ+/j7QklTH5Hibpg598IAg1jRi6rjCEg/GH3lD1kPArETApCt4EYONkKsRKxotOEXo8e29uuucqSLbvruHJ5ed8xwmjgVkJfPUIoh/2TOXqBkOxFkKZ7zhxzTAL/ewDrQbZ7Z7ffwFPadZ+3/p+HdNxQhmL/Bgibb1hBNkhmYxHtSEmCXfYXYbzHmDPE3ECJt8PvmjVTKT8m0vhwLm/Ijxco3);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_61"><mxGeometry x="27" width="28" height="25" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_63" style="vsdxID=76;fillColor=#2d5967;gradientColor=none;shape=stencil(lVTRcoMgEPwaXpnjiEWf0/Q/Mo2pTK1miGnj31cC6gEjTd9g3XN3jwMm99fmeKkZwnUw/Wf9o09Dw+QrQ9RdUxs9TCsmD0zuz72pP0x/605ufzlapl199d/2D3dXV4AtQRjdVgiO1QN5c+z3m3F04QgKeKV8iYhr4I4OKhX3yOgRLLndP0gyIXlkV3GRVSclqx/xEopTi6sfEYovuWXE2FDGioMMpclPvYzAGRkxtScT0rOxSYlI24mpQ0xPZiN3cuCt7v4xHtlhgmxDkRdlGArCQBCGIQVzmChLkRWEUEwpvos7SCzNHQT4o3+QFSUqy3WBKOcCLENDrMmY81TWlT53W3ClomtCrIUd38oaSGbnJGBOi/X1Oeu2dY8X/R6/VhPkXjp5+AU=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_61"><mxGeometry x="15" y="29" width="24" height="25" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_64" style="vsdxID=77;fillColor=#2d5967;gradientColor=none;shape=stencil(lZLLDoMgEEW/ZraEh624tvY/TMRCSsEgff19oaSpNqnK7jJz7mQmXGD1KNtBAMWjd/Ys7qrzEtgBKFVGCqd8UMAaYHVvnTg5ezVdeg9tJKO62Fuc8Ei+okJ7Fl0UP1OFFohU78oxGbQyEwMnqNzNDLxECzzhiObw2QttMKydjP9PxzOQ4AX009wEZy2xAgfx/d5eaZ3SMe3/xiGUUpRY8wI=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_61"><mxGeometry width="27" height="25" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_65" style="vsdxID=78;fillColor=#2d5967;gradientColor=none;shape=stencil(pZRRc4IwDMc/TV97bUIFn51+D09x9MbAq7jpt7csDNp0sO18S9Jfwj8JF4GbS7U/lwLUpXPtW/lpj10l8EUA2KYqne28JXArcHNqXfnq2mtzJP+878neem8/+go3ylsbmZs+C9SdIlqpL39HeG2bAM8kLNKHq6Pqmp5hgHVMqxtQYHDvg7vOZV4MBMYEjnqhmNenInELjYxK/o8mEnjTU4JO2/rutIg7nyaD6WLwD5v5dZHx3pHTmdT5fPUE958zZmkIQYYeUwqMp5Cx9a+k1vEYgh8OOfTzHFaxTk5znR4ALjSQMSkzTGvQDSYQzkyJa5VPLeFJ3BvTWTjZuqarEr7zM+JDdIJw+wA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_57"><mxGeometry x="2" y="10" width="80" height="72" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_66" style="vsdxID=79;fillColor=#2d5967;gradientColor=none;shape=stencil(nZLbDoIwDEC/Zq9ktILwjPAfRIYsIiMDFP9eli5hw1v0re1Ol5O2DLOhKXvBgA+jVmdxk9XYMDwwANk1QstxiRjmDLNaaXHSauoqyvvSkCa6qKv5Yaa+kHPTA/zu5wXBrewc+G80SoIYXPg4abIIfdymsA+ilEoz2JIlwGuYkdJdAJEF0AVeuqWxJ8c/iaWJb8Z9q3V88GyOWwbfTMPX+2klX+AlWDdfy7alw3Hft5eylOjKMH8A);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_57"><mxGeometry x="2" y="2" width="80" height="5" as="geometry"/></mxCell><mxCell id="hmm-overview_v_67" value="<b>Object Storage</b><br>HR 규정 PDF 원본<br>파일명·생성일 메타데이터" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#D4CFCA;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="445" y="804" width="180" height="82" as="geometry"/></mxCell><mxCell id="hmm-overview_oci_68" value="" style="group" vertex="1" connectable="0" parent="1"><mxGeometry x="805" y="225" width="103.99999999999994" height="90" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_69" style="vsdxID=21;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_oci_68"><mxGeometry x="10" width="84" height="73" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_70" style="vsdxID=22;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lVbbVhsxDPyafdWxJF+fKfwHB0Kzp2nCCaGFv6/T9VXZC7xtHMkjj8ZjDXz3tn983Q2k3i7n06/d3/H5sh/4x0A0Hve783iJXwPfD3z3cjrvfp5P78fn6ffr4zXy+vX79Oe6w8eUpy1YvGaR+pxWUKn/vx+m8Kf38xSPKUGB0ikB+wz1QdMCM9iQYtJSCEAuRfG0RAEUpai0FDwos4ZOBN736MEC6x4fAzgBHyuyPXwTlNG7gx/GY8NTEz0tGA2Wl+PVt4KB+h4YBcGv8aDAm54GjRBMT4MB7llgDWgECwQUehp4tf/I4FwP3TSydECDF+DkwMgWGCDTg8eikx6X8GO7scfHRlsZTAEK/Fh4EAI0lfdcEYK2qwJ0wCzgFegg4EORW1EgOHF6jtQLAeaYBfCYYQV4s229fLSNXcj4MnbUDm5ia2DaxNZg+JvgtlrFMngUmMQuuszYHlgozsHqTWvuVYZmQCG36KJenLsRRQIyBCgavmI40TIo++xMsCzTEihhjKpskMu0kRBhjNEjhC07yleg3goGvXopY44VptBctwTlGJR4FbD4YoVnMIKlaBOJuCX4iCXfJFMcsuBrcBLfFUIK/owpbL1KHsHI4/viqxnfu2q12SeiJIRKggLre3wqe80qpc0oCUavJGC1UGFF82+f6l8zXaqe396Uq5kTCs3zCVEYfT06i2eB8PYEWO4Liob7KFvfE24RHIqG18RMeI36uuDanelWyiv4XM+yhN/z1Wakk24ZaJuChXUtC1ZllCoWakHUaznPJtW+NzzUhOr4Gf32zTbRV0W76mTJt+Mq9zGzVG2Ot/GjjsYv4+EwTdbt/3KUjkvTGM73/wA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_69"><mxGeometry width="82" height="71" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_71" style="vsdxID=23;fillColor=#FFFFFF;gradientColor=none;shape=stencil(pVnJchs5DP0aXVkkwfWc5T9SiTNWjWOnFCdx/n6g6eb2oCbtyk2iAD4S2wOoE737cf/p+93J6h/Pl6d/736fvzzfn+j9ydrz4/3d5fzMn0704UTvvj5d7v65PP18/LJ9//7pKnn99O3p13WHl03PkzJXJav/bAtWUfp/4eMm/vnnZZM32+9BK+92DQMq+sXuQlEZvwvtS7yyq73QvqKVC7vQvmScimGGzjopjujGKwfw0SidRngTlMmAb1TIgB9UiFN8q4wB/Ciuz1KZAD+pZACflPeAn1f3ZwEP+FWn4ievCPAtg8URPyXlaMS3Wdnc4z+cH7tgSfxz8di2QiV8bspnNs0YXQ7DCxScCjQqVO/eVjDK2FHBlFsdmDBzAI8W9EZlMKBVCeKX495iAEsHNqnjAKqhYeTOLYCq4Sb4MoCDPrZVL14jIJnpaTsVUy0e4njakJWG07IjtR9PG0iEW0bnIr7nAybADwLfs7cy4HdJuYO5oBxYq0kd4DvdComRO+9gxJdF/O6ULbcwWpb356zNUO56y5bcNspCueu9RFKKDvw/BkyvAWxxW17Z+CZxB7trFafh2Liq+EdST1QWSh9BIBpSwY2GIFPY4QCZScZCIpAWvMP04bHuJlF3WSoDvg2LosUkkyEQbbXWLBD44BF4h8E0JCKbhKb4fA2kPWl6toiJAN9KazE1ux1uX4WO3N5VYyP2LeBcXtbg1OrJa8G75D4Gdwr5XmI7hWy/guaeJSyhY20sOmzsdSjXqlGLz6LV4NzygO4FUbmovB3R2VlhBOf6jDzFK/a4MvQKOw4cdiWP+wtisYLYZDzf4BUraKVroAlkbp911XBDf+4aa2wrE4b3oqTOhLl+mb8QXjQ618YNwkerDMzF/Ao5K9tUDnAD0RNLiB0njkfaFKxJvg0yhTVrMHdJiz1LkXl9vei2nXQMElsWqyU4NQo+BpfN7Q1w23j0leBWziYS/MrPWKZlZ2tlpVzwc26DQ1miNnE1MsxYK+vE0/jZ1d6pprQvoXuE70S0W9ko9p1H6w9wLmRmxfZgZXqe98DtJG/PozOQlBMkxa6AauY1XH0sDHooCh77iKmwh3Zv1U3O5a+etH+nkGqVOA6zqlJCXJIiN1gBE0zOI+xUgxmW1Lz/JTkOdfHbiqp4/dB6BL8xDBWZoxATzXfbtPBlllVNphfPgcm97d4hKEKz33h1ofoQUuG7tyGSUnTgdpibO439PHZBQKlrcg3q1ANn6SjvG0cW43CDAAd2OC7Ao4htw0Jt04ybKHD1GjPBzSdDtmuKb0JI2MY4NzV6Da5XPhzJ/XGYBAXdqGBPLujGhbyFFnNholsKs+LYR0NVmKZFCiriUCifsviikJQmihY9cpuJ9WD1OMI6Bt9i5eNM/0h2PJOyFCHne+gwRVbS6HEzz+Hy/Fykl0/N8qWu6fQvdTgAsRTWvP49r43c87e3/lWt0jxO/FxVDHhXC+P2M0Th+WNTLSYO/tD+S/h6fnjY/orof8f/Hnhp+9+CPvwH);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_69"><mxGeometry width="84" height="73" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_72" style="vsdxID=24;fillColor=#2d5967;gradientColor=none;shape=stencil(pVrbctw2DP2afdWIN5B8TtP/yDRO7alrZxyndf6+2llRBHGw4O70zVEgHhDAwU17Cp9+PH75/nDy64/3t9e/Hv59+vr+eAq/nbx/enl8eHt63/46hc+n8Onb69vDn2+vP1++Xv79/ctZ8vzX36//nE/4uLwXl5DOL/n11/6gLPny5PeL/PPTC5N3tFT6fy+ksHjjhfUu4eX8X1x+Fdr88fPtcl/X3ih5f2N/EvcTPvx+RD9zfxJiU2L9CPu1XL/W/iisQlUJ7cIioH3tB+9YLo3YPiN2WmIcsSfAtCQ/Irs6wh5m911XAdvU+NVNYMNuqoc6wtZ+qu9WE+aucOMQllXcuE78HJgb251XAZ0Xl6fQZYllhM6LiRx9P7ZZAq4dmW38EcsCO/mlhBF7tZATM5Pj8j22NzqRgBWYTOIWTHLLWk1MKl2rpsaImV2PzxZcwQLNjH2MXMLG2YN/XVwkNtrYme7dsIOATsBi2sKzCOgkoQlDy5Fp69J907HltbmUhS0ZZV+bkE9lEcipLkkgg72V+Io2n5SojoAcIMYQGT09QY7MQdeQY1xcGJEJUmdkJGnWXm3sLe9UByEu42zLciQKxhbiEj74nmzCIWUnb56XG34cwb0SaGD1zRpw9WRf3XuoGy5Lu7st1gS5vcNSyax4KGRhO6SYUrS2gip8HjxY3WGkh0nAFdkghAwu34q/wN4Kjoy33tW1J3aXNm8Dx7YxM77JPkUFyNAGTl4oLAh2lepiARSp0UQ+w/nRNNFWKMjd9QKrardoRKiRfYO7fTB/AbzsRbPvTBfL+1rSsVdISaFr2t+jzER6vGgC1UO5fjYvJEd/aqmexpkmZEOUlZxdbzLPJiCWdTyxanWT6rT2AnOkJLvzJmiQlDFnC/aDTS19YwrNIot5GSKQQNeeHR0euyMVHPG2MiVrR8nQLwRnEbKCrc4V0tYXR6RNX2mswjJJq0AF9JXGcjNwpaXjx7Z6g1OSzyMyp88xNhkxPmHbyE23juzZeikrYCtk3eDtQgNZcV8I6NKp7w926WQfX6G0zubmAm1AxBaE10d/2HUWE13kWkywtsrhsY29EcabhOwlNn+1NiRbBEpgq+k6h1hV7voqI1EU+tI6zTY0Ay/MDA6PbTsFVi4OY43INcAkaBW3yih5UxDeyaGp+MhQYk32/kQWFRiicbqgCGGWMe/RLQM8TTs5Ub+rM5Vl8m2PJUahLNZnlWDgZpW3eb1YqJwMDRXrqDL4Ht47poE+rYRR5Nrsh0mgH9oGHtwkVdyeeVxx2Lf2yGdmyz77yfRzOCSgSNCcLCK+ym4UYh4mxQrkDwXIz+/TLAexoVgp2MM5rkQC7r8CiyDmNTkrQnQEuXOHvQjukwPuJiLrTA34DLsJwBezKsxJ05Y0ZljJ9ne4wllwiUtdt9cMPuC6UoH3WFTjCqESYKFhtStcvEnPtvZY1KLIdkHZtilLLzAUjDLgp9qTpMODW87DsqDAJ8VSNNk0Rki5jZcHtuKkCptG/ECTzAqTlC7GIaFw5ZUcrH7A6slNNo1Ky+dkylXSfcIOSklkcocB4Ya5JMpvUyKJxaKwAhtNqwVgL+yXKRM1IxiJVlzHYqtHAfwj96FkfutIAZbQx5l97y4TPfkRlnAZSWZIKsPhcWbDwAQvb0u4f532hnw10HtD2dEzM7ZH846LJptnpeciJf9g+qM85yFNvhsqPCRYeys8JMx9Cg9nV1d4SAJb8hB7ceQheHvCwzzZkCs8zDifKjzM9ST9I3m4i9weG1kkKmWplQkIAZ+To7kVng9Xd78wG9+K/cUX+Vlw6lUIWvD7jMLRMmu8FUcUmRCRoQV/0IAULbPcpHC0KI03krSIxKgwdHpxhaIFuwTJ0qKUaaDp6PEJR+tsL6KQtOJWk3fFbYpL2ngieVrlsgMiFLcLVflGnyFJVFk1lfFVXn7GPsu0M+ntj/7DrW9Pz8+X333x/5c/9NoeXX4kFj7/Bw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_69"><mxGeometry x="1" y="1" width="80" height="69" as="geometry"/></mxCell><mxCell id="hmm-overview_v_73" value="" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C74634;strokeWidth=2;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="905" y="220" width="270" height="690" as="geometry"/></mxCell><mxCell id="hmm-overview_v_74" value="<b>Autonomous Database · HMMAIPOC</b>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=14;fontStyle=1;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="920" y="238" width="238" height="40" as="geometry"/></mxCell><mxCell id="hmm-overview_v_75" value="<b>MCP Tool 계약</b><br>BACKOFFICE_MCP_TOOLS<br><font color="#AE562C">시작 시 USER_AI_AGENT_TOOLS.ENABLED 검증</font>" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFF7F2;strokeColor=#AE562C;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="925" y="294" width="230" height="72" as="geometry"/></mxCell><mxCell id="hmm-overview_v_76" value="<b>ADB Agent Tools</b><br>resolve_hr_term<br>search_hr_policy<br><font color="#5B5652">DBMS_CLOUD_AI_AGENT.RUN_TOOL</font>" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FCFBFA;strokeColor=#D4CFCA;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="925" y="382" width="230" height="78" as="geometry"/></mxCell><mxCell id="hmm-overview_v_77" value="<b>search_hr_data · SELECT_AI</b><br>ADMIN: SHOWSQL 생성/검증<br>CB_ORDS: 읽기 전용 SQL 실행" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#F4F8FA;strokeColor=#2F6F8F;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="925" y="475" width="230" height="80" as="geometry"/></mxCell><mxCell id="hmm-overview_v_78" value="<b>Bearer → Secure Context → VPD</b><br>HMM_ACCESS_CTX<br>HMM_LEAVE_SCOPE_POLICY<br><font color="#C74634">SELF · MANAGED_TEAM · ALL</font>" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFF7F2;strokeColor=#C74634;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="925" y="570" width="230" height="92" as="geometry"/></mxCell><mxCell id="hmm-overview_v_79" value="<b>HMM HR 정형 데이터</b><br>직원·팀·휴가·근태<br>역할·그룹·권한·Token hash" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FCFBFA;strokeColor=#D4CFCA;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="925" y="678" width="230" height="72" as="geometry"/></mxCell><mxCell id="hmm-overview_v_80" value="<b>정책 지식</b><br>Abstract · Tag · Chunk · Embed 4 Vector" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FCFBFA;strokeColor=#D4CFCA;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="925" y="765" width="230" height="62" as="geometry"/></mxCell><mxCell id="hmm-overview_v_81" value="<b>Federation View</b><br>HMM_RDS_*_V · 선사 배정 View" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FCFBFA;strokeColor=#D4CFCA;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="925" y="842" width="230" height="52" as="geometry"/></mxCell><mxCell id="hmm-overview_v_82" value="" style="rounded=1;arcSize=7;whiteSpace=wrap;html=1;fillColor=#F5F4F2;strokeColor=#9E9892;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="1235" y="165" width="240" height="300" as="geometry"/></mxCell><mxCell id="hmm-overview_v_83" value="<b>OCI Region · us-chicago-1</b>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=13;fontStyle=0;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="1249" y="173" width="212" height="26" as="geometry"/></mxCell><mxCell id="hmm-overview_oci_84" value="" style="group" vertex="1" connectable="0" parent="1"><mxGeometry x="1260" y="220" width="99.00000000000027" height="90" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_85" style="vsdxID=154;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_oci_84"><mxGeometry x="10" width="78" height="84" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_86" style="vsdxID=155;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lVfbUhsxDP2avGp8vzxT+h9MCSVTSpgQWvj7arvri86y3uFt48g+knx0JB/szevj3cvxYNTr9XL+dfx7ur8+Huy3gzGn58fj5XTlr4O9Pdibh/Pl+PNyfnu+n3+/3E2W09fv85/phPd5n1fkpk1GfcwLWqn/v7/P1j/eLrO5nv92kXRYNmi5Q72bxcZSLocuSzlRTIuVXaw0xbhYLUs5UDIjdJtJJYmeHdkk8W0ipQFfk5HwbGSShE+xOLnAP52eu1QZRcaIXMVELo381ewJZCup6snim/YE3iZNDtzVhrQFd6vVBnqiDNjduQuUpxAAXK1SRV5LaA7cuGHgq3uKgZST2EoCR0vWS2QFsGonYiUxQyz305JNFqgZHHm/F3Aw5POwLih5AGeoKMEDuQjgioKT4EyZLMF9JoEtadnZ18JSQ1Z2bhTvVQmvFXELqJRVpqD3EsVlZYeJWjPDBtIADsywjDMkhmX/wxeIYSIFi8Sofi0rnIKQMV7jJLIx5IbxdgVWwNlZqIRU3SngOpNFCdCUgkRvVlvZ5mu0Er4/uYBF8gaCZxWA4HljAMXkrEWRd0nNXoirjJmxwscVOROt9T2BYnKWIVtcBV46a0kPy6JvW4U2lAHbcYvKEltJYO6oqNTDjupt1YkPydaq0YFAo3XtRBWVG+wX42WBcqBZXRqLQBmCssgrYrCNQWIainqgWYpUgS51NHI1MYKWrvYELVXEjRT09ZMy4i6fYO7YLSMeHwD+kyqaJhHoLX2ptxnHgb7vaghPT9lA+J04lVgVyCarnIWhq9k05dxREAXayWJsPESeVlNEL+rbkXMl6+EckX2dWCp+Jo2Z5/4A+skdzWLmW0P+aCKhBhNfv6O24jBsNL0rpc5YEDBhvi7VSUC3sLYTxqWmh/BrpvB8g60OiRICZRR7JErgIcR+iSjR1H41IEr0FPeJEmORt63AHSlQ0cgeY971atRWJayRQDSrLYFyrYPr9cltrg+gpr2Tti6t5+1tkjJxshwAOQA1rKppmgVvM4/WcFkTI6HVMbsTXJavb6D+GWeH2eoaWuNthE7LfTGAnLaXZuu1MI/B81Wmau+xyx/tnfxwenqan9n9//iu5qX5TW5v/wE=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_85"><mxGeometry x="1" y="1" width="74" height="82" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_87" style="vsdxID=156;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lVnLchw3DPyavbL4fpwd5z9csRypokguWU6kvw82OyQwjRlSvsk0OU0AjQbAvYRPP+6/fL+7ePvj9eX5r7t/H76+3l/CbxfvH57u714eXumvS/h8CZ++Pb/c/fny/PPp6+3f379cd17/+vv5n+sX3m7nYjO1XE95+35b8SbU/xd+v+3/4+fL7YC7/X/yJubthIMj9s1vm5IJ255tJZiwrbyFbU8xoUP3JePDFLuZlvbYxeQ9dLam1T22oyUAp13e7cFdND5J9MeHJ+Gp0oyte0/FxXWrNbWCqzz7YbtdDezQbck79uh2u5qNTfsL864z/GpyAHynYtWcieAwecsNrAWTIuCv7G/JZA/42Tiwv2WTE+BXkwBebNqWgjPOT+HFmW0pBFMQXlyyc5UuubR+7voGdodmIgJb49oeOFod96qyhHbVfE5UeWKQvbrpba2J4KnsjEeigJtoS8lLP+Vg3NxVmiU5jVybsCSXkTgTmhRrbPlFmhRvMuJrmhS65dr+kk3LU3yRfx2/9gizStASsIUUqQJPD1SCd52pRFCCLr/c8S1ride3DGMpIf7KfjrjG+BnU/weX+7yelfQuxg/tvNskSVl+NBPdYXSqeP2C9dmAjiMPpzhws2PYiuKIJQhIpqdxotqq417eKJwQ3ivqkorKl5U/jPiF1AXxI/kduCr/HKXsqjUTd6y4/uu4R+3n6S0AF+kY7uGjxLS4SlGCaoKfaqL3DtnUJyIq7dDGd4Hv/b3VQeixwP7PgMNdCTgEGDitUt7A10a6isEAfzrvGng37HpDN1qdP5uR+o5JcXAgXfTKHkiF+emB1UKSjQJpNiPlQHuTIPEEpt6IWpmymtxoid6Hq3koJWqAjmOFGLDM2J7U6Zez8MAUYATaCBRGiSYpCiB4TJ+3OyGXaO2p6g8gX3IWc3gm3BWogQJm/zY1EXh3FdzZM2QkFTya4ZQ4xcBWTMkjH79wxQhT3hUHkURMrIuzaZzrc3AiynQphwMEzKW58PEgSwshwnSm+QAXw8TpF12PUyQKLq8MH/PUanUG1LoZeiMKVwBWNp6SX5jRmJO0ViKVVJXqdWkSuUvgooGFaxYuJIP5mKs5IQeYNOhq9Yj/eoJwE4ty0OXumUWzAoc3U4LlfckMQkoEPrKWUBLp8hATqZFCCh1J3tsYg7EU+zhhEgT9ukifrUoTtNFF3HXVFd7UMTRUQe56qY60dixDj45hBkFyqr4BH666Kzzvdacmaz6eB9VfCwgl9HMdWS7h12O+XaPGaJBJ6vJgZjkl/aSNOSpvXFUvI5NpM4AnlUbHp2q2ULaWXLsjl/wGMUHtkSoi8tyzPktDcVbGMT9hVv5iRoVO+9nFS9yGPl0wgtqvTw4CXixaueAFgcjveYFTfSlrOzlTvfU1ThP0/CMvZzI0t7dud4jcu6TkoJS8a4zb9M8AqGWX+Y6XRHfquccodtifAgTYoYx7Y9xuvTnlTNZF0f4Parpec5DrWxRvb9cn8ZALGnqjFOlpnIVIY9bVe8fsuyNXsvu0ZMdj5tDqu20mCZuS7lJgXKasqloeVUvP5TOMf6i5TSVWLRc+LSnYhh6NfAtvs/SpgCOp8C7nSSBhImnokGt+UOVfk6XnOXn9AKBOsgsGvMrhGqZWfLB9jyz5BMgZ9ZIf44NUmWpKxT1AuGSgoWsHKLGDcRbwD0fFFM+wKNxQsPF9Zg6cW34soAQKSuMm0R3fHE6cDztchHwKWKQJ1Q742Q8lidOirO6cOBppauMU+2/NOv8B4ADh/EY/XGmkMp2ZTxlCg3J+IyimEIzcp43vkgValYSvF0dUIWaj1iWllMPaueWCxKct93y9w4uiAmm1AON4F3nj+kNIi+/zIIETKVLemCq/MGR5+bJlCI1ePsqjjWqAghtH+ODhdtSmfBQAJLBd2xdfsIiVFTXEtY+g6MKFUgs+1B0D+Zje+6jxbBLf/Av5d8eHh9vP7TL/8df1mnp9qt8+Pwf);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_85"><mxGeometry width="78" height="84" as="geometry"/></mxCell><mxCell id="hmm-overview_ociPart_88" style="vsdxID=157;fillColor=#2d5967;gradientColor=none;shape=stencil(lVvZkh01DP2aeXW1l7bdzwH+g4KETBESagiQ/D26TFtSH3npeZvcyFeLtRxJvk/x3V8ff/7z/VPY/vr68uX39/8+//r141P84SmE588f3788f6W/nuKPT/Hdhy8v7397+fL3519f//3nzw/Kx19/fPnn8Q3fXs8dmzv2x6mwfX/9JHsXj/8/+en1wKfnz9MDaXP75cAvf7+8svDnkeh8O+L5jH/95Fs4iXa3lZPo/CgezjeqeFJll+JJdX4Ui8thyr66HK/s4+5yAv6HKxH4k9wF+Cuqxn9zaZ/yV2fOj0JxJQB/JeX5Udhd2Jf6h+hCmfIPbgPz+8NFsH8lZlf2mujkVTdXV+yv7pLpRPve82uji1N5yQHb5bC8G3tQk5e+eN+vApNt0lXevQj3dl3uyDPuexQLnx9tV84pu71eOW9Xtim4N3IlV09wR0qb5o/VxXxlfLgMHvIImnpl7oOrkyvy1R3+ckUk7u5n4vrkdjASeUu9iktxCWZSNGyXcBh/KlNTeU4KHE27A+fYIJCKOyCQtytXCuI8zWHblSWlhgQBrORq97W7eqz0pfRVp+GQXM7AXOVFdv0IzFWGbcHrAsQu0cRL6ro6hjrAkenTNHRFDBXMEeJHFGrSBxeXjpGjy3OnNI6R6QIghsAzMoVUeJp5RvFum+oMnlHYfyeeUbILaaVwIftPC9vuUgXmBxdnzutyie0TquDAnPLrka/chWpkblIU7K2/uemehSpYIRt/lYKa9hyz/aRFMdDsxQdKGB/QefGUtjo/tW+0wOEgcIRZ+eBazlmZ0mO+amhLwlHcFqeBnzgqvguU2CDyU3EeLthvUI/2rcWt1ISTZuRaVDKAt3zryWaX9MaKK/ka7+q2442aa9DgrUlb7Hp3oOE9M2v8HzkLPBszLmQ9AhbNWAPPQnn1EY/uK5GowFOwVGOItUwENbLZVShCfSKAVwAwVc9BxOyrKwXsxVQjgOkdYBf9xSom4LaUjAJvC+aBlfKHyh3N+Cq9Ykyw6VWejkhzN/fLiea5qp4EK1/zXFWXxppTwatTJEQmLQfwV5W08VehLJFTod7qtk4i522NoDlwbTUpE+RrYJHf5jkYV4hXfB2Rl04xgamwdev0AjW0DDLiLyBcuXYGC+9d184QWZRSM2YibB2vFtYn2CXmJYsE9mCwzOhfBKZuAyGYwmmRDyYABXRw4hGUzSrIyzYfyEtHAsp7cGP3TeDSARdMoblDCGn27aPYbqZv4LVHvvnA1edV2b/pcklVNW+dOTBVhKAWSQR02NoXWzLq6kdQNV9juqzasRAEiHm+mwIhoqkC3zPkIM09DhwIQJ1yDPbQPJ3GUM8TylVeyVti38gZWjUpGcpVUi2uBM0MXOgTUARH8qqyLbU9r+WlRIXjEAtCjTuCuEv3vbq7V8MTNvd8OOh3Nut4OOiLGfYQ7I5Yv20XseyudR/h+QxfdLBUwVJFpsKESVRnnPb9V9XmU/fUWuhRU+IZ23xXLgL+EA5O+jwQKFylOOAqYyAeCRww+oEEUbjDawG3uUkJIw4JAtS3T0YJhSL4qt9jJAf5L24MnJt++45okqyL9Su38Ls5CVtiMN8pYBaDkZNHHFbagqujR3UvaSLwOt7efAAKmCo0rPFWZyZJKo2LlSJOgWz35gWhjTMW3dE2n5epVChBjpAi2W4obA4upJPfiahM7Gvz+3q+Z+WNPJkQeVXZGmdAXQ8FA2wTgYO6hvM7GG2MK36CChptv6epJCkFmA50Sj6lmBAnFl475JsPQJ9SzMpi5XO6A/HWmaVPwfn9o7Bhn6KoIlPFiUks7iYbpmmMakQteTfBhKWDu6NFFcR+x50Y+hAshdS8YuCldiQEHqecv5lXNWuyMeFAkjasQkybEDVtGBTpwPOekT+ojtDzmbiUt7Ny67Stxh1B3rX/Xh0+qwyEFfcNfSY1s5Czkhl8KyJJWQlmk0vuUZVTGVgmKLrRtuUCPoQ/NTjAHhCN4W4vV1CTcLclP1WDwDraC04bz4Vx0SFFXHuXh2SjqaK9+rv8cxIM6K1mMuMqyF9ZqfFXu9Sb5s927aGvNbCQuGXSLjJW3zifSV2rWLkGl57n3sSU+ojHM3qcvGOLqqjG42TDHzQsnDO/sysd83m9OuLxjFxJcSCvJoqGaITZDfejrROE+47T77Lx2JC5q7ZCBr47dJCmX4HaG9yWr9aaNkSaA0bFqFYr0Vu8FRtvygoK42K8G/OahnO1DTEt7Q337bTUnW1Ip6WuZoK1xNO1A0/twrwmM0DrbMyzWcou+it94rQ4DsU7yxsT7XZpXjsDNDuQenu030hPkM8SwulAUTx3iOwqlOuQuP3iPQW5OaAFTdX2FBa+LfkfUYYF8gAL13OdBZWGxNFS3X07cljAEANvo5l/NCMN/cpkrD/hkTRNIIeXnZ4gKHz/tpk9MoETD2itqnlO5K+qcwe3169fxsh6EvtFJWS0zndX+14+oMjB5awdRwT7ToFidYfeLCyXwza+pT3T+QixsjTCM/2N90N8r8MVBj5qMHLWn+aqIzzKG1qpT+YZyi47Ac63xrzUNgWYBqyYdxoRGeLNOi0182/cd37bwZ3W6q3irl6tyrsYhGqdBaFPZnjT0Z6o6hQMa7PK4GED59I3FCxVtDd/l3+SV6PeKiZ9IGJxb5Fqsr7tV+vOpOLR88X6dR9a7a7Mao++B3OlZaDAWImHXw1IreqGOiEzmoC+beeY9lFJZmvfL5r8kGFSsx8vSwGVdGq2nn7fZd9ZC+l8KHN1w7+YLs9n3p/eztpqfKeMj1mtt5dStWWsP1Wt+ZrSq2QgRRMfrXv1QkCKNia2zus+Ke23r1+jgdZUyQuQYGUc+t5SebvyjGq5zY4fUHUFqqIhGqE1GJ4toxRmZ6LdaRP2/9vKdZ6MWuWo0QxL5ZYPlmxK6Ty3sCml80zWXmvGKbVpZMVdGvNsnlMqxxu/lup4tFCNIkrFirffLHU5oPJKyHFEL7XvbQoPHh5MMop+TjHOaMuHGjpXevbVgPxV3g1MhWO7jv5zp9eFQq0gsAUyd6+Jho5nQg4GWssQhUKtXOCUK7YFy30YduQWijMYpqnGQGTJvzMSpkbRrFwVWlJdH7C3MMw8mO2wx98oVHmWrFauoD11hrgD72hfV7Wq04DIO6dZB6KpxiB8yZ/OwOVrxeR5Av6+Tdto3IPU1e/beo8UD265J/sA7SJj9Y3zQcFcRwv84tCs05YlU4+GxtlDzxnG6aPTQi/5VxtendRZbXgRFb6Hr50feuArRcPfvgnU7x9lRIgTFKrbFflb/fPqRYeezUjl3nCCY+1PBRY3Tp0JklCN79/jiHQ3Gy895gpWyvEAbal/Z4CYeaU6GyBqcDUeIBZ8U3JjgEhwcIcM0xkgdh65d/Rf1M8bAQsFVL1lPz9Z7PT0CXn0VTCDR45mtUHCXzDsKllEpBpVEIURvP3m8RxBSxkt1c2VZm+jWwTuByukSIQ9gdWeiUbGlw24N18b7AUFK2G0VAPVoXgsPYX+kJ+uf3j+9On1l+/6//Gn7vTR68/k44//AQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-overview_ociPart_85"><mxGeometry x="2" y="1" width="73" height="81" as="geometry"/></mxCell><mxCell id="hmm-overview_v_89" value="<b>OCI Generative AI</b><br><br>GPT-5.4 Mini<br><font color="#5B5652">질문 계획 · SQL 생성 · 답변</font><br><br>Cohere Embed 4<br><font color="#5B5652">용어·문서 Vector</font>" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#AE562C;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="1260" y="320" width="190" height="110" as="geometry"/></mxCell><mxCell id="hmm-overview_v_90" value="" style="rounded=1;arcSize=7;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#6B7280;strokeWidth=1;dashed=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="1535" y="120" width="235" height="900" as="geometry"/></mxCell><mxCell id="hmm-overview_v_91" value="<b>3rd Party Cloud · AWS</b>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#6B7280;fontSize=13;fontStyle=0;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="1549" y="128" width="207" height="26" as="geometry"/></mxCell><mxCell id="hmm-overview_v_92" value="<b>AWS RDS PostgreSQL</b><br><br>hmm_demo.carriers<br>carrier_monthly_performance<br><br><font color="#5B5652">가상 선사 8개<br>월간 실적 144행</font>" style="shape=cylinder3;boundedLbl=1;backgroundOutline=1;size=15;whiteSpace=wrap;html=1;fillColor=#F9FAFB;strokeColor=#6B7280;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;spacingTop=12;" vertex="1" parent="1"><mxGeometry x="1570" y="530" width="165" height="180" as="geometry"/></mxCell><mxCell id="hmm-overview_e_93" value="HTTPS · 질문/관리" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#2F6F8F;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=1;exitY=0.35;entryX=0;entryY=0.5;" edge="1" parent="1" source="hmm-overview_v_11" target="hmm-overview_v_38"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-overview_e_94" value="MCP initialize · tools/list · tools/call" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#C74634;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1" source="hmm-overview_v_12" target="hmm-overview_v_40"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-overview_e_95" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#2F6F8F;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="hmm-overview_v_38" target="hmm-overview_v_39"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-overview_e_96" value="MCP" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#C74634;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=1;exitY=0.5;entryX=1;entryY=0.5;" edge="1" parent="1" source="hmm-overview_v_39" target="hmm-overview_v_40"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="780" y="399"/><mxPoint x="780" y="459"/></Array></mxGeometry></mxCell><mxCell id="hmm-overview_e_97" value="JDBC · Tool 호출" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#C74634;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1" source="hmm-overview_v_40" target="hmm-overview_v_75"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="805" y="459"/><mxPoint x="885" y="459"/><mxPoint x="885" y="330"/></Array></mxGeometry></mxCell><mxCell id="hmm-overview_e_98" value="ENABLED" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#2F6B4F;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="hmm-overview_v_75" target="hmm-overview_v_76"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-overview_e_99" value="Java Tool" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#2F6F8F;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=1;exitY=0.5;entryX=1;entryY=0.5;" edge="1" parent="1" source="hmm-overview_v_75" target="hmm-overview_v_77"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="1170" y="330"/><mxPoint x="1170" y="515"/></Array></mxGeometry></mxCell><mxCell id="hmm-overview_e_100" value="동일 CB_ORDS session" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#C74634;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="hmm-overview_v_77" target="hmm-overview_v_78"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-overview_e_101" value="predicate 자동 적용" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#C74634;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="hmm-overview_v_78" target="hmm-overview_v_79"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-overview_e_102" value="PDF ingest · 청킹" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#AE562C;strokeWidth=2;dashed=1;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1" source="hmm-overview_v_67" target="hmm-overview_v_80"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-overview_e_103" value="runtime secret" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#9E9892;strokeWidth=2;dashed=1;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=0.5;exitY=0;entryX=0;entryY=1;" edge="1" parent="1" source="hmm-overview_v_54" target="hmm-overview_v_36"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-overview_e_104" value="모델 호출" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#AE562C;strokeWidth=2;dashed=1;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=1;exitY=0.28;entryX=0;entryY=0.55;" edge="1" parent="1" source="hmm-overview_v_73" target="hmm-overview_v_89"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-overview_e_105" value="HMM_RDS_PG_LINK · TLS 5432" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#6B7280;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" edge="1" parent="1" source="hmm-overview_v_81" target="hmm-overview_v_92"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-overview_v_106" value="<b>읽기 책임 분리</b><br>RDS: 선사 실적 원장<br>ADB: 직원·배정·권한·VPD<br>MCP: 허용된 View만 자연어 조회" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#F9FAFB;strokeColor=#6B7280;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="1545" y="830" width="215" height="105" as="geometry"/></mxCell><mxCell id="hmm-overview_v_107" value="※ hmm-mcp.cloud-handson.com은 공용 호환 게이트웨이입니다. 사용자별 VPD MCP의 기준 주소는 hmm-backoffice.cloud-handson.com/mcp입니다." style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#5B5652;fontSize=11;fontStyle=0;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="280" y="985" width="1195" height="24" as="geometry"/></mxCell></root></mxGraphModel></diagram> +<diagram id="hmm-security-flow" name="02 · MCP 요청과 VPD"><mxGraphModel dx="1600" dy="1000" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1800" pageHeight="1050" background="#FFFFFF" math="0" shadow="0"><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="hmm-security-flow_background" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=none;locked=1;" vertex="1" connectable="0" parent="1"><mxGeometry x="0" y="0" width="1800" height="1050" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_1" value="MCP Tool Discovery와 사용자별 VPD 실행 흐름" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=25;fontStyle=1;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="36" y="22" width="1728" height="38" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_2" value="광고 계약 검증은 시작 시 1회 · 사용자 인증과 Context 설정·SQL 실행·정리는 요청마다 같은 세션에서 수행" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#5B5652;fontSize=12;fontStyle=0;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="38" y="60" width="1724" height="28" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_3" value="" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#C74634;strokeColor=#C74634;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="36" y="92" width="1728" height="3" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_4" value="" style="rounded=1;arcSize=7;whiteSpace=wrap;html=1;fillColor=#FFF7F2;strokeColor=#AE562C;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="35" y="120" width="1730" height="185" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_5" value="<b>서버 시작 · Tool 광고 전 Fail-Closed Gate</b>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#AE562C;fontSize=13;fontStyle=0;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="49" y="128" width="1702" height="26" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_6" value="<b>BACKOFFICE_MCP_TOOLS</b><br>공개 이름 · 설명 · 입력 schema<br>AGENT_TOOL targetName" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#AE562C;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="95" y="185" width="300" height="78" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_7" value="<b><font color="#FFFFFF">A</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#AE562C;strokeColor=#AE562C;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="83" y="195" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_8" value="<b>McpAgentToolStartupValidator</b><br>AGENT_TOOL targetName 중복 제거<br>SELECT_AI는 DB Tool 검증에서 제외" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#AE562C;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="510" y="185" width="330" height="78" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_9" value="<b><font color="#FFFFFF">B</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#AE562C;strokeColor=#AE562C;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="498" y="195" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_10" value="<b>USER_AI_AGENT_TOOLS</b><br>Tool 존재 + STATUS=ENABLED 확인" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#AE562C;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="955" y="185" width="330" height="78" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_11" value="<b><font color="#FFFFFF">C</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#AE562C;strokeColor=#AE562C;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="943" y="195" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_12" value="<b>Endpoint Ready</b><br>모두 정상일 때만 tools/list 광고<br><font color="#C74634">누락·비활성·조회 오류는 기동 실패</font>" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#2F6B4F;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="1400" y="185" width="285" height="78" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_13" value="<b><font color="#FFFFFF">D</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#2F6B4F;strokeColor=#2F6B4F;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="1388" y="195" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_e_14" value="구성 로드" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#AE562C;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="hmm-security-flow_v_6" target="hmm-security-flow_v_8"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_e_15" value="시작 시 1회 조회" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#AE562C;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="hmm-security-flow_v_8" target="hmm-security-flow_v_10"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_e_16" value="모두 ENABLED" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#2F6B4F;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="hmm-security-flow_v_10" target="hmm-security-flow_v_12"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_v_17" value="" style="rounded=1;arcSize=7;whiteSpace=wrap;html=1;fillColor=#F9FAFB;strokeColor=#9E9892;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="35" y="330" width="225" height="665" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_18" value="<b>MCP Client</b>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=13;fontStyle=0;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="49" y="338" width="197" height="26" as="geometry"/></mxCell><mxCell id="hmm-security-flow_oci_19" value="" style="group" vertex="1" connectable="0" parent="1"><mxGeometry x="95" y="385" width="76.00000000000007" height="90" as="geometry"/></mxCell><mxCell id="hmm-security-flow_ociPart_20" style="vsdxID=27;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-security-flow_oci_19"><mxGeometry width="76" height="84" as="geometry"/></mxCell><mxCell id="hmm-security-flow_ociPart_21" style="vsdxID=28;fillColor=#FFFFFF;gradientColor=none;shape=stencil(pVXbchshDP2afdUgCRA8p+l/ZBqn3qlrZxynTf++UFhYlDEvfQOttEeXo8PCD2/Hp9fDQubtdr38OPxen2/Hhb8sROv5eLiut3Ra+HHhh5fL9fD9enk/P5f761P2zKefl1/5Dx8lzoDhHETmTzGgMf/uX4v3aT3PvANB5L3/t/dr+T3WiOperyLAvpg+qJgISKpTtQhCjNWJi8mDrT6bQSBMgdGA4xHcM/gwgqMHsiO6RzBuRE85WlT4Bqyd4keIYcR3AVgUvkDEEd85iDLi5yzDiO8YeMAfB4UO3BZRA1Kf6X5A7rAMAYggflYhCQiNFYYtqVYgG0BWBfYu1GI4FaPqY6ApOHvwarwI6EZwu+MANQbjCG4tOEWuyQak6dhxBcwsTRc7c7BloDYg8VKvAAKpNH0a0KceMc7AfQQZsV3LZsMWAsW/0De04sjn8WRy8P0upQhRskIQwv2AYHVbE19RJgHcydc2guKsHUmrUM0i7xqPDQmmrX8j7I7WW0sEPI0tyYowHUdOOSpFwiaoDT/2OXd+eDWSmExakZIiTvGj9KFscpyUVpFx0/+uxkmySaHvtI1bc2fz3Ud0i7sf8J/vkvJOh/4AvqynU3k/99/1g5lM5bHlx78=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-security-flow_ociPart_20"><mxGeometry x="1" y="1" width="74" height="82" as="geometry"/></mxCell><mxCell id="hmm-security-flow_ociPart_22" style="vsdxID=29;fillColor=#FFFFFF;gradientColor=none;shape=stencil(pVjbVhsxDPyafdWxLV+fKf0PTgklpxQ4Adr076vtrr32uPFC+xaMlLGkkTTOxFcv9zfPh8mol9fT07fDz+Pt6/3EnyZjjo/3h9PxVT5NfD3x1d3T6fD19PT2eLv8/XwzW86fvj/9mL/hvPg5R6xnL6N+LSeGOP45+LzYf3k7LQ569Uiks4fOLtYuJ2eznHhDIa1G6xGTX93OvBo5CmE1Wo/kxIzAfaTgW/BAkVvwoAiwtSpuGTxoir4F15ZUqNEfjo9VqqKhNlNOU+KBvSbvWgdD3o7CC4k8t+E5T0pDfL5LrouUILuBiW0boNek7eULi4fj5sKdQ3dh311YfNYsbhdOuazlwmLloCKS38yQcmFDbkjG6MgBvPCsRY+RNAO6K0cZPSliB+iBVBqhJ7leAPhECnohWWLAF/JxAHyJBMol9UjD7Cchgm3xpSDOAH4g9oCfyETAD138UpBRP9Qe5cSbyw5S3/hf9t2FMCGVh+4jLYMIq1HlbA3dEuRitxYyuQC5qnEGIguFqOmSC0E+TR/jodal+wsPK4bnIWg3hmX4rVnyDJQ7MsDvNaGR1jEAX7X3iiV5txrgq1GxghmpBQ6B8dQSj9DScHdqVRTI1avmpylRWdfet57FOV+x7L6yw3DKt/eVDKeW1jt7xETYO/OecsP4UjYoAc4bEOYSS5pgjcguhfjYko4QHw17kANpaAXZK6nFtooiJNcU4pUmtDmRBRvFSZspETOmXWC79jvi56P2nbiC+6jLX15H+xdjTLNkMACJFSnoOfaUYPFK0aHlmbuJw9noUo2lN6DGbvveXFAhepiAX2m/32WamXG/m9Dkac/BbbpideDh3tFdmaVDR7wQB9UpPZOGDg5mgKR8fKVSyOKw9uqlpSB9CENA+Ai7UMaXh6HsZCkDQ4RZBhgirwAeUmTeNqgMhTWAn8qOrFZSVhXnMnA8jCDZiHa4kmSiphZc1rEHYaSAnL48RzKyKtv5nZqocshzd9DyKW0d8k/mu4Iof1+tDwP0qaiwhHtAoy4QEYsUmIswBBdJ7aAKc3VBloiE73TBNl7KayZ1u2CXgvIAQ10yk9sBfv9UlT7JR+VxYjsqdB0Izz9LNn/vu3pcEqFg7IyniCCA8pnnlL/sEGxpwG0SuoG9RAh01sMQ5hdkHDt0L0ihMGr28jI/bzLZoRbrpKP3BMqVd3SzsLHTSfm6BVtoZuDBoDrRXiuDPDsup+lDumDHWD5sv+3cHR8elp+G6v/jb0FytPyOxNe/AQ==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-security-flow_ociPart_20"><mxGeometry width="76" height="84" as="geometry"/></mxCell><mxCell id="hmm-security-flow_ociPart_23" style="vsdxID=30;fillColor=#2c5967;gradientColor=none;shape=stencil(nVrbklQ3DPyaeXX5fnkm5D+osIStEJZaIIG/j5wZS3Zrjs8ub8tgj2S51WrJcwlvvn589+Xh4u3Xb89Pfz38+/j+28dL+O3i/ePnjw/Pj9/or0t4ewlvPjw9P/z5/PT98/vrv7+86yv7X38//dO/4cd1X4mm1b7L25/XT7Iz5f8Pfr+u//T4eV1f9uv/+P58NeBuO6qJ4bbj9lFqJuTrRz/89aPqZNXto5RNcLdV4bYqmFRuq24fJW/Kxt8ajY2Lv7TB+s0Bg3Ft2eC88Wl7Qm9cWU9Yh1N8wNxMg/OZ3Nbj5WxKWI8XTKw725kiklfbzniwTfHOeTVujU2r8UT+xNW4PQ5TjCamJUx252a0JsbVTfIAMBCynMXzWSBGgSLiMEbJ7YwHazzEKHGgh3G6shss2Hg1FfDni7FgvKNjgz+XjS2XV+CPNqSEG8o2w1w1ucL5ptwZB3SMt5+CC87DccJkAkBwTwi0AfLljBDIkeZWd2lLhvvoh0qru5nyLK7uumRSA3eD8Vs40I0lIKQcBWc3Y80UNJ8MYLEYSJhcTNtSReK0G6aLhSSQcHqmlwi5ShH0q+VC15B3lq2Ec1gupkIGWkgAKzQ2KEElAHHyBh7T+pvrdscqbO+XVqMrioVkw+Bpx3BnsjRQh6iAjRLJRG0C3Hwh6m4728UEsE2lNEOOEuPoy+fMGJdvhymxboeLx5jn5B+Yp+T3kHNxwFdAL7TI9gn2gD7C/R59TqrfMJ8NMjDlZQTriQMyEZTDjE+QdStMqKwEYCjcoCpGNhXKFQUCGCKQsCmrv8XJlQaufCywxm2xijnCKS0ArCTmrGE+EuKgYBEI0XySMjtBNW8JMgUDh5+/WNRZRvOTk8N8My688vS9GODxnbLfab5eEKsoqIISVCdg6Xp4HOuFYCEeTZDaU6kQKoVo9QSAzKpedNqUWVteqZQP/oJQRWlVC1d6tq+Lf21D6cptuUHgB/abMw5vi44BCrR5Vc07/UE1b0GEjIC1+q39aJBXsZIn44FXOu2j7WnViyrbvOEFxWr85y8tPitsst4x3LABaXTfeAWTAhhhIOzgFZxJi5ZZKE8QiABBuqgG11BEHbB9rwUdiaq9fSuwnRIQa2tRdE2yD/iK2kXsLjrRbBHYwQTtRVeqaTVPKsJCbZ9V74h1lFC+SH7/Qv9+sn6dD1Dv1NbiScp4zUiotnqDN/ti6we+OH60pUD8qO9DBqNVDeATohoQ9FX7amtV+04qfOQ2l9uk2qfeUQGD93IL2ogambjFT4rGQj9C3xzg/FRJbdDnh/TtjQwcPxzfFWVJhLsKO0/7fEJdVANd0tNV+VnQzyZtcbgPE3C1YR/dcbh1tqnC1JEGzlYRCJ4hBKWBToRJKaOK41CB4CW5WNB6GpMLtk5gVFMhIn+oTNGPZDjWUA2uKsokbMJUhZJAMA9gPxVBybCfR9t0hOnErTrbL3ouRaoAzBfubTYpRavqllJoAY6b5m/2HJGmzHtoeCnUKenTbzO6Mwrcfo9rXc0TICwUpChU8EOQFgB8p7ffWRCPb1laTYzqIPwzRod9rzRh4BHVkX3pqn+KSwC+XigA/FN+BlkE2MO8Py0/r65XuGGtiHNPwcnmdtSlNsQKI8A77KEuMCtJQeRVoQWizhGplkQW9BTRDZQdD7RHazKxF/A89XEBrIek0odWcZcqiNqFq49bYADqxuzkuANDBUY9LGR7l7GQbtTDWpjslGkIIfy3n7/20T6Ei5gV9W+vCID3bJWAuNexuuH4C+H1ajyqDSviiZU4vLdP4EVkNUDkn/brVbloQ2ML3hVfkqjOALikqkXW46EK4VPXV1DVOMsHmJ5vkKydxJGtV0VX26uryD0kFt02Ur2xAWagPUqDeeZx9rayIpiGMxmonVad3BQxE7w1uMIpw4U9yCvhsJ+5/2H7TpVWF0eY7098Gx9VHud2z3/EtAGadLSgijcRLXSzs+9CtEyRXsdBhn9YPHuE98W7GIcRnu5OijeOavsqsN+LmzK/44Zpwz343nlZq1Do56yYyjqiwXKfNrVuOPypJ7OvO6FK8mY3KWqQ+FFpXKI4D8b3HPdaTjxfv3IudYAO3q2xCsI7XEakd+W2VRm0BR8FqIIHyGVf5NVEZCK3p6LKUCW7k0QjlegBPF2+4JR9evKXybcDkTPP+Id9FFmnrwJYZ5XD/LIog56pgouu9cC9sxqQl2Scc3WdsWUGgkxDmSPPy9MzCnIv0bF6RnGqTp4B7NWIPN+wYr53emuP34XoLiK9EQTdwFuWyQ30OUUqDzNAUKW7jJn9kXWv2pwuyUGlUx6ohwrsMZ16pMk7LpmWc+Ti2YtShVTv1RdEDiUWFhVq0R2+6ViZRAVcdfykhEV1/mbR40qiT16ybAHjeHhQo/j2t/WzSvI4uKzhUdG/DKhqjp5EMsxw2uIpRfVLqQ5UPTTxEKQiQNxMTfqq5fD0h/ws7MPjp0/XX5XN/48/I6OPrj9BC2//Aw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-security-flow_ociPart_20"><mxGeometry x="2" y="2" width="72" height="80" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_24" value="<b>Agent 요청</b><br>initialize<br>tools/list<br>tools/call" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#2F6F8F;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="70" y="500" width="160" height="100" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_25" value="<b><font color="#FFFFFF">1</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#2F6F8F;strokeColor=#2F6F8F;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="58" y="510" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_26" value="<b>필터링 결과</b><br>허용 행 + 근거만 반환<br>Token·내부 SQL은 미노출" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#2F6B4F;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="70" y="800" width="160" height="115" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_27" value="<b><font color="#FFFFFF">10</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#2F6B4F;strokeColor=#2F6B4F;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="58" y="810" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_28" value="" style="rounded=1;arcSize=7;whiteSpace=wrap;html=1;fillColor=#FCFBFA;strokeColor=#9E9892;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="285" y="330" width="650" height="665" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_29" value="<b>VPD Backoffice · Spring Boot</b>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=13;fontStyle=0;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="299" y="338" width="622" height="26" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_30" value="<b>Bearer 인증</b><br>Token SHA-256 hash<br>만료·회수·재직 상태 검증<br><font color="#C74634">실패: HTTP 401</font>" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C74634;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="330" y="400" width="250" height="110" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_31" value="<b><font color="#FFFFFF">2</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#C74634;strokeColor=#C74634;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="318" y="410" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_32" value="<b>MCP Tool Router</b><br>catalog에서 이름·인자 검증<br>AGENT_TOOL / SELECT_AI 분기" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C74634;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="650" y="400" width="235" height="110" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_33" value="<b><font color="#FFFFFF">3</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#C74634;strokeColor=#C74634;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="638" y="410" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_34" value="<b>ADB AGENT_TOOL</b><br>resolve_hr_term · search_hr_policy<br>동일 기본 JDBC session<br>SET_USER_BY_BEARER<br>→ RUN_TOOL → CLEAR_USER" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#AE562C;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=10;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="350" y="590" width="250" height="130" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_35" value="<b><font color="#FFFFFF">4</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#AE562C;strokeColor=#AE562C;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="338" y="600" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_36" value="<b>search_hr_data</b><br>ADMIN 생성 세션<br>DBMS_CLOUD_AI.GENERATE<br>action=showsql<br>SELECT/WITH + 승인 객체 검증" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#2F6F8F;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="650" y="590" width="235" height="125" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_37" value="<b><font color="#FFFFFF">5</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#2F6F8F;strokeColor=#2F6F8F;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="638" y="600" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_e_38" value="Authorization: Bearer …" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#C74634;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="hmm-security-flow_v_24" target="hmm-security-flow_v_30"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_e_39" value="인증된 employee" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#C74634;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="hmm-security-flow_v_30" target="hmm-security-flow_v_32"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_e_40" value="AGENT_TOOL" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#AE562C;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=0.25;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="hmm-security-flow_v_32" target="hmm-security-flow_v_34"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_e_41" value="SELECT_AI" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#2F6F8F;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=0.75;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="hmm-security-flow_v_32" target="hmm-security-flow_v_36"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_v_42" value="" style="rounded=1;arcSize=7;whiteSpace=wrap;html=1;fillColor=#F5F4F2;strokeColor=#C74634;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=center;verticalAlign=middle;spacing=6;" vertex="1" parent="1"><mxGeometry x="960" y="330" width="805" height="665" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_43" value="<b>Autonomous Database · 보안 실행 경계</b>" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=13;fontStyle=0;spacingLeft=0;spacingRight=0;" vertex="1" parent="1"><mxGeometry x="974" y="338" width="777" height="26" as="geometry"/></mxCell><mxCell id="hmm-security-flow_oci_44" value="" style="group" vertex="1" connectable="0" parent="1"><mxGeometry x="995" y="370" width="103.99999999999994" height="90" as="geometry"/></mxCell><mxCell id="hmm-security-flow_ociPart_45" style="vsdxID=21;fillColor=none;gradientColor=none;strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-security-flow_oci_44"><mxGeometry x="10" width="84" height="73" as="geometry"/></mxCell><mxCell id="hmm-security-flow_ociPart_46" style="vsdxID=22;fillColor=#FFFFFF;gradientColor=none;shape=stencil(lVbbVhsxDPyafdWxJF+fKfwHB0Kzp2nCCaGFv6/T9VXZC7xtHMkjj8ZjDXz3tn983Q2k3i7n06/d3/H5sh/4x0A0Hve783iJXwPfD3z3cjrvfp5P78fn6ffr4zXy+vX79Oe6w8eUpy1YvGaR+pxWUKn/vx+m8Kf38xSPKUGB0ikB+wz1QdMCM9iQYtJSCEAuRfG0RAEUpai0FDwos4ZOBN736MEC6x4fAzgBHyuyPXwTlNG7gx/GY8NTEz0tGA2Wl+PVt4KB+h4YBcGv8aDAm54GjRBMT4MB7llgDWgECwQUehp4tf/I4FwP3TSydECDF+DkwMgWGCDTg8eikx6X8GO7scfHRlsZTAEK/Fh4EAI0lfdcEYK2qwJ0wCzgFegg4EORW1EgOHF6jtQLAeaYBfCYYQV4s229fLSNXcj4MnbUDm5ia2DaxNZg+JvgtlrFMngUmMQuuszYHlgozsHqTWvuVYZmQCG36KJenLsRRQIyBCgavmI40TIo++xMsCzTEihhjKpskMu0kRBhjNEjhC07yleg3goGvXopY44VptBctwTlGJR4FbD4YoVnMIKlaBOJuCX4iCXfJFMcsuBrcBLfFUIK/owpbL1KHsHI4/viqxnfu2q12SeiJIRKggLre3wqe80qpc0oCUavJGC1UGFF82+f6l8zXaqe396Uq5kTCs3zCVEYfT06i2eB8PYEWO4Liob7KFvfE24RHIqG18RMeI36uuDanelWyiv4XM+yhN/z1Wakk24ZaJuChXUtC1ZllCoWakHUaznPJtW+NzzUhOr4Gf32zTbRV0W76mTJt+Mq9zGzVG2Ot/GjjsYv4+EwTdbt/3KUjkvTGM73/wA=);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-security-flow_ociPart_45"><mxGeometry width="82" height="71" as="geometry"/></mxCell><mxCell id="hmm-security-flow_ociPart_47" style="vsdxID=23;fillColor=#FFFFFF;gradientColor=none;shape=stencil(pVnJchs5DP0aXVkkwfWc5T9SiTNWjWOnFCdx/n6g6eb2oCbtyk2iAD4S2wOoE737cf/p+93J6h/Pl6d/736fvzzfn+j9ydrz4/3d5fzMn0704UTvvj5d7v65PP18/LJ9//7pKnn99O3p13WHl03PkzJXJav/bAtWUfp/4eMm/vnnZZM32+9BK+92DQMq+sXuQlEZvwvtS7yyq73QvqKVC7vQvmScimGGzjopjujGKwfw0SidRngTlMmAb1TIgB9UiFN8q4wB/Ciuz1KZAD+pZACflPeAn1f3ZwEP+FWn4ievCPAtg8URPyXlaMS3Wdnc4z+cH7tgSfxz8di2QiV8bspnNs0YXQ7DCxScCjQqVO/eVjDK2FHBlFsdmDBzAI8W9EZlMKBVCeKX495iAEsHNqnjAKqhYeTOLYCq4Sb4MoCDPrZVL14jIJnpaTsVUy0e4njakJWG07IjtR9PG0iEW0bnIr7nAybADwLfs7cy4HdJuYO5oBxYq0kd4DvdComRO+9gxJdF/O6ULbcwWpb356zNUO56y5bcNspCueu9RFKKDvw/BkyvAWxxW17Z+CZxB7trFafh2Liq+EdST1QWSh9BIBpSwY2GIFPY4QCZScZCIpAWvMP04bHuJlF3WSoDvg2LosUkkyEQbbXWLBD44BF4h8E0JCKbhKb4fA2kPWl6toiJAN9KazE1ux1uX4WO3N5VYyP2LeBcXtbg1OrJa8G75D4Gdwr5XmI7hWy/guaeJSyhY20sOmzsdSjXqlGLz6LV4NzygO4FUbmovB3R2VlhBOf6jDzFK/a4MvQKOw4cdiWP+wtisYLYZDzf4BUraKVroAlkbp911XBDf+4aa2wrE4b3oqTOhLl+mb8QXjQ618YNwkerDMzF/Ao5K9tUDnAD0RNLiB0njkfaFKxJvg0yhTVrMHdJiz1LkXl9vei2nXQMElsWqyU4NQo+BpfN7Q1w23j0leBWziYS/MrPWKZlZ2tlpVzwc26DQ1miNnE1MsxYK+vE0/jZ1d6pprQvoXuE70S0W9ko9p1H6w9wLmRmxfZgZXqe98DtJG/PozOQlBMkxa6AauY1XH0sDHooCh77iKmwh3Zv1U3O5a+etH+nkGqVOA6zqlJCXJIiN1gBE0zOI+xUgxmW1Lz/JTkOdfHbiqp4/dB6BL8xDBWZoxATzXfbtPBlllVNphfPgcm97d4hKEKz33h1ofoQUuG7tyGSUnTgdpibO439PHZBQKlrcg3q1ANn6SjvG0cW43CDAAd2OC7Ao4htw0Jt04ybKHD1GjPBzSdDtmuKb0JI2MY4NzV6Da5XPhzJ/XGYBAXdqGBPLujGhbyFFnNholsKs+LYR0NVmKZFCiriUCifsviikJQmihY9cpuJ9WD1OMI6Bt9i5eNM/0h2PJOyFCHne+gwRVbS6HEzz+Hy/Fykl0/N8qWu6fQvdTgAsRTWvP49r43c87e3/lWt0jxO/FxVDHhXC+P2M0Th+WNTLSYO/tD+S/h6fnjY/orof8f/Hnhp+9+CPvwH);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-security-flow_ociPart_45"><mxGeometry width="84" height="73" as="geometry"/></mxCell><mxCell id="hmm-security-flow_ociPart_48" style="vsdxID=24;fillColor=#2d5967;gradientColor=none;shape=stencil(pVrbctw2DP2afdWIN5B8TtP/yDRO7alrZxyndf6+2llRBHGw4O70zVEgHhDAwU17Cp9+PH75/nDy64/3t9e/Hv59+vr+eAq/nbx/enl8eHt63/46hc+n8Onb69vDn2+vP1++Xv79/ctZ8vzX36//nE/4uLwXl5DOL/n11/6gLPny5PeL/PPTC5N3tFT6fy+ksHjjhfUu4eX8X1x+Fdr88fPtcl/X3ih5f2N/EvcTPvx+RD9zfxJiU2L9CPu1XL/W/iisQlUJ7cIioH3tB+9YLo3YPiN2WmIcsSfAtCQ/Irs6wh5m911XAdvU+NVNYMNuqoc6wtZ+qu9WE+aucOMQllXcuE78HJgb251XAZ0Xl6fQZYllhM6LiRx9P7ZZAq4dmW38EcsCO/mlhBF7tZATM5Pj8j22NzqRgBWYTOIWTHLLWk1MKl2rpsaImV2PzxZcwQLNjH2MXMLG2YN/XVwkNtrYme7dsIOATsBi2sKzCOgkoQlDy5Fp69J907HltbmUhS0ZZV+bkE9lEcipLkkgg72V+Io2n5SojoAcIMYQGT09QY7MQdeQY1xcGJEJUmdkJGnWXm3sLe9UByEu42zLciQKxhbiEj74nmzCIWUnb56XG34cwb0SaGD1zRpw9WRf3XuoGy5Lu7st1gS5vcNSyax4KGRhO6SYUrS2gip8HjxY3WGkh0nAFdkghAwu34q/wN4Kjoy33tW1J3aXNm8Dx7YxM77JPkUFyNAGTl4oLAh2lepiARSp0UQ+w/nRNNFWKMjd9QKrardoRKiRfYO7fTB/AbzsRbPvTBfL+1rSsVdISaFr2t+jzER6vGgC1UO5fjYvJEd/aqmexpkmZEOUlZxdbzLPJiCWdTyxanWT6rT2AnOkJLvzJmiQlDFnC/aDTS19YwrNIot5GSKQQNeeHR0euyMVHPG2MiVrR8nQLwRnEbKCrc4V0tYXR6RNX2mswjJJq0AF9JXGcjNwpaXjx7Z6g1OSzyMyp88xNhkxPmHbyE23juzZeikrYCtk3eDtQgNZcV8I6NKp7w926WQfX6G0zubmAm1AxBaE10d/2HUWE13kWkywtsrhsY29EcabhOwlNn+1NiRbBEpgq+k6h1hV7voqI1EU+tI6zTY0Ay/MDA6PbTsFVi4OY43INcAkaBW3yih5UxDeyaGp+MhQYk32/kQWFRiicbqgCGGWMe/RLQM8TTs5Ub+rM5Vl8m2PJUahLNZnlWDgZpW3eb1YqJwMDRXrqDL4Ht47poE+rYRR5Nrsh0mgH9oGHtwkVdyeeVxx2Lf2yGdmyz77yfRzOCSgSNCcLCK+ym4UYh4mxQrkDwXIz+/TLAexoVgp2MM5rkQC7r8CiyDmNTkrQnQEuXOHvQjukwPuJiLrTA34DLsJwBezKsxJ05Y0ZljJ9ne4wllwiUtdt9cMPuC6UoH3WFTjCqESYKFhtStcvEnPtvZY1KLIdkHZtilLLzAUjDLgp9qTpMODW87DsqDAJ8VSNNk0Rki5jZcHtuKkCptG/ECTzAqTlC7GIaFw5ZUcrH7A6slNNo1Ky+dkylXSfcIOSklkcocB4Ya5JMpvUyKJxaKwAhtNqwVgL+yXKRM1IxiJVlzHYqtHAfwj96FkfutIAZbQx5l97y4TPfkRlnAZSWZIKsPhcWbDwAQvb0u4f532hnw10HtD2dEzM7ZH846LJptnpeciJf9g+qM85yFNvhsqPCRYeys8JMx9Cg9nV1d4SAJb8hB7ceQheHvCwzzZkCs8zDifKjzM9ST9I3m4i9weG1kkKmWplQkIAZ+To7kVng9Xd78wG9+K/cUX+Vlw6lUIWvD7jMLRMmu8FUcUmRCRoQV/0IAULbPcpHC0KI03krSIxKgwdHpxhaIFuwTJ0qKUaaDp6PEJR+tsL6KQtOJWk3fFbYpL2ngieVrlsgMiFLcLVflGnyFJVFk1lfFVXn7GPsu0M+ntj/7DrW9Pz8+X333x/5c/9NoeXX4kFj7/Bw==);strokeColor=none;spacingTop=-3;spacingBottom=-3;spacingLeft=-3;spacingRight=-3;points=[];labelBackgroundColor=none;rounded=0;html=1;whiteSpace=wrap;" vertex="1" parent="hmm-security-flow_ociPart_45"><mxGeometry x="1" y="1" width="80" height="69" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_49" value="<b>CB_ORDS 동일 JDBC 세션</b><br>CB_ORDS_HANDLER_PKG<br>SET_VPD_CONTEXT<br>Runtime principal·context 일치 검증" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C74634;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="1100" y="390" width="285" height="110" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_50" value="<b><font color="#FFFFFF">6</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#C74634;strokeColor=#C74634;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="1088" y="400" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_51" value="<b>Secure Application Context</b><br>HMM_ACCESS_CTX_PKG<br>SET_USER_BY_BEARER<br>EMPLOYEE_ID · CODE · TEAM_ID" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C74634;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="1445" y="390" width="270" height="110" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_52" value="<b><font color="#FFFFFF">7</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#C74634;strokeColor=#C74634;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="1433" y="400" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_53" value="<b>읽기 전용 SQL 실행</b><br>CB_ORDS · SET TRANSACTION READ ONLY<br>EXEMPT ACCESS POLICY 없음<br>승인된 HR Table/View만 조회" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#2F6F8F;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="1100" y="585" width="285" height="125" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_54" value="<b><font color="#FFFFFF">8</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#2F6F8F;strokeColor=#2F6F8F;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="1088" y="595" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_55" value="<b>HMM_LEAVE_SCOPE_POLICY</b><br>SYS_CONTEXT 기반 predicate 자동 적용<br><b>VIEWER → SELF</b><br><b>MANAGER → MANAGED_TEAM</b><br><b>ADMIN role → ALL</b>" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#C74634;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="1445" y="585" width="270" height="125" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_56" value="<b><font color="#FFFFFF">8a</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#C74634;strokeColor=#C74634;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="1433" y="595" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_57" value="<b>항상 정리</b><br>결과 읽기 → ROLLBACK → CB_ORDS_HANDLER_PKG · CLEAR_VPD_CONTEXT<br><font color="#5B5652">성공·실패와 무관하게 session context와 client identifier 제거</font>" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#2F6B4F;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;align=left;verticalAlign=middle;spacing=10;spacingLeft=22;spacingRight=8;" vertex="1" parent="1"><mxGeometry x="1100" y="805" width="615" height="95" as="geometry"/></mxCell><mxCell id="hmm-security-flow_v_58" value="<b><font color="#FFFFFF">9</font></b>" style="ellipse=1;shape=ellipse;whiteSpace=wrap;html=1;fillColor=#2F6B4F;strokeColor=#2F6B4F;fontFamily=Oracle Sans;fontSize=13;align=center;verticalAlign=middle;" vertex="1" parent="1"><mxGeometry x="1088" y="815" width="30" height="30" as="geometry"/></mxCell><mxCell id="hmm-security-flow_e_59" value="검증된 SQL + 원문 Bearer" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#C74634;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="hmm-security-flow_v_36" target="hmm-security-flow_v_49"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_e_60" value="Agent Tool 결과 · CLEAR_USER" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#2F6B4F;strokeWidth=2;dashed=1;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=1;exitY=0.5;entryX=1;entryY=0.5;" edge="1" parent="1" source="hmm-security-flow_v_34" target="hmm-security-flow_v_26"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="635" y="655"/><mxPoint x="635" y="760"/><mxPoint x="280" y="760"/><mxPoint x="280" y="855"/></Array></mxGeometry></mxCell><mxCell id="hmm-security-flow_e_61" value="SET_USER_BY_BEARER" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#C74634;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="hmm-security-flow_v_49" target="hmm-security-flow_v_51"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_e_62" value="context 확인 후 실행" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#2F6F8F;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="hmm-security-flow_v_49" target="hmm-security-flow_v_53"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_e_63" value="SYS_CONTEXT" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#C74634;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=0.5;exitY=1;entryX=0.5;entryY=0;" edge="1" parent="1" source="hmm-security-flow_v_51" target="hmm-security-flow_v_55"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_e_64" value="SELECT → predicate 주입" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#C74634;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;" edge="1" parent="1" source="hmm-security-flow_v_53" target="hmm-security-flow_v_55"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_e_65" value="허용 행" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#2F6B4F;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=0.5;exitY=1;entryX=0.8;entryY=0;" edge="1" parent="1" source="hmm-security-flow_v_55" target="hmm-security-flow_v_57"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_e_66" value="result set" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#2F6B4F;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=0.5;exitY=1;entryX=0.2;entryY=0;" edge="1" parent="1" source="hmm-security-flow_v_53" target="hmm-security-flow_v_57"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell><mxCell id="hmm-security-flow_e_67" value="정제된 Tool 결과" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#2F6B4F;strokeWidth=2;dashed=0;endArrow=block;endFill=1;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=11;labelBackgroundColor=#FFFFFF;exitX=0;exitY=0.5;entryX=1;entryY=0.5;" edge="1" parent="1" source="hmm-security-flow_v_57" target="hmm-security-flow_v_26"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="950" y="945"/><mxPoint x="270" y="945"/></Array></mxGeometry></mxCell><mxCell id="hmm-security-flow_v_68" value="<b>보안 불변조건</b><br>• Token 원문은 DB·로그·응답·Git에 저장하지 않음<br>• SQL 생성 ADMIN과 실행 CB_ORDS를 분리<br>• 컨텍스트 설정과 보호 객체 SELECT는 반드시 같은 connection<br>• 권한 또는 메타데이터가 불완전하면 결과를 축소하는 대신 요청/기동 실패" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FFF7F2;strokeColor=#C74634;strokeWidth=1;dashed=0;fontFamily=Oracle Sans;fontColor=#312D2A;fontSize=12;align=left;verticalAlign=middle;spacing=10;" vertex="1" parent="1"><mxGeometry x="330" y="790" width="555" height="110" as="geometry"/></mxCell></root></mxGraphModel></diagram> +</mxfile> \ No newline at end of file diff --git a/docs/design/745-hmm-oci-architecture/README.md b/docs/design/745-hmm-oci-architecture/README.md new file mode 100644 index 0000000..29170af --- /dev/null +++ b/docs/design/745-hmm-oci-architecture/README.md @@ -0,0 +1,128 @@ +# #745 OCI 스타일 HMM AI 데이터 접근 아키텍처 + +> 상태: Approved +> Redmine: #745 +> 구현 산출물: `docs/architecture/hmm-ai-data-access-architecture.*` +> 생성 도구: `tools/architecture/generate-hmm-oci-architecture.mjs` + +## 목적 + +HMM 데모의 애플리케이션, MCP, ADB 보안 실행 경계, AI 모델, 문서 지식과 외부 +PostgreSQL federation을 한 장에서 설명할 수 있는 아키텍처 그림을 만든다. 세부 요청 흐름은 +두 번째 페이지에 분리해 사용자 Bearer Token이 실제 VPD 행 필터로 연결되는 지점을 명확히 한다. + +기준 스타일은 `/Users/joungminko/Downloads/OCI Style Guide for Drawio`의 +`OCI Library.xml`과 `Read-ME.drawio`다. OCI 서비스는 공식 라이브러리 도형을 사용하고, +외부 서비스는 `3rd Party Cloud` 경계와 중립 색상으로 구분한다. + +## 산출물 + +| 파일 | 용도 | +|---|---| +| `docs/architecture/hmm-ai-data-access-architecture.drawio` | 편집 가능한 2페이지 원본 | +| `docs/architecture/hmm-ai-data-access-architecture-overview.svg` | 전체 구성 검토·문서 삽입용 | +| `docs/architecture/hmm-ai-data-access-architecture-security-flow.svg` | 요청·보안 흐름 검토용 | +| 같은 이름의 `.png` | 일반 문서·메신저 공유용 | +| `docs/architecture/README.md` | 범례, 현행 기준, 편집·재생성 방법 | + +## 페이지 1: 전체 구성 + +다음 경계를 왼쪽에서 오른쪽으로 배치한다. + +1. HMM 사용자: 팀장, 팀원, 관리자 +2. 인터넷 공개 HTTPS: `hmm.cloud-handson.com`, `hmm-backoffice.cloud-handson.com` +3. OCI 서울 리전 + - Compute VM + Nginx + - AI Web Agent Console + - VPD Backoffice + 사용자 Bearer MCP `/mcp` + - OCI Object Storage의 HR PDF + - Autonomous Database HMMAIPOC + - OCI Generative AI +4. 3rd Party Cloud: AWS RDS for PostgreSQL + +ADB 내부에는 아래 실행 요소를 표시한다. + +- MCP Tool catalog와 시작 검증: `BACKOFFICE_MCP_TOOLS` → `USER_AI_AGENT_TOOLS.ENABLED` +- ADB Agent Tool: `resolve_hr_term`, `search_hr_policy` +- Java `SELECT_AI`: `search_hr_data` +- 비면제 런타임 사용자 `CB_ORDS` +- `HMM_ACCESS_CTX`, `HMM_LEAVE_SCOPE_POLICY`, HR 정형 테이블 +- 문서 메타데이터, Abstract, Tag, Chunk, Embed 4 Vector +- `HMM_RDS_PG_LINK`와 `HMM_RDS_*_V`, 선사 배정 View + +모델 연결은 용도를 구분한다. + +- GPT-5.4 Mini: 질문 계획, Select AI SQL 생성, 답변 합성 +- Cohere Embed 4: HR 용어와 정책 문서 임베딩 + +## 페이지 2: MCP 요청과 VPD 적용 흐름 + +다음 순서를 번호로 표시한다. + +1. Agent가 인증된 `initialize`/`tools/list`를 호출한다. +2. 백오피스가 사용자 Bearer Token의 해시, 만료, 회수와 재직 상태를 확인한다. +3. `tools/call`에서 Tool 유형을 분기한다. +4. `AGENT_TOOL`은 `DBMS_CLOUD_AI_AGENT.RUN_TOOL`을 호출한다. +5. `search_hr_data`는 ADMIN 세션에서 `DBMS_CLOUD_AI.GENERATE(..., 'showsql')`로 + 승인 객체만 사용하는 읽기 전용 SQL을 만든다. +6. 같은 `CB_ORDS` JDBC 세션에서 `CB_ORDS_HANDLER_PKG.SET_VPD_CONTEXT`를 호출한다. +7. `HMM_ACCESS_CTX_PKG.SET_USER_BY_BEARER`가 `HMM_ACCESS_CTX`를 설정한다. +8. `CB_ORDS`가 SQL을 실행하면 `HMM_LEAVE_SCOPE_POLICY`가 SELF/MANAGED_TEAM/ALL + predicate를 자동 적용한다. +9. 트랜잭션을 rollback하고 `CLEAR_VPD_CONTEXT`로 세션 문맥을 제거한다. +10. 필터링된 결과와 근거만 Agent에 반환한다. + +서버 기동 흐름은 요청 흐름과 분리한다. `AGENT_TOOL targetName`이 +`USER_AI_AGENT_TOOLS`에 없거나 `ENABLED`가 아니면 서버는 준비 상태가 되지 않으며 +불완전한 `tools/list`를 광고하지 않는다. + +## 시각 규칙 + +- 기본 글꼴: `Oracle Sans`, 대체 글꼴 `Arial`, `sans-serif` +- 본문 색: `#312D2A` +- OCI 경계 배경/선: `#F5F4F2` / `#9E9892` +- OCI 강조선: `#AE562C` +- Oracle red 강조: `#C74634` +- 외부 Cloud 경계: 흰색 배경, `#6B7280` 점선 +- 정상 데이터 흐름: 실선, 보안·컨텍스트 적용: Oracle red 실선, 관리/적재: 점선 +- 선 교차를 최소화하고 연결선에는 동작 이름을 직접 표기한다. +- 스타일 가이드의 안내 전용 pink와 Courier New는 사용하지 않는다. + +## 생성기 계약 + +`generate-hmm-oci-architecture.mjs`는 OCI Library 경로와 출력 디렉터리를 인자로 받는다. +라이브러리에서 아래 공식 도형을 제목으로 찾아 원본 Draw.io에 포함한다. + +- `Identity and Security - User` +- `Compute - Virtual Machine VM` +- `Database - Autonomous DB` +- `Analytics and AI - Artificial Intelligence` +- `Storage - Object Storage` +- `Identity and Security - Vault` + +필수 도형이 없으면 불완전한 그림을 만들지 않고 실패한다. 생성 결과는 비밀번호, Token, +OCID를 포함하지 않는다. + +## 검증 + +1. `.drawio`가 XML로 파싱되고 페이지가 정확히 2개다. +2. 두 페이지 모두 필수 구성요소와 흐름 라벨을 포함한다. +3. 공식 OCI 라이브러리 stencil이 원본에 포함된다. +4. SVG를 PNG로 렌더링해 잘림, 겹침, 읽기 어려운 글자, 불필요한 선 교차를 확인한다. +5. `git diff --check`와 비밀값 패턴 검사를 통과한다. + +## 롤백 + +`docs/architecture/hmm-ai-data-access-architecture*`와 생성기를 제거하면 된다. 애플리케이션, +DB, OCI 리소스와 운영 설정은 이 작업에서 변경하지 않는다. + +## 검증 결과 + +- Draw.io XML 파싱: PASS +- 페이지 수와 이름: `2` / `01 · 전체 구성`, `02 · MCP 요청과 VPD` +- OCI 공식 stencil 포함: PASS +- 필수 구성요소·보안 흐름 검사: PASS +- 비밀값 패턴 검사: PASS +- 동일 입력 재생성 byte 비교: PASS +- diagrams.net 실제 렌더링: `1840×1120`, `1840×1090` +- PNG 육안 검사: 흰 배경, 제목 대비, 구성요소 잘림 없음, 주요 연결선과 설명 식별 가능 diff --git a/tools/architecture/export-drawio.mjs b/tools/architecture/export-drawio.mjs new file mode 100644 index 0000000..7bde93f --- /dev/null +++ b/tools/architecture/export-drawio.mjs @@ -0,0 +1,118 @@ +#!/usr/bin/env node + +import fs from "node:fs"; +import path from "node:path"; +import { chromium } from "playwright"; + +const sourcePath = path.resolve( + process.argv[2] || "docs/architecture/hmm-ai-data-access-architecture.drawio", +); +const outputDir = path.resolve(process.argv[3] || path.dirname(sourcePath)); +const source = fs.readFileSync(sourcePath, "utf8"); +const diagrams = [...source.matchAll( + /<diagram\b[^>]*name="([^"]+)"[^>]*>[\s\S]*?<\/diagram>/g, +)]; + +if (diagrams.length !== 2) { + throw new Error(`Expected 2 Draw.io pages, found ${diagrams.length}`); +} + +const outputs = [ + "hmm-ai-data-access-architecture-overview", + "hmm-ai-data-access-architecture-security-flow", +]; +const embedUrl = "https://embed.diagrams.net/?embed=1&ui=min&spin=1&proto=json"; + +function singlePageMxfile(diagram) { + return [ + '<?xml version="1.0" encoding="UTF-8"?>', + '<mxfile host="app.diagrams.net" compressed="false">', + diagram, + "</mxfile>", + ].join(""); +} + +function decodeDataUrl(data, mimeType) { + const base64Prefix = `data:${mimeType};base64,`; + if (data.startsWith(base64Prefix)) { + return Buffer.from(data.slice(base64Prefix.length), "base64"); + } + const utf8Prefix = `data:${mimeType},`; + if (data.startsWith(utf8Prefix)) { + return Buffer.from(decodeURIComponent(data.slice(utf8Prefix.length)), "utf8"); + } + throw new Error(`Unexpected diagrams.net export prefix: ${data.slice(0, 80)}`); +} + +async function exportPage(browser, xml, format) { + const page = await browser.newPage({ viewport: { width: 1600, height: 1000 } }); + const html = `<!doctype html> +<meta charset="utf-8"> +<script> +window.inputXml = ${JSON.stringify(xml)}; +window.exportResult = null; +window.exportError = null; +window.addEventListener("message", (event) => { + let message = event.data; + try { + if (typeof message === "string") message = JSON.parse(message); + } catch (_error) { + return; + } + if (!message || !message.event) return; + if (message.event === "init") { + event.source.postMessage(JSON.stringify({ + action: "load", + xml: window.inputXml, + autosave: 0 + }), "*"); + } else if (message.event === "load") { + event.source.postMessage(JSON.stringify({ + action: "export", + format: ${JSON.stringify(format)}, + xml: window.inputXml, + border: 20, + scale: 1 + }), "*"); + } else if (message.event === "export") { + window.exportResult = message.data; + } else if (message.event === "error") { + window.exportError = JSON.stringify(message); + } +}); +</script> +<iframe title="diagrams.net exporter" style="width:100vw;height:100vh;border:0" + src="${embedUrl}"></iframe>`; + await page.setContent(html, { waitUntil: "domcontentloaded" }); + await page.waitForFunction( + () => window.exportResult || window.exportError, + null, + { timeout: 120000 }, + ); + const result = await page.evaluate(() => ({ + data: window.exportResult, + error: window.exportError, + })); + await page.close(); + if (result.error) { + throw new Error(result.error); + } + return result.data; +} + +fs.mkdirSync(outputDir, { recursive: true }); +const browser = await chromium.launch({ headless: true }); +try { + for (let index = 0; index < diagrams.length; index += 1) { + const xml = singlePageMxfile(diagrams[index][0]); + for (const format of ["svg", "png"]) { + const data = await exportPage(browser, xml, format); + const mimeType = format === "svg" ? "image/svg+xml" : "image/png"; + const output = path.join(outputDir, `${outputs[index]}.${format}`); + fs.writeFileSync(output, decodeDataUrl(data, mimeType)); + console.log(output); + } + } +} finally { + await browser.close(); +} diff --git a/tools/architecture/generate-hmm-oci-architecture.mjs b/tools/architecture/generate-hmm-oci-architecture.mjs new file mode 100644 index 0000000..eae5979 --- /dev/null +++ b/tools/architecture/generate-hmm-oci-architecture.mjs @@ -0,0 +1,801 @@ +#!/usr/bin/env node + +import fs from "node:fs"; +import path from "node:path"; +import zlib from "node:zlib"; + +const DEFAULT_OUTPUT_DIR = "docs/architecture"; +const libraryInput = process.argv[2] || process.env.OCI_DRAWIO_LIBRARY; +if (!libraryInput) { + throw new Error( + "OCI Draw.io library path is required as the first argument or OCI_DRAWIO_LIBRARY", + ); +} +const libraryPath = path.resolve(libraryInput); +const outputDir = path.resolve(process.argv[3] || DEFAULT_OUTPUT_DIR); + +const COLORS = { + ink: "#312D2A", + muted: "#5B5652", + oracleRed: "#C74634", + oracleOrange: "#AE562C", + regionFill: "#F5F4F2", + regionStroke: "#9E9892", + panel: "#FFFFFF", + panelSoft: "#FCFBFA", + thirdParty: "#6B7280", + success: "#2F6B4F", + blue: "#2F6F8F", +}; + +const REQUIRED_ICONS = [ + "Identity and Security - User", + "Compute - Virtual Machine VM", + "Database - Autonomous DB", + "Analytics and AI - Artificial Intelligence", + "Storage - Object Storage", + "Identity and Security - Vault", +]; + +function escapeXml(value) { + return String(value) + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll('"', """); +} + +function readLibrary(file) { + const raw = fs.readFileSync(file, "utf8").trim(); + const prefix = "<mxlibrary>"; + const suffix = "</mxlibrary>"; + if (!raw.startsWith(prefix) || !raw.endsWith(suffix)) { + throw new Error(`Invalid Draw.io library: ${file}`); + } + const entries = JSON.parse(raw.slice(prefix.length, -suffix.length)); + const byTitle = new Map(entries.map((entry) => [entry.title, entry])); + const missing = REQUIRED_ICONS.filter((title) => !byTitle.has(title)); + if (missing.length) { + throw new Error(`Required OCI library shapes not found: ${missing.join(", ")}`); + } + return byTitle; +} + +function decodeLibraryEntry(entry) { + const encoded = Buffer.from(entry.xml, "base64"); + return decodeURIComponent(zlib.inflateRawSync(encoded).toString("utf8")); +} + +function style(parts) { + return Object.entries(parts) + .filter(([, value]) => value !== undefined && value !== null) + .map(([key, value]) => `${key}=${value}`) + .join(";") + ";"; +} + +function createPage(name, id, width, height) { + let sequence = 1; + const cells = [ + `<mxCell id="${id}_background" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=none;locked=1;" vertex="1" connectable="0" parent="1">` + + `<mxGeometry x="0" y="0" width="${width}" height="${height}" as="geometry"/>` + + `</mxCell>`, + ]; + const nextId = (prefix = "c") => `${id}_${prefix}_${sequence++}`; + + function vertex({ + x, + y, + w, + h, + value = "", + cellStyle, + parent = "1", + cellId = nextId("v"), + connectable, + }) { + const connectableAttr = connectable === false ? ' connectable="0"' : ""; + cells.push( + `<mxCell id="${cellId}" value="${escapeXml(value)}" style="${escapeXml(cellStyle)}" vertex="1" parent="${parent}"${connectableAttr}>` + + `<mxGeometry x="${x}" y="${y}" width="${w}" height="${h}" as="geometry"/>` + + `</mxCell>`, + ); + return cellId; + } + + function edge({ + source, + target, + value = "", + cellStyle, + points = [], + cellId = nextId("e"), + }) { + const pointXml = points.length + ? `<Array as="points">${points.map(([x, y]) => `<mxPoint x="${x}" y="${y}"/>`).join("")}</Array>` + : ""; + cells.push( + `<mxCell id="${cellId}" value="${escapeXml(value)}" style="${escapeXml(cellStyle)}" edge="1" parent="1" source="${source}" target="${target}">` + + `<mxGeometry relative="1" as="geometry">${pointXml}</mxGeometry>` + + `</mxCell>`, + ); + return cellId; + } + + function officialIcon(library, title, x, y, parent = "1") { + const entry = library.get(title); + const decoded = decodeLibraryEntry(entry); + const sourceCells = [ + ...decoded.matchAll(/<mxCell\b[^>]*\/>|<mxCell\b[^>]*>[\s\S]*?<\/mxCell>/g), + ].map((match) => match[0]); + const parsed = sourceCells + .map((xml) => ({ + xml, + id: xml.match(/\bid="([^"]+)"/)?.[1], + parent: xml.match(/\bparent="([^"]+)"/)?.[1], + value: xml.match(/\bvalue="([^"]*)"/)?.[1] ?? "", + })) + .filter((cell) => cell.id && !["0", "1"].includes(cell.id)); + const included = parsed.filter((cell) => !cell.value.trim()); + const wrapperId = nextId("oci"); + cells.push( + `<mxCell id="${wrapperId}" value="" style="group" vertex="1" connectable="0" parent="${parent}">` + + `<mxGeometry x="${x}" y="${y}" width="${entry.w}" height="90" as="geometry"/>` + + `</mxCell>`, + ); + const idMap = new Map(included.map((cell) => [cell.id, nextId("ociPart")])); + for (const cell of included) { + let xml = cell.xml; + xml = xml.replace(/\bid="([^"]+)"/, `id="${idMap.get(cell.id)}"`); + xml = xml.replace(/\bparent="([^"]+)"/, (_match, oldParent) => { + if (oldParent === "1") { + return `parent="${wrapperId}"`; + } + return `parent="${idMap.get(oldParent) || wrapperId}"`; + }); + xml = xml.replace(/\b(source|target)="([^"]+)"/g, (_match, attr, oldId) => + `${attr}="${idMap.get(oldId) || oldId}"`); + cells.push(xml); + } + return wrapperId; + } + + function result() { + const model = [ + `<mxGraphModel dx="1600" dy="1000" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="${width}" pageHeight="${height}" background="#FFFFFF" math="0" shadow="0">`, + "<root>", + '<mxCell id="0"/>', + '<mxCell id="1" parent="0"/>', + ...cells, + "</root>", + "</mxGraphModel>", + ].join(""); + return `<diagram id="${id}" name="${escapeXml(name)}">${model}</diagram>`; + } + + return { vertex, edge, officialIcon, result }; +} + +const labelStyle = (options = {}) => style({ + rounded: 0, + whiteSpace: "wrap", + html: 1, + strokeColor: "none", + fillColor: "none", + align: options.align || "left", + verticalAlign: options.verticalAlign || "middle", + fontFamily: "Oracle Sans", + fontColor: options.fontColor || COLORS.ink, + fontSize: options.fontSize || 12, + fontStyle: options.bold ? 1 : 0, + spacingLeft: options.spacingLeft || 0, + spacingRight: options.spacingRight || 0, +}); + +const panelStyle = (options = {}) => style({ + rounded: 1, + arcSize: options.arcSize || 8, + whiteSpace: "wrap", + html: 1, + fillColor: options.fillColor || COLORS.panel, + strokeColor: options.strokeColor || COLORS.regionStroke, + strokeWidth: options.strokeWidth || 1, + dashed: options.dashed ? 1 : 0, + fontFamily: "Oracle Sans", + fontColor: options.fontColor || COLORS.ink, + fontSize: options.fontSize || 12, + align: options.align || "center", + verticalAlign: options.verticalAlign || "middle", + spacing: options.spacing || 6, + spacingLeft: options.spacingLeft, + spacingRight: options.spacingRight, +}); + +const edgeStyle = (options = {}) => style({ + edgeStyle: "orthogonalEdgeStyle", + rounded: 1, + orthogonalLoop: 1, + jettySize: "auto", + html: 1, + strokeColor: options.strokeColor || COLORS.ink, + strokeWidth: options.strokeWidth || 2, + dashed: options.dashed ? 1 : 0, + endArrow: options.endArrow || "block", + endFill: options.endFill === false ? 0 : 1, + fontFamily: "Oracle Sans", + fontColor: options.fontColor || COLORS.ink, + fontSize: options.fontSize || 11, + labelBackgroundColor: "#FFFFFF", + exitX: options.exitX, + exitY: options.exitY, + entryX: options.entryX, + entryY: options.entryY, +}); + +function title(page, heading, subtitle, width) { + page.vertex({ + x: 36, + y: 22, + w: width - 72, + h: 38, + value: heading, + cellStyle: labelStyle({ fontSize: 25, bold: true }), + }); + page.vertex({ + x: 38, + y: 60, + w: width - 76, + h: 28, + value: subtitle, + cellStyle: labelStyle({ fontSize: 12, fontColor: COLORS.muted }), + }); + page.vertex({ + x: 36, + y: 92, + w: width - 72, + h: 3, + cellStyle: panelStyle({ + fillColor: COLORS.oracleRed, + strokeColor: COLORS.oracleRed, + arcSize: 0, + }), + }); +} + +function boundary(page, x, y, w, h, heading, options = {}) { + const box = page.vertex({ + x, + y, + w, + h, + value: "", + cellStyle: panelStyle({ + fillColor: options.fillColor || COLORS.regionFill, + strokeColor: options.strokeColor || COLORS.regionStroke, + strokeWidth: options.strokeWidth || 1, + dashed: options.dashed, + arcSize: options.arcSize || 7, + }), + }); + page.vertex({ + x: x + 14, + y: y + 8, + w: w - 28, + h: 26, + value: `<b>${heading}</b>`, + cellStyle: labelStyle({ + fontSize: options.fontSize || 13, + fontColor: options.headingColor || COLORS.ink, + }), + }); + return box; +} + +function addOverviewPage(library) { + const page = createPage("01 · 전체 구성", "hmm-overview", 1800, 1080); + title( + page, + "HMM AI 데이터 접근 아키텍처", + "사용자 Bearer MCP · Select AI · VPD · HR 정책 벡터 검색 · AWS RDS PostgreSQL Federation", + 1800, + ); + + boundary(page, 30, 120, 190, 790, "HMM 사용자", { + fillColor: COLORS.panelSoft, + }); + page.officialIcon(library, "Identity and Security - User", 80, 165); + const users = page.vertex({ + x: 54, + y: 270, + w: 142, + h: 150, + value: "<b>팀장 · E1001</b><br>팀원 · E1002~E1007<br>HR 관리자<br><br><font color=\"#5B5652\">같은 질문이라도 역할과 보고 관계에 따라 다른 행을 조회</font>", + cellStyle: panelStyle({ fillColor: "#FFFFFF", strokeColor: "#D4CFCA" }), + }); + const externalAgent = page.vertex({ + x: 54, + y: 465, + w: 142, + h: 115, + value: "<b>외부 Agent</b><br>AI Database Private<br>Agent Factory<br><br><font color=\"#5B5652\">MCP client</font>", + cellStyle: panelStyle({ fillColor: "#FFFFFF", strokeColor: "#D4CFCA" }), + }); + page.vertex({ + x: 54, + y: 625, + w: 142, + h: 210, + value: "<b>공개 HTTPS</b><br><br>hmm.cloud-handson.com<br><br>hmm-backoffice.cloud-handson.com/mcp<br><br><font color=\"#AE562C\">사용자 Bearer Token</font><br><font color=\"#5B5652\">TLS · HttpOnly portal cookie</font>", + cellStyle: panelStyle({ fillColor: "#FFFFFF", strokeColor: COLORS.oracleOrange }), + }); + + boundary(page, 250, 120, 1260, 900, "Oracle Cloud Infrastructure", { + fillColor: "#FBFAF9", + }); + boundary(page, 280, 165, 930, 815, "OCI Region · ap-seoul-1", { + fillColor: COLORS.regionFill, + }); + boundary(page, 315, 210, 480, 320, "VCN · Public application subnet", { + fillColor: "#FFFFFF", + strokeColor: COLORS.oracleOrange, + dashed: true, + headingColor: COLORS.oracleOrange, + }); + + page.officialIcon(library, "Compute - Virtual Machine VM", 340, 265); + const compute = page.vertex({ + x: 445, + y: 260, + w: 320, + h: 235, + value: "", + cellStyle: panelStyle({ fillColor: "#FCFBFA", strokeColor: "#D4CFCA" }), + }); + page.vertex({ + x: 462, + y: 274, + w: 286, + h: 34, + value: "<b>Compute VM · 132.226.232.69</b>", + cellStyle: labelStyle({ fontSize: 13, bold: true }), + }); + const nginx = page.vertex({ + x: 470, + y: 320, + w: 270, + h: 42, + value: "<b>Nginx</b> · TLS / reverse proxy", + cellStyle: panelStyle({ fillColor: "#FFFFFF", strokeColor: "#D4CFCA" }), + }); + const consoleApp = page.vertex({ + x: 470, + y: 376, + w: 270, + h: 46, + value: "<b>AI Web Agent Console</b><br>Streamlit · 질문/근거/감사 UI", + cellStyle: panelStyle({ fillColor: "#FFFFFF", strokeColor: COLORS.blue }), + }); + const backoffice = page.vertex({ + x: 470, + y: 436, + w: 270, + h: 46, + value: "<b>VPD Backoffice</b><br>Spring Boot · `/mcp` · 권한 관리", + cellStyle: panelStyle({ fillColor: "#FFFFFF", strokeColor: COLORS.oracleRed }), + }); + + page.officialIcon(library, "Identity and Security - Vault", 330, 635); + const vault = page.vertex({ + x: 420, + y: 642, + w: 160, + h: 76, + value: "<b>Vault / Secrets</b><br>DB·OCI 자격증명<br><font color=\"#5B5652\">Git 외부 관리</font>", + cellStyle: panelStyle({ fillColor: "#FFFFFF", strokeColor: "#D4CFCA" }), + }); + + page.officialIcon(library, "Storage - Object Storage", 330, 800); + const objectStorage = page.vertex({ + x: 445, + y: 804, + w: 180, + h: 82, + value: "<b>Object Storage</b><br>HR 규정 PDF 원본<br>파일명·생성일 메타데이터", + cellStyle: panelStyle({ fillColor: "#FFFFFF", strokeColor: "#D4CFCA" }), + }); + + page.officialIcon(library, "Database - Autonomous DB", 805, 225); + const adb = page.vertex({ + x: 905, + y: 220, + w: 270, + h: 690, + value: "", + cellStyle: panelStyle({ fillColor: "#FFFFFF", strokeColor: COLORS.oracleRed, strokeWidth: 2 }), + }); + page.vertex({ + x: 920, + y: 238, + w: 238, + h: 40, + value: "<b>Autonomous Database · HMMAIPOC</b>", + cellStyle: labelStyle({ fontSize: 14, bold: true }), + }); + const startupGate = page.vertex({ + x: 925, + y: 294, + w: 230, + h: 72, + value: "<b>MCP Tool 계약</b><br>BACKOFFICE_MCP_TOOLS<br><font color=\"#AE562C\">시작 시 USER_AI_AGENT_TOOLS.ENABLED 검증</font>", + cellStyle: panelStyle({ fillColor: "#FFF7F2", strokeColor: COLORS.oracleOrange }), + }); + const agentTools = page.vertex({ + x: 925, + y: 382, + w: 230, + h: 78, + value: "<b>ADB Agent Tools</b><br>resolve_hr_term<br>search_hr_policy<br><font color=\"#5B5652\">DBMS_CLOUD_AI_AGENT.RUN_TOOL</font>", + cellStyle: panelStyle({ fillColor: "#FCFBFA", strokeColor: "#D4CFCA" }), + }); + const selectAi = page.vertex({ + x: 925, + y: 475, + w: 230, + h: 80, + value: "<b>search_hr_data · SELECT_AI</b><br>ADMIN: SHOWSQL 생성/검증<br>CB_ORDS: 읽기 전용 SQL 실행", + cellStyle: panelStyle({ fillColor: "#F4F8FA", strokeColor: COLORS.blue }), + }); + const vpd = page.vertex({ + x: 925, + y: 570, + w: 230, + h: 92, + value: "<b>Bearer → Secure Context → VPD</b><br>HMM_ACCESS_CTX<br>HMM_LEAVE_SCOPE_POLICY<br><font color=\"#C74634\">SELF · MANAGED_TEAM · ALL</font>", + cellStyle: panelStyle({ fillColor: "#FFF7F2", strokeColor: COLORS.oracleRed }), + }); + const hrData = page.vertex({ + x: 925, + y: 678, + w: 230, + h: 72, + value: "<b>HMM HR 정형 데이터</b><br>직원·팀·휴가·근태<br>역할·그룹·권한·Token hash", + cellStyle: panelStyle({ fillColor: "#FCFBFA", strokeColor: "#D4CFCA" }), + }); + const vectorData = page.vertex({ + x: 925, + y: 765, + w: 230, + h: 62, + value: "<b>정책 지식</b><br>Abstract · Tag · Chunk · Embed 4 Vector", + cellStyle: panelStyle({ fillColor: "#FCFBFA", strokeColor: "#D4CFCA" }), + }); + const federation = page.vertex({ + x: 925, + y: 842, + w: 230, + h: 52, + value: "<b>Federation View</b><br>HMM_RDS_*_V · 선사 배정 View", + cellStyle: panelStyle({ fillColor: "#FCFBFA", strokeColor: "#D4CFCA" }), + }); + + boundary(page, 1235, 165, 240, 300, "OCI Region · us-chicago-1", { + fillColor: COLORS.regionFill, + }); + page.officialIcon(library, "Analytics and AI - Artificial Intelligence", 1260, 220); + const genai = page.vertex({ + x: 1260, + y: 320, + w: 190, + h: 110, + value: "<b>OCI Generative AI</b><br><br>GPT-5.4 Mini<br><font color=\"#5B5652\">질문 계획 · SQL 생성 · 답변</font><br><br>Cohere Embed 4<br><font color=\"#5B5652\">용어·문서 Vector</font>", + cellStyle: panelStyle({ fillColor: "#FFFFFF", strokeColor: COLORS.oracleOrange }), + }); + + boundary(page, 1535, 120, 235, 900, "3rd Party Cloud · AWS", { + fillColor: "#FFFFFF", + strokeColor: COLORS.thirdParty, + dashed: true, + headingColor: COLORS.thirdParty, + }); + const rds = page.vertex({ + x: 1570, + y: 530, + w: 165, + h: 180, + value: "<b>AWS RDS PostgreSQL</b><br><br>hmm_demo.carriers<br>carrier_monthly_performance<br><br><font color=\"#5B5652\">가상 선사 8개<br>월간 실적 144행</font>", + cellStyle: style({ + shape: "cylinder3", + boundedLbl: 1, + backgroundOutline: 1, + size: 15, + whiteSpace: "wrap", + html: 1, + fillColor: "#F9FAFB", + strokeColor: COLORS.thirdParty, + fontFamily: "Oracle Sans", + fontColor: COLORS.ink, + fontSize: 12, + spacingTop: 12, + }), + }); + + page.edge({ + source: users, + target: nginx, + value: "HTTPS · 질문/관리", + cellStyle: edgeStyle({ strokeColor: COLORS.blue, exitX: 1, exitY: 0.35, entryX: 0, entryY: 0.5 }), + }); + page.edge({ + source: externalAgent, + target: backoffice, + value: "MCP initialize · tools/list · tools/call", + cellStyle: edgeStyle({ strokeColor: COLORS.oracleRed, exitX: 1, exitY: 0.5, entryX: 0, entryY: 0.5 }), + }); + page.edge({ + source: nginx, + target: consoleApp, + value: "", + cellStyle: edgeStyle({ strokeColor: COLORS.blue, exitX: 0.5, exitY: 1, entryX: 0.5, entryY: 0 }), + }); + page.edge({ + source: consoleApp, + target: backoffice, + value: "MCP", + cellStyle: edgeStyle({ strokeColor: COLORS.oracleRed, exitX: 1, exitY: 0.5, entryX: 1, entryY: 0.5 }), + points: [[780, 399], [780, 459]], + }); + page.edge({ + source: backoffice, + target: startupGate, + value: "JDBC · Tool 호출", + cellStyle: edgeStyle({ strokeColor: COLORS.oracleRed, exitX: 1, exitY: 0.5, entryX: 0, entryY: 0.5 }), + points: [[805, 459], [885, 459], [885, 330]], + }); + page.edge({ + source: startupGate, + target: agentTools, + value: "ENABLED", + cellStyle: edgeStyle({ strokeColor: COLORS.success, exitX: 0.5, exitY: 1, entryX: 0.5, entryY: 0 }), + }); + page.edge({ + source: startupGate, + target: selectAi, + value: "Java Tool", + cellStyle: edgeStyle({ strokeColor: COLORS.blue, exitX: 1, exitY: 0.5, entryX: 1, entryY: 0.5 }), + points: [[1170, 330], [1170, 515]], + }); + page.edge({ + source: selectAi, + target: vpd, + value: "동일 CB_ORDS session", + cellStyle: edgeStyle({ strokeColor: COLORS.oracleRed, exitX: 0.5, exitY: 1, entryX: 0.5, entryY: 0 }), + }); + page.edge({ + source: vpd, + target: hrData, + value: "predicate 자동 적용", + cellStyle: edgeStyle({ strokeColor: COLORS.oracleRed, exitX: 0.5, exitY: 1, entryX: 0.5, entryY: 0 }), + }); + page.edge({ + source: objectStorage, + target: vectorData, + value: "PDF ingest · 청킹", + cellStyle: edgeStyle({ dashed: true, strokeColor: COLORS.oracleOrange, exitX: 1, exitY: 0.5, entryX: 0, entryY: 0.5 }), + }); + page.edge({ + source: vault, + target: compute, + value: "runtime secret", + cellStyle: edgeStyle({ dashed: true, strokeColor: COLORS.regionStroke, exitX: 0.5, exitY: 0, entryX: 0, entryY: 1 }), + }); + page.edge({ + source: adb, + target: genai, + value: "모델 호출", + cellStyle: edgeStyle({ dashed: true, strokeColor: COLORS.oracleOrange, exitX: 1, exitY: 0.28, entryX: 0, entryY: 0.55 }), + }); + page.edge({ + source: federation, + target: rds, + value: "HMM_RDS_PG_LINK · TLS 5432", + cellStyle: edgeStyle({ strokeColor: COLORS.thirdParty, exitX: 1, exitY: 0.5, entryX: 0, entryY: 0.5 }), + }); + + page.vertex({ + x: 1545, + y: 830, + w: 215, + h: 105, + value: "<b>읽기 책임 분리</b><br>RDS: 선사 실적 원장<br>ADB: 직원·배정·권한·VPD<br>MCP: 허용된 View만 자연어 조회", + cellStyle: panelStyle({ fillColor: "#F9FAFB", strokeColor: COLORS.thirdParty }), + }); + page.vertex({ + x: 280, + y: 985, + w: 1195, + h: 24, + value: "※ hmm-mcp.cloud-handson.com은 공용 호환 게이트웨이입니다. 사용자별 VPD MCP의 기준 주소는 hmm-backoffice.cloud-handson.com/mcp입니다.", + cellStyle: labelStyle({ fontSize: 11, fontColor: COLORS.muted }), + }); + return page.result(); +} + +function numberedBox(page, number, x, y, w, h, heading, body, options = {}) { + const box = page.vertex({ + x, + y, + w, + h, + value: `<b>${heading}</b><br>${body}`, + cellStyle: panelStyle({ + fillColor: options.fillColor || "#FFFFFF", + strokeColor: options.strokeColor || "#D4CFCA", + align: "left", + verticalAlign: "middle", + spacing: 10, + spacingLeft: 22, + spacingRight: 8, + fontSize: options.fontSize || 11, + }), + }); + page.vertex({ + x: x - 12, + y: y + 10, + w: 30, + h: 30, + value: `<b><font color=\"#FFFFFF\">${number}</font></b>`, + cellStyle: style({ + ellipse: 1, + shape: "ellipse", + whiteSpace: "wrap", + html: 1, + fillColor: options.badgeColor || COLORS.oracleRed, + strokeColor: options.badgeColor || COLORS.oracleRed, + fontFamily: "Oracle Sans", + fontSize: 13, + align: "center", + verticalAlign: "middle", + }), + }); + return box; +} + +function addSecurityFlowPage(library) { + const page = createPage("02 · MCP 요청과 VPD", "hmm-security-flow", 1800, 1050); + title( + page, + "MCP Tool Discovery와 사용자별 VPD 실행 흐름", + "광고 계약 검증은 시작 시 1회 · 사용자 인증과 Context 설정·SQL 실행·정리는 요청마다 같은 세션에서 수행", + 1800, + ); + + boundary(page, 35, 120, 1730, 185, "서버 시작 · Tool 광고 전 Fail-Closed Gate", { + fillColor: "#FFF7F2", + strokeColor: COLORS.oracleOrange, + headingColor: COLORS.oracleOrange, + }); + const config = numberedBox(page, "A", 95, 185, 300, 78, "BACKOFFICE_MCP_TOOLS", "공개 이름 · 설명 · 입력 schema<br>AGENT_TOOL targetName", { + strokeColor: COLORS.oracleOrange, + badgeColor: COLORS.oracleOrange, + }); + const validator = numberedBox(page, "B", 510, 185, 330, 78, "McpAgentToolStartupValidator", "AGENT_TOOL targetName 중복 제거<br>SELECT_AI는 DB Tool 검증에서 제외", { + strokeColor: COLORS.oracleOrange, + badgeColor: COLORS.oracleOrange, + }); + const metadata = numberedBox(page, "C", 955, 185, 330, 78, "USER_AI_AGENT_TOOLS", "Tool 존재 + STATUS=ENABLED 확인", { + strokeColor: COLORS.oracleOrange, + badgeColor: COLORS.oracleOrange, + }); + const ready = numberedBox(page, "D", 1400, 185, 285, 78, "Endpoint Ready", "모두 정상일 때만 tools/list 광고<br><font color=\"#C74634\">누락·비활성·조회 오류는 기동 실패</font>", { + strokeColor: COLORS.success, + badgeColor: COLORS.success, + }); + page.edge({ source: config, target: validator, value: "구성 로드", cellStyle: edgeStyle({ strokeColor: COLORS.oracleOrange }) }); + page.edge({ source: validator, target: metadata, value: "시작 시 1회 조회", cellStyle: edgeStyle({ strokeColor: COLORS.oracleOrange }) }); + page.edge({ source: metadata, target: ready, value: "모두 ENABLED", cellStyle: edgeStyle({ strokeColor: COLORS.success }) }); + + boundary(page, 35, 330, 225, 665, "MCP Client", { fillColor: "#F9FAFB" }); + page.officialIcon(library, "Identity and Security - User", 95, 385); + const client = numberedBox(page, 1, 70, 500, 160, 100, "Agent 요청", "initialize<br>tools/list<br>tools/call", { + strokeColor: COLORS.blue, + badgeColor: COLORS.blue, + }); + const response = numberedBox(page, 10, 70, 800, 160, 115, "필터링 결과", "허용 행 + 근거만 반환<br>Token·내부 SQL은 미노출", { + strokeColor: COLORS.success, + badgeColor: COLORS.success, + }); + + boundary(page, 285, 330, 650, 665, "VPD Backoffice · Spring Boot", { + fillColor: "#FCFBFA", + }); + const auth = numberedBox(page, 2, 330, 400, 250, 110, "Bearer 인증", "Token SHA-256 hash<br>만료·회수·재직 상태 검증<br><font color=\"#C74634\">실패: HTTP 401</font>", { + strokeColor: COLORS.oracleRed, + }); + const router = numberedBox(page, 3, 650, 400, 235, 110, "MCP Tool Router", "catalog에서 이름·인자 검증<br>AGENT_TOOL / SELECT_AI 분기", { + strokeColor: COLORS.oracleRed, + }); + const agentTool = numberedBox(page, 4, 350, 590, 250, 130, "ADB AGENT_TOOL", "resolve_hr_term · search_hr_policy<br>동일 기본 JDBC session<br>SET_USER_BY_BEARER<br>→ RUN_TOOL → CLEAR_USER", { + strokeColor: COLORS.oracleOrange, + badgeColor: COLORS.oracleOrange, + fontSize: 10, + }); + const showSql = numberedBox(page, 5, 650, 590, 235, 125, "search_hr_data", "ADMIN 생성 세션<br>DBMS_CLOUD_AI.GENERATE<br>action=showsql<br>SELECT/WITH + 승인 객체 검증", { + strokeColor: COLORS.blue, + badgeColor: COLORS.blue, + }); + page.edge({ source: client, target: auth, value: "Authorization: Bearer …", cellStyle: edgeStyle({ strokeColor: COLORS.oracleRed }) }); + page.edge({ source: auth, target: router, value: "인증된 employee", cellStyle: edgeStyle({ strokeColor: COLORS.oracleRed }) }); + page.edge({ source: router, target: agentTool, value: "AGENT_TOOL", cellStyle: edgeStyle({ strokeColor: COLORS.oracleOrange, exitX: 0.25, exitY: 1, entryX: 0.5, entryY: 0 }) }); + page.edge({ source: router, target: showSql, value: "SELECT_AI", cellStyle: edgeStyle({ strokeColor: COLORS.blue, exitX: 0.75, exitY: 1, entryX: 0.5, entryY: 0 }) }); + + boundary(page, 960, 330, 805, 665, "Autonomous Database · 보안 실행 경계", { + fillColor: COLORS.regionFill, + strokeColor: COLORS.oracleRed, + }); + page.officialIcon(library, "Database - Autonomous DB", 995, 370); + const setContext = numberedBox(page, 6, 1100, 390, 285, 110, "CB_ORDS 동일 JDBC 세션", "CB_ORDS_HANDLER_PKG<br>SET_VPD_CONTEXT<br>Runtime principal·context 일치 검증", { + strokeColor: COLORS.oracleRed, + }); + const context = numberedBox(page, 7, 1445, 390, 270, 110, "Secure Application Context", "HMM_ACCESS_CTX_PKG<br>SET_USER_BY_BEARER<br>EMPLOYEE_ID · CODE · TEAM_ID", { + strokeColor: COLORS.oracleRed, + }); + const execute = numberedBox(page, 8, 1100, 585, 285, 125, "읽기 전용 SQL 실행", "CB_ORDS · SET TRANSACTION READ ONLY<br>EXEMPT ACCESS POLICY 없음<br>승인된 HR Table/View만 조회", { + strokeColor: COLORS.blue, + badgeColor: COLORS.blue, + }); + const policy = numberedBox(page, "8a", 1445, 585, 270, 125, "HMM_LEAVE_SCOPE_POLICY", "SYS_CONTEXT 기반 predicate 자동 적용<br><b>VIEWER → SELF</b><br><b>MANAGER → MANAGED_TEAM</b><br><b>ADMIN role → ALL</b>", { + strokeColor: COLORS.oracleRed, + }); + const cleanup = numberedBox(page, 9, 1100, 805, 615, 95, "항상 정리", "결과 읽기 → ROLLBACK → CB_ORDS_HANDLER_PKG · CLEAR_VPD_CONTEXT<br><font color=\"#5B5652\">성공·실패와 무관하게 session context와 client identifier 제거</font>", { + strokeColor: COLORS.success, + badgeColor: COLORS.success, + }); + page.edge({ source: showSql, target: setContext, value: "검증된 SQL + 원문 Bearer", cellStyle: edgeStyle({ strokeColor: COLORS.oracleRed }) }); + page.edge({ + source: agentTool, + target: response, + value: "Agent Tool 결과 · CLEAR_USER", + cellStyle: edgeStyle({ dashed: true, strokeColor: COLORS.success, exitX: 1, exitY: 0.5, entryX: 1, entryY: 0.5 }), + points: [[635, 655], [635, 760], [280, 760], [280, 855]], + }); + page.edge({ source: setContext, target: context, value: "SET_USER_BY_BEARER", cellStyle: edgeStyle({ strokeColor: COLORS.oracleRed }) }); + page.edge({ source: setContext, target: execute, value: "context 확인 후 실행", cellStyle: edgeStyle({ strokeColor: COLORS.blue, exitX: 0.5, exitY: 1, entryX: 0.5, entryY: 0 }) }); + page.edge({ source: context, target: policy, value: "SYS_CONTEXT", cellStyle: edgeStyle({ strokeColor: COLORS.oracleRed, exitX: 0.5, exitY: 1, entryX: 0.5, entryY: 0 }) }); + page.edge({ source: execute, target: policy, value: "SELECT → predicate 주입", cellStyle: edgeStyle({ strokeColor: COLORS.oracleRed }) }); + page.edge({ source: policy, target: cleanup, value: "허용 행", cellStyle: edgeStyle({ strokeColor: COLORS.success, exitX: 0.5, exitY: 1, entryX: 0.8, entryY: 0 }) }); + page.edge({ source: execute, target: cleanup, value: "result set", cellStyle: edgeStyle({ strokeColor: COLORS.success, exitX: 0.5, exitY: 1, entryX: 0.2, entryY: 0 }) }); + page.edge({ + source: cleanup, + target: response, + value: "정제된 Tool 결과", + cellStyle: edgeStyle({ strokeColor: COLORS.success, exitX: 0, exitY: 0.5, entryX: 1, entryY: 0.5 }), + points: [[950, 945], [270, 945]], + }); + + page.vertex({ + x: 330, + y: 790, + w: 555, + h: 110, + value: "<b>보안 불변조건</b><br>• Token 원문은 DB·로그·응답·Git에 저장하지 않음<br>• SQL 생성 ADMIN과 실행 CB_ORDS를 분리<br>• 컨텍스트 설정과 보호 객체 SELECT는 반드시 같은 connection<br>• 권한 또는 메타데이터가 불완전하면 결과를 축소하는 대신 요청/기동 실패", + cellStyle: panelStyle({ fillColor: "#FFF7F2", strokeColor: COLORS.oracleRed, align: "left", verticalAlign: "middle", spacing: 10 }), + }); + return page.result(); +} + +function writeDrawio(library) { + const diagrams = [addOverviewPage(library), addSecurityFlowPage(library)]; + const mxfile = [ + '<?xml version="1.0" encoding="UTF-8"?>', + '<mxfile host="app.diagrams.net" modified="2026-08-04T00:00:00.000Z" agent="cloud-handson" version="24.2" type="device" compressed="false">', + ...diagrams, + "</mxfile>", + ].join("\n"); + fs.mkdirSync(outputDir, { recursive: true }); + const output = path.join(outputDir, "hmm-ai-data-access-architecture.drawio"); + fs.writeFileSync(output, mxfile, "utf8"); + return output; +} + +const library = readLibrary(libraryPath); +const output = writeDrawio(library); +console.log(output); diff --git a/tools/architecture/validate-hmm-architecture.mjs b/tools/architecture/validate-hmm-architecture.mjs new file mode 100644 index 0000000..a2b139d --- /dev/null +++ b/tools/architecture/validate-hmm-architecture.mjs @@ -0,0 +1,82 @@ +#!/usr/bin/env node + +import fs from "node:fs"; +import path from "node:path"; + +const architectureDir = path.resolve(process.argv[2] || "docs/architecture"); +const drawioPath = path.join( + architectureDir, + "hmm-ai-data-access-architecture.drawio", +); +const drawio = fs.readFileSync(drawioPath, "utf8"); +const diagrams = [...drawio.matchAll( + /<diagram\b[^>]*name="([^"]+)"[^>]*>([\s\S]*?)<\/diagram>/g, +)]; + +function assert(condition, message) { + if (!condition) { + throw new Error(message); + } +} + +assert(diagrams.length === 2, `Expected 2 pages, found ${diagrams.length}`); +assert( + diagrams.map((match) => match[1]).join("|") === + "01 · 전체 구성|02 · MCP 요청과 VPD", + "Unexpected Draw.io page names", +); + +for (const [name, page] of diagrams.map((match) => [match[1], match[2]])) { + const ids = [...page.matchAll(/<mxCell\b[^>]*\bid="([^"]+)"/g)] + .map((match) => match[1]); + assert(ids.length === new Set(ids).size, `Duplicate mxCell id in ${name}`); + assert(page.includes("shape=stencil("), `OCI stencil missing in ${name}`); +} + +const requiredText = [ + "Autonomous Database", + "OCI Generative AI", + "Object Storage", + "AWS RDS PostgreSQL", + "BACKOFFICE_MCP_TOOLS", + "USER_AI_AGENT_TOOLS.ENABLED", + "CB_ORDS", + "HMM_ACCESS_CTX", + "HMM_LEAVE_SCOPE_POLICY", + "HMM_RDS_PG_LINK", + "SET_USER_BY_BEARER", + "CLEAR_VPD_CONTEXT", +]; +for (const text of requiredText) { + assert(drawio.includes(text), `Required architecture text missing: ${text}`); +} + +const forbidden = [ + /vpd_live_[A-Za-z0-9_-]{8,}/, + /Bearer\s+[A-Za-z0-9_-]{20,}/, + /BEGIN (?:RSA |OPENSSH )?PRIVATE KEY/, + /Dhfkzmf#/, +]; +for (const pattern of forbidden) { + assert(!pattern.test(drawio), `Sensitive value pattern found: ${pattern}`); +} + +const renderNames = [ + "hmm-ai-data-access-architecture-overview", + "hmm-ai-data-access-architecture-security-flow", +]; +for (const name of renderNames) { + const svg = fs.readFileSync(path.join(architectureDir, `${name}.svg`), "utf8"); + assert(svg.includes("<svg"), `Invalid SVG render: ${name}`); + const png = fs.readFileSync(path.join(architectureDir, `${name}.png`)); + assert( + png.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])), + `Invalid PNG render: ${name}`, + ); + const width = png.readUInt32BE(16); + const height = png.readUInt32BE(20); + assert(width >= 1600 && height >= 900, `Render is too small: ${name} ${width}x${height}`); + console.log(`${name}: ${width}x${height}`); +} + +console.log("HMM OCI architecture validation: PASS");