{
  "schema": "salesforce-presentation-evidence/v2",
  "projectName": "Ondo 온도",
  "primaryProduct": "Salesforce 앱 (Lightning 앱: Ondo 온도)",
  "audience": "인재경영(HR) 사내대출 담당자",
  "compiledAt": "2026-10-15T01:30:00.000Z",
  "compiledNote": "발표 자료 작성 시점에 기존 확인 기록을 옮겨 적은 요약입니다. 이 파일 자체가 새 확인을 수행한 기록은 아닙니다.",
  "redaction": "Salesforce 레코드 ID, 조직·배포 주소, 직원번호, 직원 이름, 이메일, 인증 정보는 공개하지 않습니다. 원본 기록 파일도 공개 배포에 포함하지 않습니다.",
  "nativeApp": {
    "checkedAt": "2026-10-15T01:18:16.933Z",
    "method": "부모 에이전트가 실제 Salesforce 화면(Lightning)을 열어 읽음. 레코드 변경 없음.",
    "appLabel": "Ondo 온도",
    "tabs": [
      "사내대출 신청",
      "직원",
      "회사 지원 숙소 이용"
    ],
    "record": "EL-0001",
    "fields": {
      "자금 사용 목적": "주택 임차",
      "신청일": "2026. 10. 15.",
      "신청금액(원)": "20,000,000",
      "매입·임차 금액(계약서, 원)": "200,000,000",
      "매매·임차계약서 사본 제출": "참",
      "주민등록등본 제출": "참",
      "근속개월(신청일 기준)": "31",
      "회사 지원 숙소 이용 여부": "미이용",
      "기존 주택대출 미상환 원금(원)": "0",
      "합산 금액(기존+신청, 원)": "20,000,000",
      "적용 한도(원)": "30,000,000",
      "개인 한도 판정": "한도 이내",
      "상태": "신청",
      "이자율": "2.00%",
      "계약기간(개월)": "36",
      "상환방식": "만기 일시 상환",
      "이자 납부 방식": "매월 급여 공제"
    },
    "noMutation": true,
    "screenshot": "/presentation/screenshots/native-loan-detail.png"
  },
  "metadata": {
    "source": "force-app/main/default (읽기 전용으로 확인한 배포 설정 파일)",
    "app": "ezCareAI_Employee_Loan · 라벨 Ondo 온도 · 탭 3개",
    "objects": [
      {
        "api": "Employee__c",
        "label": "직원",
        "relation": "기준 객체"
      },
      {
        "api": "EmployeeLoanRequest__c",
        "label": "사내대출 신청",
        "relation": "Employee__c 조회 관계(신청 직원)"
      },
      {
        "api": "CompanyHousingOccupancy__c",
        "label": "회사 지원 숙소 이용",
        "relation": "Employee__c 조회 관계"
      }
    ],
    "statuses": [
      {
        "value": "NEW",
        "label": "신청"
      },
      {
        "value": "REVIEW_REQUIRED",
        "label": "확인 필요"
      },
      {
        "value": "INELIGIBLE",
        "label": "대상 제외"
      },
      {
        "value": "ELIGIBLE_REVIEW",
        "label": "검토 가능"
      },
      {
        "value": "APPROVED",
        "label": "승인"
      },
      {
        "value": "REJECTED",
        "label": "반려"
      }
    ],
    "statusHelpText": "승인·반려는 담당자만 변경합니다",
    "agentforce": "aiAgents/EzMediAI_Employee_Loan_Agent · 액션 Employee_Loan_Status_Review (설정 파일 존재)",
    "flow": "Flow 설정 파일 없음"
  },
  "read": {
    "checkedAt": "2026-10-14T20:02:20.446Z",
    "method": "운영 포털 서버가 담당자(MANAGER) 계정 OAuth로 Salesforce를 읽음. 허용된 가상 직원 6명 범위.",
    "employees": 6,
    "requests": 7,
    "statusCounts": {
      "NEW": 2,
      "REVIEW_REQUIRED": 2,
      "INELIGIBLE": 2,
      "ELIGIBLE_REVIEW": 0,
      "APPROVED": 1,
      "REJECTED": 0
    },
    "samples": [
      {
        "number": "EL-0001",
        "status": "NEW",
        "requestedAmount": 20000000,
        "contractAmount": 200000000,
        "existingHousingBalance": 0,
        "interestRate": 2,
        "contractMonths": 36,
        "repaymentMethod": "만기 일시 상환"
      },
      {
        "number": "EL-0006",
        "status": "REVIEW_REQUIRED",
        "requestedAmount": 20000000,
        "contractAmount": null,
        "existingHousingBalance": 0,
        "interestRate": 2,
        "contractMonths": 36,
        "note": "계약 금액 비어 있음(null)"
      }
    ]
  },
  "missingCase": {
    "record": "EL-0006",
    "retrievedAt": "2026-10-14T17:17:15.577Z",
    "contractSubmitted": false,
    "reviewReason": "임대차계약서 사본 미제출 (규정 제8조: 미제출 시 신청 불인정)",
    "note": "검토 사유는 이전 읽기 스냅샷 값입니다. 05:02 KST 읽기에서는 상태 REVIEW_REQUIRED와 계약 금액 없음만 다시 확인했습니다."
  },
  "portalWrite": {
    "checkedAt": "2026-10-14T20:41:15.258Z",
    "method": "운영 포털에서 검증용 가짜 신청 1건 저장 → Salesforce 값 확인 → 표준 삭제",
    "status": "NEW",
    "interestRate": 2,
    "contractMonths": 36,
    "existingHousingBalance": null,
    "documentsSubmitted": false,
    "nativeRateDisplay": "2.00%",
    "cleanup": "표준 삭제로 활성 목록에서 제거(휴지통·감사 기록까지 지운 것은 아님)",
    "noApprovalOrPayment": true
  },
  "access": {
    "outsideScope": {
      "status": 403,
      "checkedAt": "2026-10-14T20:42:06.842Z"
    },
    "afterLogout": {
      "status": 401,
      "checkedAt": "2026-10-14T20:44:21.416Z"
    },
    "serverSourcePaths": {
      "status": 404,
      "count": 7,
      "checkedAt": "2026-10-14T20:42:06.842Z"
    }
  },
  "repayment": {
    "checkedAt": "2026-10-14T20:19:04.280Z",
    "record": "EL-0001",
    "rows": 36,
    "totals": "예상 원금 합계 20,000,000원 · 예상 이자 합계 1,199,988원 · 예상 총 상환액 21,199,988원",
    "note": "검증용 시작일·상환일을 넣은 예상 계산. Salesforce에 저장하지 않았고 급여 공제를 실행하지 않음."
  },
  "localTests": {
    "recordedFile": "site/evidence/tests-operational-transition.txt",
    "recordedPass": 93,
    "recordedFail": 0,
    "note": "로컬 모의(가짜 연결) 테스트입니다. 실제 운영 동작 증거가 아닙니다. 이후 실행 결과(94개 보고)는 이 자료에서 별도 확인하지 않았습니다."
  },
  "unverified": [
    "Salesforce 앱 화면에서 직접 새 신청 등록",
    "Salesforce 앱 화면에서 상태 변경(예: 신청 → 확인 필요)",
    "Agentforce 도움 기능 실제 실행과 답변 내용",
    "직원 본인 로그인",
    "결재·보험·계약 서명·메일·실제 지급·급여 공제"
  ],
  "knownIssue": "Salesforce에서 직접 새로 만들 때 이자율 기본값 설정(2)이 200%로 저장될 수 있는 문제. 수정 전 승인 필요. 포털 저장은 2%로 확인.",
  "dashboard": {
    "checkedAt": "2026-10-15T10:35:04+09:00",
    "source": "실제 운영 도메인의 담당자 로그인 화면과 상태 필터 확인",
    "manager": {
      "deployed": true,
      "employeeCount": 6,
      "requestCount": 7,
      "progressCase": "EL-0006"
    },
    "employee": {
      "deployed": true,
      "ownOnlyEnforcedByServer": true,
      "managerPreviewVerified": true,
      "actualEmployeeLoginVerified": false
    },
    "companyAggregate": {
      "published": false,
      "minimumCohort": 10,
      "minimumCell": 5,
      "legalAnonymityGuaranteed": false
    },
    "unconnected": [
      "보험 증권 확인",
      "대출계약 진행·완료",
      "실제 지급",
      "실제 업무 배정·인계"
    ]
  },
  "coursePdf": {
    "title": "Day3 - Mini Project (강사 자료)",
    "url": "https://statrack3.slack.com/files/U0BUM0FU79C/F0C9291N6GJ/day3_-_mini_project.pdf",
    "access": "Slack 로그인 필요. 자료 원본은 재배포하지 않음.",
    "pages": {
      "p1": "배운 기능으로 실제 업무 한 가지를 Salesforce 앱으로 완성",
      "p2": "앱 1개, 연결된 Object 3개 이상, 가상 레코드 5~10건, 등록·조회·상태 변경, Flow 또는 Agentforce 1개",
      "p3": "기존 조직 보호, 가짜 데이터, 정상·누락 사례",
      "p4": "앱·데이터 먼저, Agentforce·외부 연동·추가 화면은 핵심 이후 선택",
      "p6": "실제 앱에서 레코드 1건으로 등록·상태 변경·도움 기능 시연, README와 캡처"
    }
  },
  "finalQA": {
    "checkedAt": "2026-10-16T00:44:43.416Z",
    "timeZone": "Asia/Seoul",
    "deadline": "2026-10-16T09:00:00+09:00",
    "deadlineMet": false,
    "status": "PARTIAL_PASS_WITH_BLOCKERS",
    "scope": "site/ local demo only. No Salesforce configuration/record mutation, no force-app or sfdx-project.json edits by this run.",
    "presentationUrl": "http://127.0.0.1:4317/presentation/",
    "demoUrl": "http://127.0.0.1:4317/qa-demo/",
    "tests": {
      "command": "node --test site/*.test.mjs",
      "passed": 147,
      "failed": 0,
      "skipped": 0,
      "log": "site/evidence/tests-final-2026-10-16.txt",
      "initialPassed": 120,
      "note": "최종 실행 시 존재한 전체 테스트 기준. 다른 병행 작업으로 테스트 파일 집합이 초기와 달라져 순증 27개 전체가 이번 QA 추가는 아님. 이번 추가 회귀검사는 3개."
    },
    "checks": [
      {
        "id": "local-server",
        "status": "pass",
        "detail": "127.0.0.1:4317 demo. 초기 미실행으로 시작, 수정 반영을 위해 재시작."
      },
      {
        "id": "application",
        "status": "pass",
        "detail": "가상 서류 2종 미체크로 EL-0008 생성, NEW 및 누락 안내 확인."
      },
      {
        "id": "employee-isolation",
        "status": "pass",
        "detail": "프로필 전환 시 EL-0001/0008 사라지고 EL-0003/0007만 표시. 가상 프로필은 실제 인증 아님."
      },
      {
        "id": "role-gates",
        "status": "pass",
        "detail": "EMPLOYEE에서 HR 품의 체크/버튼 disabled, HR 전환 후 활성. 서버 권한은 별도 자동 테스트."
      },
      {
        "id": "approval-line",
        "status": "pass",
        "detail": "EL-0001: HR → 재경 → 팀장 → 본부장 → 대표이사 가상 결재. 신청 상태 NEW 유지."
      },
      {
        "id": "guarantee",
        "status": "pass",
        "detail": "HR 증권 수신·전액 보장·보험료 가상 체크 후 CONTRACT_READY. 실제 보험 아님."
      },
      {
        "id": "two-sided-contract",
        "status": "pass",
        "detail": "직원 확인만으로 CONTRACT_READY 유지. HR 출력·준비·회사 확인 후 CONTRACT_SIGNED. 법적 서명 아님."
      },
      {
        "id": "expense-and-payment",
        "status": "pass",
        "detail": "EXPENSE_READY → PAYMENT_REQUESTED → ACCOUNTING 요청 접수. paid=false, 신청 NEW 유지."
      },
      {
        "id": "mail-review-send",
        "status": "pass",
        "detail": "HR DRAFT의 send disabled → REVIEWED → SIMULATED_SENT. source=RULE_TEMPLATE_NOT_AGENTFORCE, actualSent=false."
      },
      {
        "id": "presentation-images",
        "status": "pass",
        "detail": "기존 native-loan-home.png/detail.png 실제 로드와 naturalWidth>0 확인. 과거 캡처이며 이번 SF 재검증 아님."
      },
      {
        "id": "presentation-diagrams",
        "status": "pass",
        "detail": "8/9장 연결 경계와 역할 인계 SVG 확인. 설명용 도식, 실제 Flow/연동 아님을 명시."
      },
      {
        "id": "presentation-navigation",
        "status": "pass",
        "detail": "1~9장 버튼 이동과 내용 확인. 실제 SF 생성/상태 변경/Agentforce 리허설은 실행하지 않음."
      },
      {
        "id": "mobile",
        "status": "blocked",
        "detail": "page.setViewportSize 미지원. 별도 headless Chrome 두 차례 시작 실패. 390px iframe 대안도 CSP 차단으로 검증 못함. 임시 경로 제거. 반응형 소스는 수정했으나 실제 390px 렌더·터치 검증 미완료."
      },
      {
        "id": "fresh-salesforce-capture",
        "status": "blocked",
        "detail": "실제 앱 링크가 로그인 화면으로 이동. 저장된 로그인 없음. 이번 실제 앱 캡처 빈자리 명시, 목업 대체 없음."
      },
      {
        "id": "live-integrations",
        "status": "blocked",
        "detail": "이번 실행의 사이트 OAuth/Agentforce 메일/보험/전자서명/실발송/실제 지급 증거 없음. 과거 기록으로 이번 완료 추정하지 않음."
      }
    ],
    "blockers": [
      {
        "id": "mobile",
        "status": "blocked",
        "detail": "page.setViewportSize 미지원. 별도 headless Chrome 두 차례 시작 실패. 390px iframe 대안도 CSP 차단으로 검증 못함. 임시 경로 제거. 반응형 소스는 수정했으나 실제 390px 렌더·터치 검증 미완료."
      },
      {
        "id": "fresh-salesforce-capture",
        "status": "blocked",
        "detail": "실제 앱 링크가 로그인 화면으로 이동. 저장된 로그인 없음. 이번 실제 앱 캡처 빈자리 명시, 목업 대체 없음."
      },
      {
        "id": "live-integrations",
        "status": "blocked",
        "detail": "이번 실행의 사이트 OAuth/Agentforce 메일/보험/전자서명/실발송/실제 지급 증거 없음. 과거 기록으로 이번 완료 추정하지 않음."
      }
    ],
    "priorEvidence": {
      "note": "기존 evidence.json 필드와 screenshots는 과거 관찰/보고이며 이번 실행 재인증 증거가 아님. 파일을 교체하거나 새 캡처처럼 표시하지 않음.",
      "newSalesforceScreenshot": null,
      "existingScreenshots": [
        "/presentation/screenshots/native-loan-home.png",
        "/presentation/screenshots/native-loan-detail.png"
      ]
    },
    "knownIssue": {
      "status": "last-reported-unverified",
      "detail": "SF 직접 신규 생성의 이자율 기본값 2 → 200% 문제는 기존 보고. 이번 재현·수정 없음. 저장/발표 전 사용자가 2.00%를 확인해야 함."
    },
    "runtime": {
      "mode": "demo",
      "bind": "127.0.0.1",
      "port": 4317,
      "persistence": "process memory only",
      "note": "수정 반영 재시작으로 이번 가상 EL-0008 및 진행 기록은 초기화됨. 브라우저 관찰은 재시작 이전 실행의 증거, 현재 저장 상태로 제시하지 않음."
    },
    "deployment": "not deployed; deploy-site/ untouched by this QA",
    "sourceHashes": {
      "server.mjs": "b99742e0089e030df64ed5c137764a7d27e8ef2a5dd2b3c9a0330f4d955d4d0d",
      "qa-demo/index.html": "cc9b4d4bdcb689fd8a9b5847566b5d41dbac013c4810ca4546dd57693dc53018",
      "qa-demo/app.js": "d9d2cd149e92615b5e7fd86ecb0c4b414ba9be833901effcd1ef3f2f3f300cb5",
      "qa-demo/style.css": "22671a515c67ce8238ddf290654a0e53920fe4ebef232694607f073949519c75",
      "presentation/index.html": "96de8781597661561b5ee1f5e94d02adc92fbe083a3aa65031d3eb85b5dc1b2b",
      "presentation/app.js": "df99c6db9390d2e09b0fd96c51a0793c903718b7e6ac15f258ee7db460d7706e",
      "presentation/style.css": "8e7101a4959f201c65087708486068db15548b6a20df9645f25f485ac1c43f0b",
      "final-qa.test.mjs": "dd01a0c1e61a4ceb8326b99b96045594f460d739de47bb3d52988bba5ac6a325"
    }
  },
  "submissionFollowup": {
    "checkedAt": "2026-10-16T01:03:50.443Z",
    "checkedAtKst": "2026-10-16 10:03:50",
    "deadline": "2026-10-16T09:00:00+09:00",
    "deadlineMet": false,
    "submitted": false,
    "status": "PROOF_ASSETS_READY_WITH_EXPLICIT_RUNTIME_LIMITS",
    "scope": "발표 후속 증거 정리. 실제 Salesforce 홈은 읽기만 수행. 이번 후속 단계의 Salesforce 설정·레코드 쓰기 없음.",
    "presentation": {
      "slides": 9,
      "diagramCount": 2,
      "localUrl": "http://127.0.0.1:4317/presentation/",
      "freshSummaryImage": "/presentation/screenshots/native-summary-2026-10-16.jpg",
      "imagesLoaded": true,
      "observedPageErrors": 0,
      "diagramNature": "설명용. 실제 Flow 또는 외부 연계 실행 증거가 아님."
    },
    "freshSalesforce": {
      "status": "PASS_READ_ONLY_HOME_SUMMARY",
      "checkedAt": "2026-10-16T09:57:35+09:00",
      "counts": {
        "employees": 6,
        "requests": 7,
        "attention": 5,
        "overdue": 0,
        "openTasks": 0
      },
      "screenshotScope": "요약 지표만. 직원명·직원번호·레코드ID·조직주소·사용자정보 제외.",
      "notVerified": [
        "개별 레코드 정확성",
        "새 신청 생성",
        "상태 변경",
        "Agentforce 도움 실행",
        "로컬 워크플로와 실제 조직의 연계"
      ]
    },
    "mobile": {
      "status": "PASS_390PX_IFRAME_LAYOUT_ONLY",
      "method": "격리된 loopback demo 서버와 테스트 프록시. 테스트 응답의 frame-ancestors만 self. 원본 server.mjs/운영 CSP 변경 없음.",
      "viewport": {
        "width": 390,
        "height": 844
      },
      "measurements": [
        {
          "id": "demo",
          "width": 390,
          "height": 844,
          "clientWidth": 375,
          "scrollWidth": 375,
          "diagram": null
        },
        {
          "id": "deck",
          "width": 390,
          "height": 844,
          "clientWidth": 375,
          "scrollWidth": 375,
          "diagram": {
            "clientWidth": 341,
            "scrollWidth": 900,
            "overflowX": "auto"
          }
        }
      ],
      "roleSwitch": "직원 역할에서 HR 확인 disabled, HR 선택 후 활성화 관찰",
      "slideNavigation": "도식8번 버튼 이동 및 새 읽기 범위 안내 확인",
      "realDevice": "NOT_TESTED",
      "touch": "NOT_TESTED",
      "productionCspCompatibility": "NOT_CLAIMED"
    },
    "tests": {
      "command": "node --test site/*.test.mjs",
      "passed": 160,
      "failed": 0,
      "skipped": 0,
      "log": "site/evidence/tests-submission-followup-2026-10-16.txt",
      "initialCount": 120,
      "note": "전체 현재 테스트 집합. 초기/이전147개와 파일 집합이 달라 순증 전체를 이번 QA 신규 테스트로 주장하지 않음. 캡처 갱신으로 과거 빈자리 문구를 기대하던 회귀검사 2개의 기대값을 읽기 증거와 실행 제한 검사로 갱신."
    },
    "simulation": {
      "priorObservation": "기존 finalQA의 결재·보험·양측계약·지급요청·SIMULATED_SENT는 그 당시 가상 브라우저 관찰로 보존.",
      "actualSent": false,
      "paid": false,
      "mailSource": "RULE_TEMPLATE_NOT_AGENTFORCE",
      "currentPersistence": "로컬 4317 서버 연결 거부를 관찰해 demo 모드로 재시작. 과거 메모리 진행 기록은 현재 저장 상태로 주장하지 않음. 모바일은 별도 독립 demo 메모리."
    },
    "blockers": [
      {
        "id": "real-device-touch",
        "detail": "390px iframe은 실기기·터치 성공을 증명하지 않음."
      },
      {
        "id": "live-integrations",
        "detail": "실제 보험·법적 전자서명·Agentforce 메일·메일 실발송·실제 지급 미검증."
      },
      {
        "id": "native-create-change-help",
        "detail": "실제 Salesforce 새 등록·상태 변경·도움 기능 실행 리허설은 수행하지 않음."
      }
    ],
    "deployment": "이 후속 결과는 로컬 소스와 제출 이미지 기준. 회귀 테스트가 deploy-site 빌드 산출물을 재생성했으나 운영 배포는 하지 않음.",
    "assets": [
      {
        "file": "diagram-connection.jpg",
        "bytes": 186531,
        "sha256": "8cbf02d58fcacc3a5569e1d636458c16423ffcfa5da5cbdcd1a46d99cc33e675"
      },
      {
        "file": "diagram-connection.svg",
        "bytes": 1779,
        "sha256": "6085b0512496b3b6c60be432745f3a0aa8194d832d9c5f8b4388171b7170552c"
      },
      {
        "file": "diagram-workflow.jpg",
        "bytes": 210231,
        "sha256": "4676b9e52836e6bc5ddbd8d7cb0d348e289840b6de6d0ca72b41cd597ffc2ab2"
      },
      {
        "file": "diagram-workflow.svg",
        "bytes": 2329,
        "sha256": "d253fce674b48ff0d5e368c5fa3552cd4142fb4e93720f0d75576e79741023f0"
      },
      {
        "file": "mobile-demo-390.png",
        "bytes": 129240,
        "sha256": "c7493639830a4eb334cac1a0f6a39a16f7cba7b87a6549301fc435e09605ad1a"
      },
      {
        "file": "mobile-diagram-390.png",
        "bytes": 129243,
        "sha256": "d01d591fd2a738301a03118f4faf2fe056f0cda294d4a7ad00279deee36b5ae1"
      },
      {
        "file": "presentation-summary.jpg",
        "bytes": 249740,
        "sha256": "da8e6f8244e50ad5dd80775293d072569d8800a7f68ceb75e6cbce8d47d172ba"
      },
      {
        "file": "salesforce-summary-2026-10-16.jpg",
        "bytes": 18768,
        "sha256": "89c23eea0c4a5d901b738ccf62e9075501966b96c7758064fbdd776ae33f9940"
      }
    ]
  }
}
