[{"data":1,"prerenderedAt":1638},["ShallowReactive",2],{"doc:\u002Frequirements":3},{"id":4,"title":5,"body":6,"description":1592,"extension":1631,"meta":1632,"navigation":1633,"path":1634,"seo":1635,"stem":1636,"__hash__":1637},"docs\u002FREQUIREMENTS.md","요구사항 정의서 (Requirements)",{"type":7,"value":8,"toc":1591},"minimark",[9,13,53,56,61,123,125,129,134,144,148,218,222,245,247,251,288,290,294,298,304,352,356,359,376,380,383,433,437,440,482,486,489,521,525,528,555,559,562,583,587,590,645,649,652,679,683,689,724,728,731,769,773,776,798,800,804,808,821,927,951,987,991,1006,1010,1022,1026,1062,1066,1109,1113,1135,1139,1172,1176,1186,1188,1192,1372,1374,1378,1399,1401,1405,1544,1546,1550],[10,11,5],"h1",{"id":12},"요구사항-정의서-requirements",[14,15,16],"blockquote",{},[17,18,19,20,24,25,30,31,30,35,30,39,43,44,48,49,52],"p",{},"정본(SSOT) — ",[21,22,23],"code",{},"malgn-helper","(고객상담 AI 챗봇)의 기능·비기능 요구사항.\n최초 정본화 — 2026-06-16. 그간 ",[26,27,29],"a",{"href":28},"CLAUDE","CLAUDE.md","·",[26,32,34],{"href":33},".\u002FROADMAP","ROADMAP.md",[26,36,38],{"href":37},".\u002FADMIN-PLAN","ADMIN-PLAN.md",[26,40,42],{"href":41},".\u002FPROJECT-INQUIRY-ANALYSIS","PROJECT-INQUIRY-ANALYSIS.md","에 분산돼 있던 요구사항을 ",[45,46,47],"strong",{},"단일 문서로 집약","한다.\n본 문서는 분산 문서를 ",[45,50,51],{},"대체하지 않고 요약·상호참조","한다. 화면·스키마 상세는 각 정본을 링크로 따른다.",[54,55],"hr",{},[57,58,60],"h2",{"id":59},"_0-문서-사용법","0. 문서 사용법",[62,63,64,79,97,108],"ul",{},[65,66,67,70,71,74,75,78],"li",{},[45,68,69],{},"ID 체계",": 기능 요구사항 ",[21,72,73],{},"FR-n",", 비기능 요구사항 ",[21,76,77],{},"NFR-n",". 각 항목에 수용기준(AC)을 둔다.",[65,80,81,84,85,88,89,92,93,96],{},[45,82,83],{},"Phase 표기",": ",[21,86,87],{},"P1","(상담사 보조: 관리자 콘솔 + AI 추천 답변·PMS 애드온), ",[21,90,91],{},"P2","(고객 직접 챗봇). ",[21,94,95],{},"P1→P2","는 P1에서 자산화되어 P2에서 재사용·확장.",[65,98,99,102,103,107],{},[45,100,101],{},"상태",": ☑ 구현됨 · ◐ 부분 · ☐ 미착수 — 진척의 정본은 ",[26,104,106],{"href":105},".\u002FWBS","WBS.md","이며 여기서는 요구사항 충족 관점만 표기.",[65,109,110,111,114,115,118,119,122],{},"값이 ",[45,112,113],{},"데이터(시드)로 실체화된 정책","(안전가드 등)은 운영 MySQL ",[21,116,117],{},"hp_setting"," 시드를 근거로 명시한다(추측 금지). 근거 파일: ",[21,120,121],{},"..\u002F..\u002Fmalgn-helper-api\u002Fmigrations\u002F002_admin_console.sql",".",[54,124],{},[57,126,128],{"id":127},"_1-개요-목적범위","1. 개요 (목적·범위)",[130,131,133],"h3",{"id":132},"_1-1-제품-목적","1-1. 제품 목적",[17,135,136,137,140,141,143],{},"NotebookLM 수준의 답변 품질을 가진, ",[45,138,139],{},"자사(맑은소프트) 솔루션 전문 고객상담 AI",". 상담사를 대체하기 전에 먼저 강화하고(P1), 검증된 자산이 충분히 쌓인 뒤 고객에게 직접 노출한다(P2). 도메인은 LMS(학습관리시스템) 운영 지원이 압도적(분석 근거: ",[26,142,42],{"href":41},").",[130,145,147],{"id":146},"_1-2-구성-요소","1-2. 구성 요소",[149,150,151,167],"table",{},[152,153,154],"thead",{},[155,156,157,161,164],"tr",{},[158,159,160],"th",{},"컴포넌트",[158,162,163],{},"역할",[158,165,166],{},"Phase",[168,169,170,183,195,207],"tbody",{},[155,171,172,178,181],{},[173,174,175],"td",{},[21,176,177],{},"malgn-helper-api",[173,179,180],{},"검색·LLM·DB 접근 단일 백엔드 (Hono on Workers)",[173,182,87],{},[155,184,185,190,193],{},[173,186,187],{},[21,188,189],{},"malgn-helper-admin",[173,191,192],{},"자산 큐레이션·운영 콘솔 (Nuxt 3 \u002F Pages)",[173,194,87],{},[155,196,197,202,205],{},[173,198,199],{},[21,200,201],{},"malgn-helper-pms",[173,203,204],{},"PMS 애드온 — 상담사에게 추천 답변·문의 브리핑 제공",[173,206,87],{},[155,208,209,213,216],{},[173,210,211],{},[21,212,23],{},[173,214,215],{},"고객 직접 대화 챗봇 프론트엔드",[173,217,91],{},[130,219,221],{"id":220},"_1-3-범위-경계-phase","1-3. 범위 경계 (Phase)",[62,223,224,233,239],{},[65,225,226,229,230],{},[45,227,228],{},"P1 범위",": 자료\u002F표준답변 수집·인덱싱, 하이브리드 검색, AI 추천 답변(상담사 채택\u002F수정\u002F거절), 관리자 콘솔, PMS 애드온. ",[45,231,232],{},"고객 직접 노출 없음.",[65,234,235,238],{},[45,236,237],{},"P2 범위",": 고객 챗봇 UI·세션, 신뢰도 가드, 에스컬레이션, 챗 로그·미커버 질문 큐. P1 자산(자료·표준답변·미커버·피드백)을 재사용.",[65,240,241,244],{},[45,242,243],{},"비범위(Non-goal)",": 범용 어시스턴트\u002F잡담, MVP 단계 동영상·대용량 비동기 인덱싱(P2 조건부), 협력사·고객사의 관리자 콘솔 접근.",[54,246],{},[57,248,250],{"id":249},"_2-권한역할-요구사항-전제","2. 권한·역할 (요구사항 전제)",[62,252,253,267,282],{},[65,254,255,256,259,260,263,264,122],{},"관리자 콘솔은 ",[45,257,258],{},"맑은소프트 직원 전용",". 식별은 ",[21,261,262],{},"@malgnsoft.com"," 이메일 + ",[21,265,266],{},"tb_user.company='맑은소프트'",[65,268,269,270,273,274,277,278,281],{},"3 역할: ",[21,271,272],{},"admin","(전반·계정·예산) · ",[21,275,276],{},"developer","(인덱싱·AI 설정·연동) · ",[21,279,280],{},"agent","(표준답변 제안·에스컬레이션·로그 검토).",[65,283,284,285,287],{},"상세 권한 매트릭스·라우트 가드는 ",[26,286,38],{"href":37}," §2·§6 정본을 따른다.",[54,289],{},[57,291,293],{"id":292},"_3-기능-요구사항-fr","3. 기능 요구사항 (FR)",[130,295,297],{"id":296},"fr-1-표준답변-우선-응답-파이프라인-p1-p1p2","FR-1 · 표준답변 우선 응답 파이프라인 (P1, P1→P2)",[17,299,300,301,122],{},"검증된 표준답변이 있으면 그것을 1순위로 사용한다. 매칭 우선순위: ",[45,302,303],{},"표준답변 매칭 → 하이브리드 검색(BM25+k-NN) → LLM 생성",[62,305,306,312,322,343],{},[65,307,308,311],{},[45,309,310],{},"AC-1.1"," 표준답변 매칭이 검색·LLM 생성보다 항상 먼저 시도된다.",[65,313,314,317,318,321],{},[45,315,316],{},"AC-1.2"," ",[21,319,320],{},"approval_status=approved"," 표준답변만 응답·매칭에 사용된다.",[65,323,324,327,328,331,332,335,336,339,340,342],{},[45,325,326],{},"AC-1.3"," 표준답변 매칭은 ",[21,329,330],{},"scope","(common\u002Fservice)+",[21,333,334],{},"topic","(+",[21,337,338],{},"service_tag",")으로 필터된다. (분류 체계: ",[26,341,38],{"href":37}," §4-3-1)",[65,344,345,346,348,349,351],{},"관련: ",[26,347,34],{"href":33}," 1.7~1.8 · ",[26,350,29],{"href":28}," \"표준 답변 우선\".",[130,353,355],{"id":354},"fr-2-출처-인용-p1-p1p2","FR-2 · 출처 인용 (P1, P1→P2)",[17,357,358],{},"모든 생성 답변은 근거 출처(표준답변 id \u002F 자료 청크 id \u002F 이미지 id)를 함께 제시한다.",[62,360,361,367],{},[65,362,363,366],{},[45,364,365],{},"AC-2.1"," 추천·챗봇 응답에 출처가 누락되면 그 답변은 \"확인 불가\"로 처리된다(출처 없는 단정 차단).",[65,368,369,372,373,375],{},[45,370,371],{},"AC-2.2"," 인용 정확도(출처가 실제 근거와 일치) ≥ 95%를 목표로 측정한다(",[26,374,34],{"href":33}," §6 KPI).",[130,377,379],{"id":378},"fr-3-모름-에스컬레이션-안전-분기-p1-정책-정의-p2-동작","FR-3 · \"모름\" + 에스컬레이션 안전 분기 (P1 정책 정의 \u002F P2 동작)",[17,381,382],{},"근거가 부족하거나 모호하면 추측하지 않고 \"모름\"으로 응답한 뒤 상담사로 에스컬레이션한다.",[62,384,385,406,416,426],{},[65,386,387,390,391,393,394,397,398,401,402,405],{},[45,388,389],{},"AC-3.1"," 응답 신뢰도가 임계값(",[21,392,117],{}," safety ",[21,395,396],{},"confidence_threshold",", §5 NFR-1 참조) ",[45,399,400],{},"미만","이고 ",[21,403,404],{},"escalate_on_low=true","이면 에스컬레이션 경로로 분기한다.",[65,407,408,411,412,415],{},[45,409,410],{},"AC-3.2"," P2에서 에스컬레이션은 큐(",[21,413,414],{},"hp_escalation",")로 적재되어 상담사가 처리한다.",[65,417,418,421,422,425],{},[45,419,420],{},"AC-3.3"," \"모름\"\u002F저신뢰 분기 질문은 미커버 질문 큐(",[21,423,424],{},"hp_uncovered_question",")로 누적되어 자산 보강 신호가 된다.",[65,427,428,429,432],{},"봇별 임계값 override: 봇 관리 화면에서 봇마다 ",[21,430,431],{},"escalationThreshold","를 별도로 둘 수 있다(전역 기본은 safety 시드). 충돌 시 정책 결정 §7-Q1.",[130,434,436],{"id":435},"fr-4-자료-수집인덱싱-p1","FR-4 · 자료 수집·인덱싱 (P1)",[17,438,439],{},"매뉴얼\u002F문서\u002FURL\u002F동영상 URL을 등록하고 청킹·임베딩하여 검색 인덱스에 색인한다.",[62,441,442,460,470,476],{},[65,443,444,447,448,451,452,455,456,459],{},[45,445,446],{},"AC-4.1"," 파일(",[21,449,450],{},"file",")·URL(",[21,453,454],{},"url",")·동영상 URL(",[21,457,458],{},"video_url",") 3종을 등록할 수 있다.",[65,461,462,465,466,469],{},[45,463,464],{},"AC-4.2"," 인덱싱 상태가 ",[21,467,468],{},"pending→processing→indexed\u002Ffailed","로 표시되고 재인덱싱이 가능하다.",[65,471,472,475],{},[45,473,474],{},"AC-4.3"," 자료는 무기한 보존(soft delete), 영구 삭제는 운영자 명시 트리거. 청크·임베딩은 삭제 시 즉시 인덱스에서 제거.",[65,477,478,479,481],{},"상세: ",[26,480,38],{"href":37}," §4-2.",[130,483,485],{"id":484},"fr-5-표준답변-관리승인-워크플로-p1","FR-5 · 표준답변 관리·승인 워크플로 (P1)",[17,487,488],{},"표준답변을 작성·분류·검토·승인한다. 상담사는 제안, 관리자\u002F개발자는 승인.",[62,490,491,500,506,516],{},[65,492,493,317,496,499],{},[45,494,495],{},"AC-5.1",[21,497,498],{},"pending→approved\u002Frejected"," 상태 전이가 존재하고, agent는 승인 권한이 없다.",[65,501,502,505],{},[45,503,504],{},"AC-5.2"," 표준답변은 scope\u002Ftopic\u002Fservice_tag\u002Ftags로 분류된다.",[65,507,508,511,512,515],{},[45,509,510],{},"AC-5.3"," 표준답변 작성 시 ",[21,513,514],{},"hp_image_asset","에서 이미지 자동 추천·삽입을 지원한다.",[65,517,478,518,520],{},[26,519,38],{"href":37}," §4-3.",[130,522,524],{"id":523},"fr-6-ai-추천-답변-상담사-보조-p1","FR-6 · AI 추천 답변 (상담사 보조) (P1)",[17,526,527],{},"상담사가 받은 문의에 대해 AI가 출처 포함 추천 답변을 제시하고, 상담사가 채택\u002F수정\u002F거절한다.",[62,529,530,536,542],{},[65,531,532,535],{},[45,533,534],{},"AC-6.1"," 추천 응답은 출처와 신뢰도를 동반한다(FR-2).",[65,537,538,541],{},[45,539,540],{},"AC-6.2"," 상담사 액션(채택\u002F수정 후 사용\u002F거절+사유)이 저장되어 자산화된다.",[65,543,544,547,548,551,552,554],{},[45,545,546],{},"AC-6.3"," AI 초안 생성은 별도 prompt를 만들지 않고 챗봇 응답 로직(",[21,549,550],{},"POST \u002Fchat",")을 재사용한다(",[26,553,38],{"href":37}," §4-5-2).",[130,556,558],{"id":557},"fr-7-피드백-선순환-p1p2","FR-7 · 피드백 선순환 (P1→P2)",[17,560,561],{},"채택\u002F수정 결과·미커버 질문을 표준답변 후보로 환류한다.",[62,563,564,570],{},[65,565,566,569],{},[45,567,568],{},"AC-7.1"," 자주 채택된 답변이 표준답변 후보로 추천된다.",[65,571,572,575,576,579,580,582],{},[45,573,574],{},"AC-7.2"," 미커버 질문이 같은 의미로 ",[45,577,578],{},"주 3건 이상"," 누적되면 후보 큐에 등록되고 Slack 알림이 발송된다(",[26,581,38],{"href":37}," §9 기본값).",[130,584,586],{"id":585},"fr-8-분류소스-격리-p1-p1p2","FR-8 · 분류·소스 격리 (P1, P1→P2)",[17,588,589],{},"업체별 자료를 격리하고, CS 자산이 아닌 데이터를 인덱싱에서 제외한다.",[62,591,592,605,619,629,639],{},[65,593,594,597,598,601,602,143],{},[45,595,596],{},"AC-8.1"," 인덱스 분리\u002F필터 기본 키는 ",[21,599,600],{},"project_id","(=",[21,603,604],{},"tb_project.id",[65,606,607,610,611,614,615,618],{},[45,608,609],{},"AC-8.2"," 사내 게시판(이름 패턴 ",[21,612,613],{},"^[0-9]+\\.",")·",[21,616,617],{},"몽골개발팀"," 등은 화이트리스트 검증 후 제외한다.",[65,620,621,624,625,628],{},[45,622,623],{},"AC-8.3"," 분류는 이메일 도메인·화이트리스트 등 ",[45,626,627],{},"명시 규칙으로만"," 결정하고, 이름·패턴 추정으로 직원\u002F협력사\u002F고객을 단정하지 않는다.",[65,630,631,634,635,638],{},[45,632,633],{},"AC-8.4"," 종료 프로젝트(",[21,636,637],{},"*"," 접두)·노후(주로 2022년) 자료는 신선도 가중치·\"현재 시스템과 다를 수 있음\" 가드를 적용한다.",[65,640,641,642,644],{},"근거: ",[26,643,42],{"href":41}," §7~8.",[130,646,648],{"id":647},"fr-9-고객-챗봇-대화-p2","FR-9 · 고객 챗봇 대화 (P2)",[17,650,651],{},"고객이 챗봇과 직접 대화한다(스트리밍·마크다운·출처 카드·세션 유지).",[62,653,654,668,674],{},[65,655,656,659,660,663,664,667],{},[45,657,658],{},"AC-9.1"," 세션·메시지가 ",[21,661,662],{},"hp_chat_session","\u002F",[21,665,666],{},"hp_chat_message","에 기록되고 피드백(👍\u002F👎)을 수집한다.",[65,669,670,673],{},[45,671,672],{},"AC-9.2"," P1에서 검증된 자료·표준답변·정책을 그대로 사용한다.",[65,675,478,676,678],{},[26,677,34],{"href":33}," 2.1~2.3.",[130,680,682],{"id":681},"fr-10-비공개-자료-취급-p1p2","FR-10 · 비공개 자료 취급 (P1→P2)",[17,684,685,686,122],{},"P2 챗봇 응답에 ",[45,687,688],{},"비공개 답변을 직접 인용하거나 출처로 노출하지 않는다",[62,690,691,701,710,716],{},[65,692,693,696,697,700],{},[45,694,695],{},"AC-10.1"," 자료\u002F봇 가시성이 ",[21,698,699],{},"public","(공개 자료만)인 경우 비공개 댓글·내부 운영 메모를 인용·노출하지 않는다.",[65,702,703,317,706,709],{},[45,704,705],{},"AC-10.2",[21,707,708],{},"internal","(비공개 포함)은 상담사 보조용으로만 허용되며 고객 노출 경로(P2 챗봇)에는 적용하지 않는다.",[65,711,712,715],{},[45,713,714],{},"AC-10.3"," 구체 마스킹·노출 규칙은 개인정보보호관리자 협의로 확정한다(§7 정책 결정 Q3).",[65,717,641,718,720,721,723],{},[26,719,42],{"href":41}," §6(안전보건진흥원 비공개 댓글 사례) · ",[26,722,38],{"href":37}," §4-1(봇 가시성).",[130,725,727],{"id":726},"fr-11-관리자-운영-콘솔-p1-일부-p2-대기","FR-11 · 관리자 운영 콘솔 (P1, 일부 P2 대기)",[17,729,730],{},"자산·설정·계정·모니터링을 관리하는 콘솔.",[62,732,733,749,764],{},[65,734,735,317,738,30,741,744,745,748],{},[45,736,737],{},"AC-11.1",[21,739,740],{},"accounts",[21,742,743],{},"catalog","(토픽·서비스)·",[21,746,747],{},"settings\u002F*","(ai·safety·cache·integrations)는 실데이터 연동 완료.",[65,750,751,317,754,30,757,30,760,763],{},[45,752,753],{},"AC-11.2",[21,755,756],{},"chat-logs",[21,758,759],{},"escalations",[21,761,762],{},"uncovered","는 P2(챗봇 가동) 대기.",[65,765,766,767,122],{},"상세·IA: ",[26,768,38],{"href":37},[130,770,772],{"id":771},"fr-12-봇페르소나-관리-phase-미확정-신규","FR-12 · 봇(페르소나) 관리 (Phase 미확정 — 신규)",[17,774,775],{},"관리자가 여러 챗봇을 만들고 봇마다 캐릭터·답변범위·학습소스·모델 파라미터를 지정한다.",[62,777,778,792],{},[65,779,780,781,784,785,788,789,791],{},"현재 ",[21,782,783],{},"malgn-helper-admin\u002Fpages\u002Fbots\u002F*","에 화면이 존재하나 ",[45,786,787],{},"백엔드·정본 미정",". 편입 결정·명세는 ",[26,790,38],{"href":37}," §4-13(편입) 참조.",[65,793,794,797],{},[45,795,796],{},"AC-12.1","(잠정) 봇은 페르소나(말투·성격·시스템프롬프트) + 답변범위(서비스·가시성·\"모름\" 강도·에스컬레이션 임계값·금지 주제) + 학습소스(자료셋·표준답변 scope) + 모델 파라미터로 구성된다.",[54,799],{},[57,801,803],{"id":802},"_4-비기능-요구사항-nfr","4. 비기능 요구사항 (NFR)",[130,805,807],{"id":806},"nfr-1-안전가드-정책값-데이터화-정본-p1-정의-p2-적용","NFR-1 · 안전가드 정책값 (데이터화 정본) (P1 정의 \u002F P2 적용)",[17,809,810,811,813,814,817,818,820],{},"안전가드는 운영 MySQL ",[21,812,117],{}," safety 그룹에 시드로 실체화되어 있다. ",[45,815,816],{},"본 표가 정책 정본이며 시드와 값이 일치해야 한다.","\n근거 시드: ",[21,819,121],{}," (INSERT 4-4, 라인 128~134).",[149,822,823,839],{},[152,824,825],{},[155,826,827,830,833,836],{},[158,828,829],{},"설정 키",[158,831,832],{},"시드값",[158,834,835],{},"타입",[158,837,838],{},"정책 의미",[168,840,841,858,876,892,910],{},[155,842,843,847,852,855],{},[173,844,845],{},[21,846,396],{},[173,848,849],{},[21,850,851],{},"0.6",[173,853,854],{},"number",[173,856,857],{},"응답 신뢰도가 이 값 미만이면 \"모름\"\u002F에스컬레이션 후보",[155,859,860,865,870,873],{},[173,861,862],{},[21,863,864],{},"escalate_on_low",[173,866,867],{},[21,868,869],{},"true",[173,871,872],{},"boolean",[173,874,875],{},"저신뢰 응답을 상담사로 에스컬레이션할지",[155,877,878,883,887,889],{},[173,879,880],{},[21,881,882],{},"pii_masking",[173,884,885],{},[21,886,869],{},[173,888,872],{},[173,890,891],{},"PII 마스킹 활성화",[155,893,894,899,904,907],{},[173,895,896],{},[21,897,898],{},"pii_patterns",[173,900,901],{},[21,902,903],{},"[\"\\\\d{6}-[1-4]\\\\d{6}\", \"\\\\d{3}-\\\\d{3,4}-\\\\d{4}\", \"[a-zA-Z0-9._%+\\\\-]+@[a-zA-Z0-9.\\\\-]+\\\\.[a-zA-Z]{2,}\"]",[173,905,906],{},"json",[173,908,909],{},"주민등록번호 · 전화번호 · 이메일 정규식 (마스킹 대상)",[155,911,912,917,922,924],{},[173,913,914],{},[21,915,916],{},"blocked_words",[173,918,919],{},[21,920,921],{},"[\"비방\", \"욕설\", \"스팸\", \"광고\"]",[173,923,906],{},[173,925,926],{},"금칙어 사전",[14,928,929],{},[17,930,931,932,934,935,938,939,942,943,946,947,950],{},"위 ",[21,933,898],{}," 값은 SQL 리터럴의 이중 이스케이프(",[21,936,937],{},"\\\\\\\\d",")를 ",[45,940,941],{},"JSON에 저장되는 실효 정규식","으로 환산한 것이다(저장 시 ",[21,944,945],{},"\\d",", ",[21,948,949],{},"\\-"," 등). 표시값은 JSON 파싱 후 정규식 기준.",[62,952,953,963,974],{},[65,954,955,958,959,962],{},[45,956,957],{},"AC-1(NFR).1"," safety 화면(",[21,960,961],{},"\u002Fsettings\u002Fsafety",")에서 보이는 값과 본 표의 값이 일치한다.",[65,964,965,317,968,970,971,973],{},[45,966,967],{},"AC-1(NFR).2",[21,969,396],{},"(전역 0.6)와 봇별 ",[21,972,431],{},"(FR-3)의 우선순위가 정의되어 있다(§7 Q1 확정 전까지 전역값 우선 가정).",[65,975,976,979,980,983,984,986],{},[45,977,978],{},"AC-1(NFR).3"," 응답·로그에서 PII는 ",[21,981,982],{},"pii_masking=true","일 때 ",[21,985,898],{},"로 마스킹된다.",[130,988,990],{"id":989},"nfr-2-답변-품질일관성","NFR-2 · 답변 품질·일관성",[62,992,993,998],{},[65,994,995,997],{},[45,996,365],{}," 같은 질문에 일관된 답변(표준답변 우선·캐싱). 잘못된 안내 0건 지향.",[65,999,1000,1002,1003,1005],{},[45,1001,371],{}," KPI: 추천 채택률 ≥60%, 무수정 채택률 ≥30%, 인용 정확도 ≥95%(",[26,1004,34],{"href":33}," §6).",[130,1007,1009],{"id":1008},"nfr-3-성능","NFR-3 · 성능",[62,1011,1012,1017],{},[65,1013,1014,1016],{},[45,1015,389],{}," P1 추천 생성 p95 ≤ 8초.",[65,1018,1019,1021],{},[45,1020,410],{}," P2 챗봇 첫 토큰까지 p95 ≤ 3초.",[130,1023,1025],{"id":1024},"nfr-4-인프라-제약","NFR-4 · 인프라 제약",[62,1027,1028,1033,1042,1047,1053],{},[65,1029,1030,1032],{},[45,1031,446],{}," 프론트\u002F백엔드는 Cloudflare(Pages+Workers). DB 접근은 Worker→Hyperdrive 경유(직접 연결 금지).",[65,1034,1035,1037,1038,1041],{},[45,1036,464],{}," 모든 LLM 호출은 AI Gateway(",[21,1039,1040],{},"malgn-helper2",") 경유 — 캐싱·로깅·rate limit 일원화.",[65,1043,1044,1046],{},[45,1045,474],{}," 검색은 하이브리드(BM25+k-NN) 전제. 한쪽만 쓰는 변경은 영향 범위를 명시.",[65,1048,1049,1052],{},[45,1050,1051],{},"AC-4.4"," 인덱싱은 MVP에서 동기. 동영상\u002F대용량 도입 시 Cloudflare Queues + Indexer Worker로 2단계 도입.",[65,1054,478,1055,1057,1058,122],{},[26,1056,29],{"href":28}," \"인프라 제약\" · ",[26,1059,1061],{"href":1060},".\u002FTECH-STACK","TECH-STACK.md",[130,1063,1065],{"id":1064},"nfr-5-보안인증","NFR-5 · 보안·인증",[62,1067,1068,1080,1092],{},[65,1069,1070,1072,1073,1075,1076,143],{},[45,1071,495],{}," 관리자 도메인은 Cloudflare Access SSO + ",[21,1074,262],{}," 화이트리스트로 보호(",[26,1077,1079],{"href":1078},".\u002FCLOUDFLARE-ACCESS","CLOUDFLARE-ACCESS.md",[65,1081,1082,1084,1085,663,1088,1091],{},[45,1083,504],{}," API는 라우트별 역할 가드(",[21,1086,1087],{},"requireRole",[21,1089,1090],{},"requireAuth",")를 적용한다.",[65,1093,1094,1096,1097,1100,1101,1104,1105,1108],{},[45,1095,510],{}," 외부 연동 시크릿(Webhook·API Key)은 DB 평문 저장 금지 — ",[21,1098,1099],{},"wrangler secret"," 보관, ",[21,1102,1103],{},"hp_integration","에는 ",[21,1106,1107],{},"secret_set"," 플래그만.",[130,1110,1112],{"id":1111},"nfr-6-데이터-보존개인정보","NFR-6 · 데이터 보존·개인정보",[62,1114,1115,1120,1125,1130],{},[65,1116,1117,1119],{},[45,1118,534],{}," 챗 로그: 메시지 본문 90일 \u002F 메타 1년 \u002F 1년 후 익명화 통계 보관.",[65,1121,1122,1124],{},[45,1123,540],{}," 자료·표준답변·이미지: 무기한 soft delete(수동 영구 삭제만).",[65,1126,1127,1129],{},[45,1128,546],{}," PII 처리·비공개 자료 노출 정책은 개인정보보호관리자 협의로 확정(§7 Q3).",[65,1131,641,1132,1134],{},[26,1133,38],{"href":37}," §9 운영 정책 기본값.",[130,1136,1138],{"id":1137},"nfr-7-데이터-모델-규칙","NFR-7 · 데이터 모델 규칙",[62,1140,1141,1154,1166],{},[65,1142,1143,1145,1146,1149,1150,1153],{},[45,1144,568],{}," 헬퍼 테이블은 ",[21,1147,1148],{},"hp_"," 접두사, PMS ",[21,1151,1152],{},"tb_*","에 외래키 금지(앱 레벨 검증).",[65,1155,1156,1158,1159,1162,1163,122],{},[45,1157,574],{}," 모든 테이블 ",[21,1160,1161],{},"status TINYINT","(1=활성,-1=삭제) soft delete 통일, 시간은 ",[21,1164,1165],{},"DATETIME",[65,1167,478,1168,122],{},[26,1169,1171],{"href":1170},".\u002FHP-SCHEMA","HP-SCHEMA.md",[130,1173,1175],{"id":1174},"nfr-8-한국어","NFR-8 · 한국어",[62,1177,1178],{},[65,1179,1180,1182,1183,1185],{},[45,1181,596],{}," 컨텐츠·응답은 한국어 비중이 높다. 검색 품질(형태소·BM25 가중·임베딩 모델)은 PoC로 검증한다(",[26,1184,34],{"href":33}," §7 리스크).",[54,1187],{},[57,1189,1191],{"id":1190},"_5-추적성-매트릭스-요구사항-정본","5. 추적성 매트릭스 (요구사항 ↔ 정본)",[149,1193,1194,1210],{},[152,1195,1196],{},[155,1197,1198,1201,1204,1207],{},[158,1199,1200],{},"요구사항",[158,1202,1203],{},"화면\u002FIA",[158,1205,1206],{},"데이터",[158,1208,1209],{},"로드맵",[168,1211,1212,1237,1251,1269,1288,1303,1320,1336,1356],{},[155,1213,1214,1217,1223,1234],{},[173,1215,1216],{},"FR-1·FR-5 표준답변",[173,1218,1219,1222],{},[26,1220,1221],{"href":37},"ADMIN-PLAN"," §4-3",[173,1224,1225,30,1228,30,1231],{},[21,1226,1227],{},"hp_standard_answer",[21,1229,1230],{},"hp_topic",[21,1232,1233],{},"hp_service",[173,1235,1236],{},"1.5·1.7",[155,1238,1239,1242,1245,1248],{},[173,1240,1241],{},"FR-2 출처 인용",[173,1243,1244],{},"—",[173,1246,1247],{},"citations(JSON)",[173,1249,1250],{},"1.8·2.3",[155,1252,1253,1256,1259,1266],{},[173,1254,1255],{},"FR-3 \"모름\"\u002F에스컬",[173,1257,1258],{},"§4-6·§4-9",[173,1260,1261,30,1263,1265],{},[21,1262,414],{},[21,1264,117],{},"(safety)",[173,1267,1268],{},"2.4",[155,1270,1271,1274,1277,1285],{},[173,1272,1273],{},"FR-4 자료",[173,1275,1276],{},"§4-2",[173,1278,1279,30,1282],{},[21,1280,1281],{},"hp_material",[21,1283,1284],{},"hp_material_chunk",[173,1286,1287],{},"1.4·1.6",[155,1289,1290,1293,1296,1300],{},[173,1291,1292],{},"FR-7 피드백",[173,1294,1295],{},"§4-5-1",[173,1297,1298],{},[21,1299,424],{},[173,1301,1302],{},"1.9·2.5",[155,1304,1305,1308,1310,1315],{},[173,1306,1307],{},"FR-8 분류",[173,1309,1244],{},[173,1311,1312,1314],{},[21,1313,600],{}," 인덱스 메타",[173,1316,1317],{},[26,1318,1319],{"href":41},"PROJECT-INQUIRY-ANALYSIS",[155,1321,1322,1325,1328,1333],{},[173,1323,1324],{},"FR-9 챗봇",[173,1326,1327],{},"§4-5",[173,1329,1330],{},[21,1331,1332],{},"hp_chat_*",[173,1334,1335],{},"2.1~2.3",[155,1337,1338,1341,1344,1353],{},[173,1339,1340],{},"FR-12 봇",[173,1342,1343],{},"§4-13",[173,1345,1346,30,1349,1352],{},[21,1347,1348],{},"hp_bot",[21,1350,1351],{},"hp_bot_source","(제안, 미생성)",[173,1354,1355],{},"미정",[155,1357,1358,1361,1364,1369],{},[173,1359,1360],{},"NFR-1 안전가드",[173,1362,1363],{},"§4-9",[173,1365,1366,1368],{},[21,1367,117],{},"(safety) 시드",[173,1370,1371],{},"2.6",[54,1373],{},[57,1375,1377],{"id":1376},"_6-현재-구현-상태-요약","6. 현재 구현 상태 (요약)",[62,1379,1380,1383,1388,1391,1394],{},[65,1381,1382],{},"☑ 인프라(Cloudflare Pages×3·Workers·Hyperdrive·R2·AI Gateway), PMS 애드온·API 24+ 엔드포인트, 이미지 자산 자동 캡션.",[65,1384,1385,1386,143],{},"☑ 관리자 콘솔: accounts·catalog·settings\u002F* 실데이터 연동, 안전가드 시드(",[21,1387,117],{},[65,1389,1390],{},"◐ 자료 인덱싱·하이브리드 검색·OpenSearch 미설치.",[65,1392,1393],{},"☐ P2 챗봇·에스컬레이션·미커버·챗 로그 (스키마\u002F화면 일부 준비, 가동 대기).",[65,1395,1396,1397,122],{},"진척 정본: ",[26,1398,106],{"href":105},[54,1400],{},[57,1402,1404],{"id":1403},"_7-정책-결정-사항-미정-todo","7. 정책 결정 사항 \u002F 미정 TODO",[149,1406,1407,1422],{},[152,1408,1409],{},[155,1410,1411,1414,1417,1419],{},[158,1412,1413],{},"ID",[158,1415,1416],{},"항목",[158,1418,101],{},[158,1420,1421],{},"비고",[168,1423,1424,1445,1494,1509,1526],{},[155,1425,1426,1429,1438,1442],{},[173,1427,1428],{},"Q1",[173,1430,1431,1432,1434,1435,1437],{},"전역 ",[21,1433,396],{},"(0.6) vs 봇별 ",[21,1436,431],{}," 우선순위",[173,1439,1440],{},[45,1441,1355],{},[173,1443,1444],{},"봇 단위 override 허용 여부·합성 규칙. 잠정: 전역값 우선. 결정 후 NFR-1·FR-3 갱신",[155,1446,1447,1450,1453,1458],{},[173,1448,1449],{},"Q2",[173,1451,1452],{},"서비스 카탈로그 슬러그 정합",[173,1454,1455],{},[45,1456,1457],{},"미정(불일치 발견)",[173,1459,1460,1462,1463,663,1466,663,1469,663,1472,663,1475,663,1478,1481,1482,1485,1486,1489,1490,1493],{},[21,1461,1233],{}," 시드(",[21,1464,1465],{},"step",[21,1467,1468],{},"lms-general",[21,1470,1471],{},"lms-mixed",[21,1473,1474],{},"lms-private",[21,1476,1477],{},"lms-public-security",[21,1479,1480],{},"lms-global",")와 ADMIN-PLAN §4-3-1·",[21,1483,1484],{},"use-bots.ts","(",[21,1487,1488],{},"lms-general\u002F-refund\u002F-public\u002F-security\u002F-hybrid\u002F-global",")가 ",[45,1491,1492],{},"불일치",". 정본 슬러그 세트를 확정해 양쪽 현행화 필요 (DBA+기획)",[155,1495,1496,1499,1502,1506],{},[173,1497,1498],{},"Q3",[173,1500,1501],{},"비공개 자료 마스킹·노출 세부 규칙",[173,1503,1504],{},[45,1505,1355],{},[173,1507,1508],{},"개인정보보호관리자 협의. FR-10·NFR-6 확정 입력",[155,1510,1511,1514,1517,1521],{},[173,1512,1513],{},"Q4",[173,1515,1516],{},"임베딩 모델 \u002F 인증 방식 \u002F 에스컬레이션 채널 \u002F 관측 스택",[173,1518,1519],{},[45,1520,1355],{},[173,1522,1523,1525],{},[26,1524,34],{"href":33}," §9 미결 결정 그대로 승계",[155,1527,1528,1531,1534,1539],{},[173,1529,1530],{},"Q5",[173,1532,1533],{},"봇(페르소나) 관리 정식 편입 여부",[173,1535,1536],{},[45,1537,1538],{},"결정됨(편입·보류 게이트)",[173,1540,1541,1543],{},[26,1542,38],{"href":37}," §4-13 결정 참조",[54,1545],{},[57,1547,1549],{"id":1548},"_8-후속-핸드오프","8. 후속 핸드오프",[62,1551,1552,1569,1579,1585],{},[65,1553,1554,1557,1558,1560,1561,1563,1564,663,1566,1568],{},[45,1555,1556],{},"DBA",": Q2 슬러그 정합 확정 후 ",[21,1559,1233],{}," 시드\u002F",[21,1562,1484],{}," 동기화. FR-12 편입 시 ",[21,1565,1348],{},[21,1567,1351],{}," DDL.",[65,1570,1571,1574,1575,1578],{},[45,1572,1573],{},"api-developer",": FR-12 편입 시 ",[21,1576,1577],{},"\u002Fadmin\u002Fbots"," CRUD. safety 설정값을 응답 파이프라인이 실제 적용하는지 검증(NFR-1 AC).",[65,1580,1581,1584],{},[45,1582,1583],{},"QA",": NFR-1 AC(safety 화면 값=시드값), FR-2(출처 누락 차단), FR-3(저신뢰 분기) 테스트 케이스화.",[65,1586,1587,1590],{},[45,1588,1589],{},"개인정보보호관리자",": Q3(비공개 자료·PII) 규칙 확정.",{"title":1592,"searchDepth":1593,"depth":1593,"links":1594},"",3,[1595,1597,1602,1603,1617,1627,1628,1629,1630],{"id":59,"depth":1596,"text":60},2,{"id":127,"depth":1596,"text":128,"children":1598},[1599,1600,1601],{"id":132,"depth":1593,"text":133},{"id":146,"depth":1593,"text":147},{"id":220,"depth":1593,"text":221},{"id":249,"depth":1596,"text":250},{"id":292,"depth":1596,"text":293,"children":1604},[1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616],{"id":296,"depth":1593,"text":297},{"id":354,"depth":1593,"text":355},{"id":378,"depth":1593,"text":379},{"id":435,"depth":1593,"text":436},{"id":484,"depth":1593,"text":485},{"id":523,"depth":1593,"text":524},{"id":557,"depth":1593,"text":558},{"id":585,"depth":1593,"text":586},{"id":647,"depth":1593,"text":648},{"id":681,"depth":1593,"text":682},{"id":726,"depth":1593,"text":727},{"id":771,"depth":1593,"text":772},{"id":802,"depth":1596,"text":803,"children":1618},[1619,1620,1621,1622,1623,1624,1625,1626],{"id":806,"depth":1593,"text":807},{"id":989,"depth":1593,"text":990},{"id":1008,"depth":1593,"text":1009},{"id":1024,"depth":1593,"text":1025},{"id":1064,"depth":1593,"text":1065},{"id":1111,"depth":1593,"text":1112},{"id":1137,"depth":1593,"text":1138},{"id":1174,"depth":1593,"text":1175},{"id":1190,"depth":1596,"text":1191},{"id":1376,"depth":1596,"text":1377},{"id":1403,"depth":1596,"text":1404},{"id":1548,"depth":1596,"text":1549},"md",{},true,"\u002Frequirements",{"title":5,"description":1592},"REQUIREMENTS","p-hZd_2OUPCKSM-yMaKUxdICItkpOLkhRrMf5dJmNLQ",1783932938625]