# dead-code-sample.tsv — dead_code_rule 의 코퍼스 대조 표본
# 생성: node docs/_meta/verify/extract-disputed-counts.mjs --sample-blocks ...
# 동결 SHA: insuniverse-server=4d798f55f021d93c889725e50f18cbce20272fd1 insuniverse-site=767d1e441637b5cba759acbe1f928a47f17397eb insuniverse-admin=fb001e1d26d342130cf9a8dc8fe5e8a64e1da9c8
# 모수: 11845 블록 (min_hangul_chars 통과분) · 경계층 65 · 그 밖 11780
# 열: id \t 경로:행 \t 문맥(읽기전용, » 가 판정 대상) \t 블록 원문 \t 라벨(dead|alive) \t 근거 1줄
# 라벨러: <미기입 — 사람이 채운다>   일자: <미기입>
# 채울 칸은 5·6번 둘뿐이다. 5번에 dead 또는 alive 정확히 그 문자열, 6번에 근거 1줄.
#   dead  = 주석 처리된 코드 (정책 후보에서 뺀다)
#   alive = 설명·정책·근거 서술 (정책 후보로 남긴다)
# 규칙의 판정(code 비율·dead/alive)은 이 파일에 실리지 않는다 — 라벨러가 답을 볼 수 없는 것이 독립성의 기제다.
# 문맥 3번 칸은 판정 대상이 아니다. 규칙이 보는 것은 4번 칸(블록 원문) 하나뿐이며,
# 문맥은 그 블록이 더 큰 주석 영역의 조각인지 사람이 알아보게 하기 위한 것이다.
7e7460e133eb	insuniverse-admin/src/api/adminApi.ts:43	    39   admPhone: string | null;\n    40   admPassword: string | null;\n    41 };\n    42 \n»   43 /*** [관리자] 질변코드검색 */\n    44 export const adminApi = {\n    45   /*** 관리자 신규등록 */\n    46   addAdmin: async (param: AddAdminParam) => {\n    47     return Axiosinstance.post("/admin/admin", param)	[관리자] 질변코드검색 	alive	1차 문법 판정 — 명확
2eb310f1a950	insuniverse-admin/src/api/treatLogApi.ts:41	    37     };\n    38   }[];\n    39 };\n    40 \n»   41 /*** [관리자] 분석로그 */\n    42 export const treatLogApi = {\n    43   /*** 엑셀 다운로드 */\n    44   downloadTreatLog: async (param: QueryParams): Promise<any> => {\n    45     const queryString = buildQueryString(param);	[관리자] 분석로그 	alive	관리자에 분석로그가 있다는 내용을 유추할 수 있음
180cb0fdd504	insuniverse-admin/src/app/router/routes/popup.routes.tsx:14	    10 import React from "react";\n    11 import { RouteObject } from "react-router-dom";\n    12 import { PopupGuard } from "../guards/PopupGuard";\n    13 \n»   14 // 도메인별 팝업 컴포넌트들 import\n»   15 // import ProductsSelectPopup from "@/features/campaigns/ProductsSelectPopup";\n»   16 // ... 다른 팝업 컴포넌트들\n    17 \n    18 const popupRoutes: RouteObject[] = [\n    19   {\n    20     path: "popup/*", // 와일드카드를 사용하여 하위 경로 모두 매칭	 도메인별 팝업 컴포넌트들 import\n import ProductsSelectPopup from "@/features/campaigns/ProductsSelectPopup";\n ... 다른 팝업 컴포넌트들	alive	1차 혼재(code·text 둘 다) → 2차 다수결
ed7ecd18a3d0	insuniverse-admin/src/pages/Admin/Board/Category/BoardCategoryPage.tsx:31	    27       setList(data?.list ?? []);\n    28     },\n    29   });\n    30 \n»   31   /*** 페이지 새로고침 */\n    32   const handleRefresh = () => {\n    33     const searchParams = new URLSearchParams(location.search);\n    34     searchParams.set("refresh", Math.random().toString(36).substring(7));\n    35     navigate(`${location.pathname}?${searchParams.toString()}`, {	페이지 새로고침 	alive	1차 문법 판정 — 명확
c3fd60cedd97	insuniverse-admin/src/pages/Admin/Data/BasicCompare005/DetailBasicCompare005Page.tsx:60	    56 \n    57   /*** 상세데이터 가져오기 */\n    58   const init = async () => {\n    59     if (loading) return; // 로딩 유효성\n»   60     setLoading(true); // 로딩 시작\n    61     api.compareApi.basic // 상세 조회 api\n    62       .getCompareBasicDetail(Number(id ?? 0))\n    63       .then((res) => {\n    64         if (res) {	 로딩 시작	alive	로딩을 진행함을 알 수 있음
7e566e0bb5a7	insuniverse-admin/src/pages/Admin/DiseasePrediction/RecommendedInsurance/DetailRecommendedInsurancePage.tsx:68	    64           subFineInsuranceComment: diseasePrediction?.dpcInsuranceComment,\n    65         }\n    66       );\n    67     } else if (fineCode) {\n»   68       // 세세분류 수정\n    69       apiPromise = api.diseasePredictionApi.editFine(\n    70         majorCode!,\n    71         middleCode!,\n    72         minorCode!,	 세세분류 수정	alive	세세분류가 존재함을 알 수 있음
a03b8428b0de	insuniverse-admin/src/pages/Admin/Sales/SalesAgency/DetailSalesAgencyPage.tsx:60	    56           // 실패\n    57           alert(ALERT_MSG.EDIT.fail);\n    58         }\n    59       })\n»   60       .finally(() => setLoading(false)); // 로딩 종료\n    61   };\n    62 \n    63   /*** 상세데이터 가져오기 */\n    64   const init = async () => {	 로딩 종료	alive	로딩 종료에 대해 알 수 있음
01f97e108ba0	insuniverse-admin/src/pages/Admin/Subscription/Alimtalk/AlimtalkPage.tsx:261	   257             // onChange: (id: any) => {\n   258             //   setSagId(id);\n   259             // },\n   260           },\n»  261           // {\n»  262           //   label: "영업채널명",\n»  263           //   name: "salesAgencyChannel.sacCode",\n»  264           //   usePrefix: false,\n»  265           //   useOnlyLastKey: true,\n»  266           //   options: [\n»  267           //     { label: "전체", value: "" },\n»  268           //     { label: "해당없음", value: "none" },\n»  269           //   ].concat(channel),\n»  270           // },\n   271           {\n   272             label: "회원타입",\n   273             name: "member.memType",\n   274             options: [	 {\n   label: "영업채널명",\n   name: "salesAgencyChannel.sacCode",\n   usePrefix: false,\n   useOnlyLastKey: true,\n   options: [\n     { label: "전체", value: "" },\n     { label: "해당없음", value: "none" },\n   ].concat(channel),\n },	dead	주석된 코드임
9b08c6e87f49	insuniverse-admin/src/pages/Admin/Subscription/AnalysisLog/AnalysisLogPage.tsx:239	   235             // onChange: (id: any) => {\n   236             //   setSagId(id);\n   237             // },\n   238           },\n»  239           // {\n»  240           //   label: "영업채널명",\n»  241           //   name: "salesAgencyChannel.sacCode",\n»  242           //   usePrefix: false,\n»  243           //   useOnlyLastKey: true,\n»  244           //   options: [\n»  245           //     { label: "전체", value: "" },\n»  246           //     { label: "해당없음", value: "none" },\n»  247           //   ].concat(channel),\n»  248           // },\n   249           {\n   250             label: "회원타입",\n   251             name: "log.memType",\n   252             options: [	 {\n   label: "영업채널명",\n   name: "salesAgencyChannel.sacCode",\n   usePrefix: false,\n   useOnlyLastKey: true,\n   options: [\n     { label: "전체", value: "" },\n     { label: "해당없음", value: "none" },\n   ].concat(channel),\n },	dead	주석처리된 코드임
b5bb0dab6358	insuniverse-admin/src/pages/Admin/Subscription/TreatMonitor/TreatMonitorPage.tsx:456	   452     <td>{fmt(w.inProgress)}</td>\n   453   </tr>\n   454 );\n   455 \n»  456 //* 비율(0~1) → '85.7%'. null이면 '-'.\n   457 const fmtPct = (r: number | null) =>\n   458   r === null || r === undefined ? "-" : `${(r * 100).toFixed(1)}%`;\n   459 \n   460 //* 긍정 비율(높을수록 좋음) 색 — 좋음(≥80)/주의(50~79)/나쁨(<50). null이면 무색.	* 비율(0~1) → '85.7%'. null이면 '-'.	alive	1차 문법 판정 — 명확
9928fd09e1dc	insuniverse-admin/src/pages/Admin/User/Corpfc/CorpfcAllPage.tsx:134	   130           {\n   131             key: "member.memIsResigned",\n   132             label: "사용여부",\n   133             usePrefix: false,\n»  134             // colWidth: "8%",\n»  135             //* 기획 색상 규칙(2026-07): 사용=파랑 | 중지=빨강\n   136             format: (data) =>\n   137               statusTextByMap(data?.member?.memIsResigned, {\n   138                 사용: { color: "blue" },\n   139                 중지: { color: "red" },	 colWidth: "8%",\n* 기획 색상 규칙(2026-07): 사용=파랑 | 중지=빨강	alive	색상 사용 규칙을 알 수 있음
2df60126fbd8	insuniverse-admin/src/pages/Admin/User/User/UserPage.tsx:190	   186             // onChange: (id: any) => {\n   187             //   setSagId(id);\n   188             // },\n   189           },\n»  190           // {\n»  191           //   label: "영업채널명",\n»  192           //   name: "salesAgencyChannel.sacCode",\n»  193           //   usePrefix: false,\n»  194           //   useOnlyLastKey: true,\n»  195           //   options: [\n»  196           //     { label: "전체", value: "" },\n»  197           //     { label: "해당없음", value: "none" },\n»  198           //   ].concat(channel),\n»  199           // },\n   200           {\n   201             label: "회원타입",\n   202             name: "member.memType",\n   203             options: [	 {\n   label: "영업채널명",\n   name: "salesAgencyChannel.sacCode",\n   usePrefix: false,\n   useOnlyLastKey: true,\n   options: [\n     { label: "전체", value: "" },\n     { label: "해당없음", value: "none" },\n   ].concat(channel),\n },	dead	주석처리된 코드임
c7a717d9f1c5	insuniverse-admin/src/shared/helpers/common.helper.ts:1097	  1093  * @param {string} htmlString - HTML 형식의 문자열\n  1094  * @returns {number} - 순수 텍스트의 길이\n  1095  */\n  1096 const getTextLength = (htmlString: string) => {\n» 1097   // HTML 태그를 제거하기 위한 정규 표현식\n  1098   const textOnly = htmlString.replace(/<[^>]*>/g, "");\n  1099   // 텍스트의 길이를 반환\n  1100   return textOnly.length;\n  1101 };	 HTML 태그를 제거하기 위한 정규 표현식	alive	아래 함수의 동작에 대해 설명함
45a9e1265cc0	insuniverse-admin/src/shared/helpers/common.helper.ts:667	   663   return dot;\n   664 };\n   665 \n   666 //!--------------------------------------------------------------------\n»  667 /**\n»  668  ** 매개변수로 전달받은 문자열에 원하는 간격마다 원하는 문자열을 추가한다\n»  669  * - ex입력) formatAddXString("20240202", "422", "-");\n»  670  * - ex결과) "2024-02-24"\n»  671  */\n   672 const formatAddXString = (str: string, xPosition: string, x: string) => {\n   673   if (str.length < 1) {\n   674     console.error("Error in formatAddXString: check first argument");\n   675     return;	\n매개변수로 전달받은 문자열에 원하는 간격마다 원하는 문자열을 추가한다\n- ex입력) formatAddXString("20240202", "422", "-");\n- ex결과) "2024-02-24"\n 	alive	아래 함수의 동작에 대해 설명함
ef069e10cfa0	insuniverse-admin/src/shared/ui/ExcelUploadModal.tsx:92	    88     // const reader = new FileReader();\n    89     // reader.onloadend = () => {\n    90     //   const base64String = (reader.result as string)?.split(",")[1]; // Base64 데이터만 추출\n    91 \n»   92     //   // API 요청 보내기\n»   93     //   upload(base64String).then((res) => {\n»   94     //     if (res) {\n»   95     //       // 업로드 성공\n»   96     //     } else\n»   97     //       [\n»   98     //         // 업로드 실패\n»   99     //       ];\n»  100     //   });\n»  101     // };\n   102 \n   103     // reader.readAsDataURL(file); // 파일을 Base64 문자열로 읽기\n   104   };\n   105 	   // API 요청 보내기\n   upload(base64String).then((res) => {\n     if (res) {\n       // 업로드 성공\n     } else\n       [\n         // 업로드 실패\n       ];\n   });\n };	dead	주석처리된 코드임
ae328854364e	insuniverse-server/apps/api/src/helpers/mask.helper.ts:58	    54   const minIdLength = 4; // 아이디 최소 길이 규칙\n    55   const visiblePrefixLength = 3; // 노출할 앞자리 개수\n    56 \n    57   if (idString.length < minIdLength) {\n»   58     // 1. 전체 마스킹:\n    59     return '*'.repeat(idString.length || 1); // 길이가 0이면 * 하나 반환 (빈 문자열 위에서 이미 처리)\n    60   }\n    61 \n    62   // 4자리 이상인 경우, 앞 3자리 노출 후 나머지 마스킹	 1. 전체 마스킹:	alive	아래 코드가 전체 마스킹 코드라는걸 알려줌.
049737e385ce	insuniverse-server/apps/api/src/modules/agency/organization/organization.repository.ts:58	    54       .where(like(tnAgencyOrganization.orgPath, `${orgPath}%`));\n    55     return rows.map((r) => r.orgId);\n    56   }\n    57 \n»   58   //* 조직 전체 경로 이름 일괄 계산 — { orgId: "대구 > 개발팀" }\n»   59   //*   ⚠️ drizzle raw 상관 서브쿼리는 상관참조가 깨진 전례(회원수 폭증 버그)가 있어\n»   60   //*   반드시 배치 조회(inArray) + JS 조합으로 계산한다.\n    61   async getFullPathNames(orgIds: string[]): Promise<Record<string, string>> {\n    62     //* (1) 중복 제거 + 빈 배열 가드\n    63     const uniqueIds = [...new Set(orgIds.filter((id) => !!id))];\n    64     if (uniqueIds.length === 0) return {};	* 조직 전체 경로 이름 일괄 계산 — { orgId: "대구 > 개발팀" }\n*   ⚠️ drizzle raw 상관 서브쿼리는 상관참조가 깨진 전례(회원수 폭증 버그)가 있어\n*   반드시 배치 조회(inArray) + JS 조합으로 계산한다.	alive	조직 경로를 계산하는 방법에 대해 설명함
8e791ad8098c	insuniverse-server/apps/api/src/modules/auth/admin/auth.dto.ts:81	    77 \n    78   @ApiProperty({ description: '기업명', required: false })\n    79   agcCorporateName?: string;\n    80 \n»   81   //* 권한: CORP_SUPER(최고관리자) / CORP_ORG(조직관리자). CORP_ORG 운영 가능 여부는 orgCanWrite로 분리.\n    82   @ApiProperty({ description: '기업관리자 권한', required: false })\n    83   agcRole?: string;\n    84 \n    85   @ApiProperty({ description: '조직관리자 회원 ID', required: false })	* 권한: CORP_SUPER(최고관리자) / CORP_ORG(조직관리자). CORP_ORG 운영 가능 여부는 orgCanWrite로 분리.	alive	권한의 구분 정책을 설명함
659fe7ac5a7e	insuniverse-server/apps/api/src/modules/courses/courses/courses.service.ts:159	   155     }\n   156     return courses;\n   157   }\n   158 \n»  159   /** 강의 신규등록 이미지 데이터 */\n   160   async uploadImage(files: Express.Multer.File[]) {\n   161     const uploadImage: CoursesImageDto = {\n   162       crsImg: '',\n   163     };	강의 신규등록 이미지 데이터 	alive	아래 함수의 사용처에 대해 설명함
a129e858dbec	insuniverse-server/apps/api/src/modules/courses/progress/courses-progress.service.ts:22	    18     //* 강의영상이 완료일 경우\n    19     // if (dto.crvpIsCompleted === 1) {\n    20     //   await this.coursesProgressRepository.upsertVideoProgress(memId, dto);\n    21 \n»   22     //   //* 해당 강의 코스 ID 획득\n»   23     //   const crsId = await this.coursesProgressRepository.getCoursesIdByVideoId(\n»   24     //     dto.crvId,\n»   25     //   );\n    26 \n    27     //   //* 전체 영상 진척도 확인 및 완료시 저장 로직\n    28     //   return await this.coursesProgressRepository.calculateUserCoursesProgress(\n    29     //     memId,	   //* 해당 강의 코스 ID 획득\n   const crsId = await this.coursesProgressRepository.getCoursesIdByVideoId(\n     dto.crvId,\n   );	dead	1차 혼재(code·text 둘 다) → 2차 다수결
420c9b314789	insuniverse-server/apps/api/src/modules/disease/disease.service.ts:552	   548         detailCode: '',\n   549         fineCode: '',\n   550         subFineCode: '',\n   551         name: 'Ⅰ.특정 감염성 및 기생충성 질환(A00-B99)',\n»  552         // TODO: 추천보험 항목 기능 추가 필요시 주석 해제\n»  553         // insuranceComment: '',\n   554       },\n   555       {\n   556         level: '중',\n   557         majorCode: 'A00-B99',	 TODO: 추천보험 항목 기능 추가 필요시 주석 해제\n insuranceComment: '',	alive	API를 호출할 때 추천보험 항목이 필요할 경우 아래 주석을 해지하라는 설명이 있음. 추후 개발을 위한 주석임.
c2bbe800bfa7	insuniverse-server/apps/api/src/modules/disease/disease.service.ts:588	   584         detailCode: 'A000',\n   585         fineCode: '',\n   586         subFineCode: '',\n   587         name: '비브리오 콜레라 01 콜레라형균에 의한 콜레라',\n»  588         // TODO: 추천보험 항목 기능 추가 필요시 주석 해제\n»  589         // insuranceComment: '',\n   590       },\n   591       {\n   592         level: '세세',\n   593         majorCode: 'A00-B99',	 TODO: 추천보험 항목 기능 추가 필요시 주석 해제\n insuranceComment: '',	alive	API를 호출할 때 추천보험 항목이 필요할 경우 아래 주석을 해지하라는 설명이 있음. 추후 개발을 위한 주석임.
c64aa1773544	insuniverse-server/apps/api/src/modules/fax/fax.service.ts:148	   144       // 팩스 발송 성공 시에만 히스토리 생성\n   145       if (faxSendSuccess) {\n   146         const actualPointUsed = actualPageCount * config.fxcPointPerPage;\n   147 \n»  148         // TODO: 포인트 차감\n»  149         // MoneyService에 deductMoney 메서드 추가 필요\n»  150         // if (!isResend) {\n»  151         //   await this.moneyService.deductMoney({\n»  152         //     memId,\n»  153         //     amount: actualPointUsed,\n»  154         //     categoryCode: 'FAX_SEND',\n»  155         //     description: `FAX 발송 (${receiverName})`,\n»  156         //   });\n»  157         // }\n   158 \n   159         // PDF 파일을 S3에 업로드 (선택적)\n   160         let s3Key: string | undefined;\n   161         try {	 TODO: 포인트 차감\n MoneyService에 deductMoney 메서드 추가 필요\n if (!isResend) {\n   await this.moneyService.deductMoney({\n     memId,\n     amount: actualPointUsed,\n     categoryCode: 'FAX_SEND',\n     description: `FAX 발송 (${receiverName})`,\n   });\n }	dead	포인트 차감 기능에 대한 주석이나 코드가 차지하는 영역이 큼
33a1ab43b51f	insuniverse-server/apps/api/src/modules/fc/fc.service.ts:269	   265 \n   266   //*--------------------------------------------- 푸시알림 설정 ---------------------------------------------//\n   267   async getPushSettings(memId: number) {\n   268     const data = await this.fcRepository.getPushSettings(memId);\n»  269     //* 이벤트 팝업 [다음에] 스누즈(96h) 여부 — 키 존재하면 아직 스누즈 중(웹/앱 공유).\n   270     let eventPopupSnoozed = false;\n   271     if (this.redis) {\n   272       eventPopupSnoozed = !!(await this.redis\n   273         .exists(this.eventSnoozeKey(memId))	* 이벤트 팝업 [다음에] 스누즈(96h) 여부 — 키 존재하면 아직 스누즈 중(웹/앱 공유).	alive	이벤트 팝업의 존재를 확인할 수 있음
1fc0a6b5f91a	insuniverse-server/apps/api/src/modules/money/money.service.ts:415	   411       mwlBalance: newBalance,\n   412       mwlDescription: title,\n   413     });\n   414 \n»  415     // 2. source 생성 (FIFO 추적)\n   416     const expiredAt = hasExpiry && expiryDays\n   417       ? dayjs().add(expiryDays, 'day').format('YYYY-MM-DD 23:59:59')\n   418       : null;\n   419 	 2. source 생성 (FIFO 추적)	alive	생성된 source가 FIFO로 동작함을 알 수 있음
890b5c798b16	insuniverse-server/apps/api/src/modules/search/search.repository.ts:193	   189     }\n   190   }\n   191 }\n   192 \n»  193 //* 번복가능성이 있기 때문에 우선 주석처리\n»  194 // const inclusionData = await this.drizzle\n»  195 //   .select({\n»  196 //     sdsCode: tcSearchDisease.sdsCode,\n»  197 //     sdsName: tcSearchDisease.sdsName,\n»  198 //     sdsContent: tcSearchDisease.sdsContent,\n»  199 //   })\n»  200 //   .from(tcSearchDisease)\n»  201 //   .where(\n»  202 //     and(\n»  203 //       like(tcSearchDisease.sdsCode, `%${searchText}%`),\n»  204 //       not(eq(tcSearchDisease.sdsCode, searchText)),\n»  205 //     ),\n»  206 //   )\n»  207 //   .orderBy(asc(tcSearchDisease.sdsCode))\n»  208 //   .limit(limit)\n»  209 //   .offset(offset);\n   210 \n   211 // const [totalCount] = await this.drizzle\n   212 //   .select({ count: count() })\n   213 //   .from(tcSearchDisease)	* 번복가능성이 있기 때문에 우선 주석처리\n const inclusionData = await this.drizzle\n   .select({\n     sdsCode: tcSearchDisease.sdsCode,\n     sdsName: tcSearchDisease.sdsName,\n     sdsContent: tcSearchDisease.sdsContent,\n   })\n   .from(tcSearchDisease)\n   .where(\n     and(\n       like(tcSearchDisease.sdsCode, `%${searchText}%`),\n       not(eq(tcSearchDisease.sdsCode, searchText)),\n     ),\n   )\n   .orderBy(asc(tcSearchDisease.sdsCode))\n   .limit(limit)\n   .offset(offset);	dead	주석된 dead code가 대부분임
6311c4330607	insuniverse-server/apps/api/src/modules/treat/dispatch/treat-dispatcher.service.ts:94	    90             maxFlows: flows,\n    91             sort: p.sort ?? 0,\n    92             unitCost: p.unitCost ?? 1,\n    93             rateEnabled: !!p.rateEnabled,\n»   94             ratePerMin: flows, //* rate ON 시 동일 공식을 '분당 허용건수'로 사용\n    95           };\n    96         })\n    97         //* 라우팅 우선순위 = tprSort 오름차순, 동순위면 단가 오름차순(tiebreaker).\n    98         .sort((a, b) => a.sort - b.sort || a.unitCost - b.unitCost)	* rate ON 시 동일 공식을 '분당 허용건수'로 사용	alive	rate가 ON 일때 분당 허용건수를 사용한다는 내용을 알 수 있음.
eb2dfa8ade18	insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:460	   456 \n   457     //* Order 카운트 추가\n   458     await this.orderService.addQuantity(orderDetail.order!.ordId, dto.oddId);\n   459 \n»  460     //* 임시데이터 삭제\n»  461     // await this.treatRepository.delete(oddId);\n   462 \n   463     //* 분석성공시\n   464     await this.alarmService.addAlarm({\n   465       memId: orderDetail.member!.memId,	* 임시데이터 삭제\n await this.treatRepository.delete(oddId);	dead	아래 코드에 대한 설명임
7f737420d783	insuniverse-server/apps/api/src/modules/treat/treat.service.ts:368	   364     );\n   365     if (!pre.ok) {\n   366       throw new BadRequestException({ code: pre.code, message: pre.message });\n   367     }\n»  368     //* [실명확인 hook] NICE/KCB 실명확인 계약 시 활성 — SMS 없이 이름+주민 매핑만 사전확인,\n»  369     //*   불일치면 여기서 차단(대기열·codef 진입 전). 현재 미계약이라 미사용.\n»  370     //*   const real = await this.realNameService.verify(dto.usrName, dto.usrBirth + dto.identityNo);\n»  371     //*   if (!real.matched) throw new BadRequestException({ code: 'NAME_MISMATCH', message: '이름과 주민등록번호가 일치하지 않습니다.' });\n   372 \n   373     let orderInfo;\n   374     let certifyClaimToken: string | null = null;\n   375     let certifyClaimHeartbeat: NodeJS.Timeout | undefined;	* [실명확인 hook] NICE/KCB 실명확인 계약 시 활성 — SMS 없이 이름+주민 매핑만 사전확인,\n*   불일치면 여기서 차단(대기열·codef 진입 전). 현재 미계약이라 미사용.\n*   const real = await this.realNameService.verify(dto.usrName, dto.usrBirth + dto.identityNo);\n*   if (!real.matched) throw new BadRequestException({ code: 'NAME_MISMATCH', message: '이름과 주민등록번호가 일치하지 않습니다.' });	alive	1차 혼재(code·text 둘 다) → 2차 다수결
9c2b68a62af0	insuniverse-server/apps/api/src/modules/treat/treat.service.ts:779	   775       return;\n   776     }\n   777     await this.clearCertifyResume(dto.altCode);\n   778 \n»  779     //* eventEmitter를 통해 비동기적 작업 분리\n   780     this.eventEmitter.emit('treatCompare', orderDetail, dto);\n   781     return;\n   782   }\n   783   //---------------------------------------------------//	* eventEmitter를 통해 비동기적 작업 분리	alive	비동기작업 분리에 대해 설명하고 있음.
33487ec8138b	insuniverse-server/libs/pg/src/smartro/smartro.dto.ts:39	    35   @IsString()\n    36   @IsOptional()\n    37   cardNum?: string;\n    38 \n»   39   /** 카드사명 */\n    40   @IsString()\n    41   @IsOptional()\n    42   cardName?: string;\n    43 	카드사명 	alive	카드사명을 dto가 받고있음을 알 수 있음.
ac1d01a43820	insuniverse-site/front/src/api/moneyApi.ts:232	   228       throw error;\n   229     }\n   230   },\n   231 \n»  232   /** 환불 신청 */\n   233   requestRefund: async (payload: {\n   234     mrfAmount: number;\n   235     mrfBankName: string;\n   236     mrfAccountNumber: string;	환불 신청 	alive	환불 신청 기능이 있음에 대해 알 수 있음
84f7167b929b	insuniverse-site/front/src/entities/analysis/model/store.ts:265	   261         });\n   262 \n   263         console.log('[store.getAnalysisSubDetail] store 업데이트 완료');\n   264 \n»  265         // TODO: 페이징 도입시 사용, 현재는 단일 조회\n»  266         // if (res.list.length === 0) {\n»  267         //   // store에 param데이터가 존재하지만, 응답값에서 리스트데이터가 비어있을 경우, page를 -1 합니다.\n»  268         //   set((state) => ({\n»  269         //     analysisSubDetail: {\n»  270         //       ...state.analysisSubDetail,\n»  271         //       param: !state.analysisSubDetail?.param\n»  272         //         ? undefined\n»  273         //         : {\n»  274         //             ...state.analysisSubDetail.param,\n»  275         //             page: state.analysisSubDetail.param.page - 1,\n»  276         //           },\n»  277         //     },\n»  278         //   }));\n»  279         //   return;\n»  280         // }\n   281 \n   282         // set((state) => {\n   283         //   const existingParam = state.analysisSubDetail?.param;\n   284         //   // 기존 param과 동일하면 요청 중단	 TODO: 페이징 도입시 사용, 현재는 단일 조회\n if (res.list.length === 0) {\n   // store에 param데이터가 존재하지만, 응답값에서 리스트데이터가 비어있을 경우, page를 -1 합니다.\n   set((state) => ({\n     analysisSubDetail: {\n       ...state.analysisSubDetail,\n       param: !state.analysisSubDetail?.param\n         ? undefined\n         : {\n             ...state.analysisSubDetail.param,\n             page: state.analysisSubDetail.param.page - 1,\n           },\n     },\n   }));\n   return;\n }	dead	dead code이나 주석을 해지하면 페이징으로 사용할 수 있음을 암시. 개발용 내용임.
463043394795	insuniverse-site/front/src/features/analyze/ui/AnalyzeForm.tsx:207	   203 \n   204   /** 이름 입력값 처리 */\n   205   const handleOnChangeName = (e: React.ChangeEvent<HTMLInputElement>) => {\n   206     const value = e.target.value;\n»  207     let cleanValue = value.replace(/^\\s+/, ""); // 시작 공백 제거\n   208     cleanValue = cleanValue.replace(/\\s{2,}/g, " "); // 연속 공백을 단일 공백으로\n   209     setValue("name", cleanValue.substring(0, 50));\n   210   };\n   211 	 시작 공백 제거	alive	1차 code 체크 → 2차 확인에서 text 로 정정
bf32c975b7e1	insuniverse-site/front/src/features/analyze/ui/AnalyzeForm.tsx:22	    18 import { Link, useLocation, useNavigate, useNavigationType } from "react-router-dom";\n    19 import AnalyzeAd from "./AnalyzeAd";\n    20 moment.locale("ko");\n    21 \n»   22 // 운영 핫픽스: CODEF→심평원 IP 차단으로 분석 초대(알림톡) 일시 중단.\n»   23 // 분석 결과 전달이 불가능한 상태이므로 초대 자체를 막는다. 복구 시 false로 변경. (복구 시점 미정)\n»   24 // const ANALYSIS_INVITE_SUSPENDED = true;\n    25 \n    26 // 중단 기간에도 배포 환경에서 실제 동작을 점검할 수 있도록, 아래 loginId 계정만 차단을 우회한다.\n    27 // 복구(ANALYSIS_INVITE_SUSPENDED=false) 시 함께 정리한다.\n    28 const INVITE_TEST_LOGIN_IDS = ["rsteam1"];	 운영 핫픽스: CODEF→심평원 IP 차단으로 분석 초대(알림톡) 일시 중단.\n 분석 결과 전달이 불가능한 상태이므로 초대 자체를 막는다. 복구 시 false로 변경. (복구 시점 미정)\n const ANALYSIS_INVITE_SUSPENDED = true;	alive	CODEF에서 IP차단으로인해 분석결과 전달이 불가능한 상황임을 확인할 수 있음
12def524c3fe	insuniverse-site/front/src/features/joinForm/hooks/useJoinForm.ts:224	   220   };\n   221 \n   222   /** 핸드폰번호 입력값 포맷팅 */\n   223   const handleOnInputPhone = (e: React.ChangeEvent<HTMLInputElement>) => {\n»  224     // 입력된 값을 포맷팅\n»  225     // const formattedValue = phoneNumberFormatter(e.target.value);\n»  226     // setValue("phone", formattedValue);\n   227 \n   228     setValue("phone", e.target.value.substring(0, 11));\n   229   };\n   230 	 입력된 값을 포맷팅\n const formattedValue = phoneNumberFormatter(e.target.value);\n setValue("phone", formattedValue);	dead	개발용 정보로 의미 없음
5747485b09ab	insuniverse-site/front/src/pages/alimTalk/Step5Page.tsx:26	    22 //       // 기존에 저장된 path값고, 현재 경로값이 일치할 경우 return\n    23 //       return;\n    24 //     }\n    25 \n»   26 //     window.scrollTo(0, 0);\n»   27 //     if (!code) {\n»   28 //       /***\n»   29 //        * code가 없을 경우 move fail page\n»   30 //        */\n»   31 //       navigate("/alimtalk/step-fail/" + code);\n»   32 //       return;\n»   33 //     }\n    34 \n    35 //     const compareTreatSuccess = certify?.[code]?.compareTreatSuccess;\n    36 //     if (typeof compareTreatSuccess === "undefined") {\n    37 //       /***	     window.scrollTo(0, 0);\n     if (!code) {\n       /***\n        * code가 없을 경우 move fail page\n        */\n       navigate("/alimtalk/step-fail/" + code);\n       return;\n     }	dead	1차 혼재(code·text 둘 다) → 2차 다수결
873f55f518e4	insuniverse-site/front/src/pages/analysis/list/detail/B2cAnalysisDetailPageForMember.tsx:426	   422 \n   423     window.addEventListener("scroll", handleFixedElementsScroll);\n   424     window.addEventListener("resize", handleFixedElementsScroll);\n   425 \n»  426     // 페이지 처음 렌더링 시 한번 실행\n   427     handleFixedElementsScroll();\n   428 \n   429     return () => {\n   430       window.removeEventListener("scroll", handleFixedElementsScroll);	 페이지 처음 렌더링 시 한번 실행	alive	페이지 렌더링시 한번 실행함을 알 수 있음
e8a47ce63a62	insuniverse-site/front/src/pages/board/detail/BoardDetailPage.tsx:266	   262 };\n   263 \n   264 export default BoardDetailPage;\n   265 \n»  266 // interface DownloadButtonProps {\n»  267 //   fileUrl: string; // S3 파일 URL\n»  268 //   fileName: string; // 다운로드할 파일 이름\n»  269 // }\n   270 \n   271 // const DownloadButton: React.FC<DownloadButtonProps> = ({ fileUrl, fileName }) => {\n   272 //   const handleDownload = () => {\n   273 //     const link = document.createElement("a");	 interface DownloadButtonProps {\n   fileUrl: string; // S3 파일 URL\n   fileName: string; // 다운로드할 파일 이름\n }	dead	dead code임
0f809c8f7f1f	insuniverse-site/front/src/pages/invoices/output/Step5Page.tsx:280	   276      * 청구서 로그 저장 request API (PDF 파일 포함)\n   277      */\n   278     const pdfBlobs = pdfBuffers.map((buffer) => new Blob([new Uint8Array(buffer as ArrayBuffer)], { type: "application/pdf" }));\n   279 \n»  280     // 보험사명 추출 (청구서 생성 API에 전달하기 위해)\n   281     const insurerNames: string[] = [];\n   282     try {\n   283       const insurerList = await api.invoicesAPi.getInsurersList();\n   284       for (const code of invoiceData?.codes ?? []) {	 보험사명 추출 (청구서 생성 API에 전달하기 위해)	alive	보험사명 추출 이유에 대해 알 수 있음
