{
  "issueId": "4252",
  "environment": "dev",
  "generatedAt": "2026-10-06T19:34:44.443357+09:00",
  "baseUrl": "https://store-dev.biscuitpay.com",
  "phase": "executed-dev-qa",
  "summary": {
    "status": "PASS",
    "total": 12,
    "passed": 12,
    "failed": 0,
    "blocked": 0,
    "personalManualPending": 0,
    "automatedPassed": 11,
    "userReportedManualPassed": 1,
    "skipped": 0,
    "flaky": 0
  },
  "rows": [
    {
      "number": 1,
      "title": "계정별 홈/새로고침에서 소속·지갑·잔액·정산 정보가 현재 계정과 일치한다.",
      "status": "PASS",
      "detail": "A/B 홈 및 새로고침에서 현재 소속·지갑 확인. A W-60325 / 116,612원 / 정산 -1,906원, B W-60803 / 7,992원 / 정산 0원.",
      "role": "VE",
      "page": "스토어 개발계",
      "checklistItem": "계정별 홈/새로고침에서 소속·지갑·잔액·정산 정보가 현재 계정과 일치한다.",
      "actual": "A/B 홈 및 새로고침에서 현재 소속·지갑 확인. A W-60325 / 116,612원 / 정산 -1,906원, B W-60803 / 7,992원 / 정산 0원.",
      "expected": "계정별 홈/새로고침에서 소속·지갑·잔액·정산 정보가 현재 계정과 일치한다.",
      "evidence": [
        "artifacts/verification.json",
        "artifacts/B-regression.json"
      ]
    },
    {
      "number": 2,
      "title": "본인 지갑 선택 → 금액 입력 → 출금 확인 정상 진입, 입력·수수료가 정확하고 권한 오류가 없다.",
      "status": "PASS",
      "detail": "A/B 모두 1,000원 입력 후 최종 확인 화면 진입. 수수료 330원, 최종 이체 금액 670원. 본인 지갑 정책 HTTP 200/OFF. 송금 미실행.",
      "role": "VE",
      "page": "스토어 개발계",
      "checklistItem": "본인 지갑 선택 → 금액 입력 → 출금 확인 정상 진입, 입력·수수료가 정확하고 권한 오류가 없다.",
      "actual": "A/B 모두 1,000원 입력 후 최종 확인 화면 진입. 수수료 330원, 최종 이체 금액 670원. 본인 지갑 정책 HTTP 200/OFF. 송금 미실행.",
      "expected": "본인 지갑 선택 → 금액 입력 → 출금 확인 정상 진입, 입력·수수료가 정확하고 권한 오류가 없다.",
      "evidence": [
        "artifacts/screenshots/A-confirm.png",
        "artifacts/screenshots/B-confirm.png"
      ]
    },
    {
      "number": 3,
      "title": "다른 부서 출금 지갑 접근 권한 오류 조건에서 **선택한 출금 지갑에 접근 권한이 없습니다. 출금 지갑을 확인해 주세요.** 표시, 기존 생체인증 정책 조회 실패 문구 미표시.",
      "status": "PASS",
      "detail": "PASS (조회값 조정 재현). 다른 제공 계정의 부서로 정책 sourceId를 변경해 실제 서버 HTTP 403/SOURCE_ACCESS_DENIED를 받음. 수정 문구 표시, 기존 생체 정책 오류 문구 미표시. 응답 모킹 없음. 자연 UI에서 타 부서 지갑 선택은 재현하지 않음.",
      "role": "VE",
      "page": "스토어 개발계",
      "checklistItem": "다른 부서 출금 지갑 접근 권한 오류 조건에서 **선택한 출금 지갑에 접근 권한이 없습니다. 출금 지갑을 확인해 주세요.** 표시, 기존 생체인증 정책 조회 실패 문구 미표시.",
      "actual": "PASS (조회값 조정 재현). 다른 제공 계정의 부서로 정책 sourceId를 변경해 실제 서버 HTTP 403/SOURCE_ACCESS_DENIED를 받음. 수정 문구 표시, 기존 생체 정책 오류 문구 미표시. 응답 모킹 없음. 자연 UI에서 타 부서 지갑 선택은 재현하지 않음.",
      "expected": "다른 부서 출금 지갑 접근 권한 오류 조건에서 **선택한 출금 지갑에 접근 권한이 없습니다. 출금 지갑을 확인해 주세요.** 표시, 기존 생체인증 정책 조회 실패 문구 미표시.",
      "evidence": [
        "artifacts/permission-ui.json",
        "artifacts/screenshots/real403-ui.png"
      ]
    },
    {
      "number": 4,
      "title": "생체인증 미사용 계정은 기존 비밀번호 인증 안내가 정상이다.",
      "status": "PASS",
      "detail": "TRANSFER_PASSWORD_REQUIRED 활성화 후 A/B 실제 개발계 재검증 PASS. 테넌트 HTTP 200 기능 포함, 생체 정책 HTTP 200/OFF 확인. 최종 확인의 다음 버튼 → /transfer/password → 이체 비밀번호 확인/4~6자리 입력 안내 정상. type=password 빈 입력 및 입력 전 송금 버튼 비활성 확인. 비밀번호 입력·송금 제출은 미실행.",
      "role": "VE",
      "page": "스토어 개발계",
      "checklistItem": "생체인증 미사용 계정은 기존 비밀번호 인증 안내가 정상이다.",
      "actual": "TRANSFER_PASSWORD_REQUIRED 활성화 후 A/B 실제 개발계 재검증 PASS. 테넌트 HTTP 200 기능 포함, 생체 정책 HTTP 200/OFF 확인. 최종 확인의 다음 버튼 → /transfer/password → 이체 비밀번호 확인/4~6자리 입력 안내 정상. type=password 빈 입력 및 입력 전 송금 버튼 비활성 확인. 비밀번호 입력·송금 제출은 미실행.",
      "expected": "생체인증 미사용 계정은 기존 비밀번호 인증 안내가 정상이다.",
      "evidence": [
        "artifacts/password-required.json",
        "artifacts/screenshots/A-password-required.png",
        "artifacts/screenshots/B-password-required.png"
      ]
    },
    {
      "number": 5,
      "title": "생체인증 사용 계정의 기존 앱 인증 안내와 정상 이체 흐름을 사용자 수동 결과로 확인한다.",
      "status": "PASS",
      "detail": "사용자 앱 수동 결과 PASS. 최초 로그인 → 이체정보 입력 → 생체인증 등록 → 이체 성공. 재로그인 → 이체정보 입력 → 생체인증 성공. 채팅 보고를 근거로 판정했으며 자동 재현/스크린샷 검증과 구분한다. 두 번째 흐름의 이체 완료는 별도 확인된 것으로 기록하지 않는다.",
      "verificationMethod": "USER_REPORTED_MANUAL",
      "evidence": [
        "artifacts/biometric-manual-result.json"
      ],
      "role": "VE",
      "page": "스토어 앱(사용자 수동)",
      "checklistItem": "생체인증 사용 계정의 기존 앱 인증 안내와 정상 이체 흐름을 사용자 수동 결과로 확인한다.",
      "actual": "사용자 앱 수동 결과 PASS. 최초 로그인 → 이체정보 입력 → 생체인증 등록 → 이체 성공. 재로그인 → 이체정보 입력 → 생체인증 성공. 채팅 보고를 근거로 판정했으며 자동 재현/스크린샷 검증과 구분한다. 두 번째 흐름의 이체 완료는 별도 확인된 것으로 기록하지 않는다.",
      "expected": "생체인증 사용 계정의 기존 앱 인증 안내와 정상 이체 흐름을 사용자 수동 결과로 확인한다."
    },
    {
      "number": 6,
      "title": "같은 계정·부서에서 화면 내 뒤로가기·재진입 시 지갑·입력·수수료가 불필요하게 초기화되지 않는다. 새로고침 입력 보존은 요구하지 않는다.",
      "status": "PASS",
      "detail": "A/B 모두 최종 확인 → 이전 → 재진입 시 금액 1,000원·본인 지갑·수수료 330원 유지. B 최초 자동 판정은 경로 전환 전 관찰 오류였으며 step3 진입/330원 표시 대기 후 재검증 통과.",
      "role": "VE",
      "page": "스토어 개발계",
      "checklistItem": "같은 계정·부서에서 화면 내 뒤로가기·재진입 시 지갑·입력·수수료가 불필요하게 초기화되지 않는다. 새로고침 입력 보존은 요구하지 않는다.",
      "actual": "A/B 모두 최종 확인 → 이전 → 재진입 시 금액 1,000원·본인 지갑·수수료 330원 유지. B 최초 자동 판정은 경로 전환 전 관찰 오류였으며 step3 진입/330원 표시 대기 후 재검증 통과.",
      "expected": "같은 계정·부서에서 화면 내 뒤로가기·재진입 시 지갑·입력·수수료가 불필요하게 초기화되지 않는다. 새로고침 입력 보존은 요구하지 않는다.",
      "evidence": [
        "artifacts/verification.json",
        "artifacts/B-retention.json"
      ]
    },
    {
      "number": 7,
      "title": "A 출금 입력 후 로그아웃 → B 로그인 → 출금 진입 시 A 지갑·금액·인증 상태가 남지 않는다.",
      "status": "PASS",
      "detail": "A 금액 입력 후 앱 로그아웃 → B PIN 로그인 → 송금 진입. B 잔액 7,992원, 입금 계좌 입력 빈 값, A 잔액/입력 미표시.",
      "role": "VE",
      "page": "스토어 개발계",
      "checklistItem": "A 출금 입력 후 로그아웃 → B 로그인 → 출금 진입 시 A 지갑·금액·인증 상태가 남지 않는다.",
      "actual": "A 금액 입력 후 앱 로그아웃 → B PIN 로그인 → 송금 진입. B 잔액 7,992원, 입금 계좌 입력 빈 값, A 잔액/입력 미표시.",
      "expected": "A 출금 입력 후 로그아웃 → B 로그인 → 출금 진입 시 A 지갑·금액·인증 상태가 남지 않는다.",
      "evidence": [
        "artifacts/verification.json"
      ]
    },
    {
      "number": 8,
      "title": "A → B → A 로그인 때 홈 소속·지갑·잔액이 매번 현재 계정 기준이다.",
      "status": "PASS",
      "detail": "동일 브라우저 컨텍스트에서 A → B → A 앱 로그인. 홈 이름·잔액이 매번 해당 계정으로 변경.",
      "role": "VE",
      "page": "스토어 개발계",
      "checklistItem": "A → B → A 로그인 때 홈 소속·지갑·잔액이 매번 현재 계정 기준이다.",
      "actual": "동일 브라우저 컨텍스트에서 A → B → A 앱 로그인. 홈 이름·잔액이 매번 해당 계정으로 변경.",
      "expected": "A → B → A 로그인 때 홈 소속·지갑·잔액이 매번 현재 계정 기준이다.",
      "evidence": [
        "artifacts/verification.json"
      ]
    },
    {
      "number": 9,
      "title": "응답 지연 중 로그아웃 후 늦은 조회 결과로 인증이 복구되지 않는다.",
      "status": "PASS",
      "detail": "PASS (통제 지연). 실제 A 내정보 HTTP 200 응답을 보류하고 로그아웃 후 해제. 로그인 화면 유지, 인증 복구 없음.",
      "role": "VE",
      "page": "스토어 개발계",
      "checklistItem": "응답 지연 중 로그아웃 후 늦은 조회 결과로 인증이 복구되지 않는다.",
      "actual": "PASS (통제 지연). 실제 A 내정보 HTTP 200 응답을 보류하고 로그아웃 후 해제. 로그인 화면 유지, 인증 복구 없음.",
      "expected": "응답 지연 중 로그아웃 후 늦은 조회 결과로 인증이 복구되지 않는다.",
      "evidence": [
        "artifacts/delayed-verification.json"
      ]
    },
    {
      "number": 10,
      "title": "A 조회 중 B 로그인 후 늦은 A 결과가 B 정보를 덮어쓰지 않는다.",
      "status": "PASS",
      "detail": "PASS (통제 지연). 실제 A 내정보 응답 보류 중 로그아웃/B 로그인 후 해제. B 소속·잔액 유지, A 정보 덮어쓰기 없음.",
      "role": "VE",
      "page": "스토어 개발계",
      "checklistItem": "A 조회 중 B 로그인 후 늦은 A 결과가 B 정보를 덮어쓰지 않는다.",
      "actual": "PASS (통제 지연). 실제 A 내정보 응답 보류 중 로그아웃/B 로그인 후 해제. B 소속·잔액 유지, A 정보 덮어쓰기 없음.",
      "expected": "A 조회 중 B 로그인 후 늦은 A 결과가 B 정보를 덮어쓰지 않는다.",
      "evidence": [
        "artifacts/delayed-verification.json"
      ]
    },
    {
      "number": 11,
      "title": "출금 확인 정책 조회 대기 중 계정 변경 시 이전 인증 안내·출금 정보를 채택하지 않는다.",
      "status": "PASS",
      "detail": "PASS (통제 지연). 실제 A 출금 정책 응답 보류 중 로그아웃/B 로그인 후 해제. B 홈 유지, 이전 출금 화면/인증 안내 미채택.",
      "role": "VE",
      "page": "스토어 개발계",
      "checklistItem": "출금 확인 정책 조회 대기 중 계정 변경 시 이전 인증 안내·출금 정보를 채택하지 않는다.",
      "actual": "PASS (통제 지연). 실제 A 출금 정책 응답 보류 중 로그아웃/B 로그인 후 해제. B 홈 유지, 이전 출금 화면/인증 안내 미채택.",
      "expected": "출금 확인 정책 조회 대기 중 계정 변경 시 이전 인증 안내·출금 정보를 채택하지 않는다.",
      "evidence": [
        "artifacts/delayed-verification.json"
      ]
    },
    {
      "number": 12,
      "title": "메뉴 노출·접근권한은 기존 가맹점 권한을 유지한다.",
      "status": "PASS",
      "detail": "A/B 가맹점 메뉴 링크 구성 동일. 지갑·교환·결제·거래·정산·정보·카드 경로 진입과 API HTTP 200 확인. 메뉴 변경 전 기준본과 별도 비교는 하지 않음.",
      "role": "VE",
      "page": "스토어 개발계",
      "checklistItem": "메뉴 노출·접근권한은 기존 가맹점 권한을 유지한다.",
      "actual": "A/B 가맹점 메뉴 링크 구성 동일. 지갑·교환·결제·거래·정산·정보·카드 경로 진입과 API HTTP 200 확인. 메뉴 변경 전 기준본과 별도 비교는 하지 않음.",
      "expected": "메뉴 노출·접근권한은 기존 가맹점 권한을 유지한다.",
      "evidence": [
        "artifacts/verification.json",
        "artifacts/B-regression.json"
      ]
    }
  ],
  "regressions": [
    {
      "number": "R1",
      "status": "PASS",
      "detail": "A/B 지갑 조회 및 잔고 교환 화면 현재 잔액 일치. 교환 미실행."
    },
    {
      "number": "R2",
      "status": "PASS",
      "detail": "A/B 수기결제 진입, 현재 계정 가맹점 정보 및 auth MID 조회 확인. 결제 미실행."
    },
    {
      "number": "R4",
      "status": "PASS",
      "detail": "A/B 거래·정산·회원 정보 조회 HTTP 200, 현재 사용자 요청 경로 확인. 당일 내역은 0건. 회원 정보 변경 없음."
    }
  ],
  "controlledTests": {
    "permission": "Policy sourceId changed to other provided account; actual server403 response; no mocked response. Natural UI other-wallet selection unavailable.",
    "delay": "Actual server response held in Playwright then released. Loading overlay blocks normal clicks, so authorized logout/login button handlers were invoked through DOM clicks for race-condition testing. Credentials and PIN were submitted normally. Controlled race tests, not naturally observed delay."
  },
  "deploymentEvidence": {
    "url": "https://store-dev.biscuitpay.com/assets/index-DMMhMwXo.js",
    "sha256": "a56c7f91fbe4d26aa4d24f50c1045fd30970b04870eaad8b7e3cff6a2904203d",
    "markers": {
      "선택한 출금 지갑에 접근 권한이 없습니다. 출금 지갑을 확인해 주세요.": true,
      "출금 부서 정보가 일치하지 않습니다. 출금 지갑을 다시 확인해 주세요.": true,
      "인증 정보가 변경되었습니다. 출금 지갑을 다시 확인해 주세요.": true,
      "__isRequestCurrent": true,
      "생체인증 정책 조회": false
    }
  },
  "backendDevDiagnosticDeployment": "UNVERIFIED; not required for observed error mapping and state tests",
  "frontendExactCommit": "UNVERIFIED; delivered target error and context guard markers verified",
  "forbiddenMutationRequestsObserved": [],
  "externalPublishAuthorized": true,
  "transferPasswordRequiredReverification": {
    "status": "PASS",
    "accounts": [
      "A",
      "B"
    ],
    "evidence": "artifacts/password-required.json"
  },
  "overallStatus": "PASS",
  "scopeExclusions": [
    {
      "area": "비스킷카드 정보·상세·이용권한·수수료",
      "reason": "사용자 요청으로 QA 범위에서 제외",
      "changedAt": "2026-10-06T19:34:44.443357+09:00"
    }
  ]
}
