[{"data":1,"prerenderedAt":3317},["ShallowReactive",2],{"doc:\u002Fhistory\u002Fhistory.20260529":3},{"id":4,"title":5,"body":6,"description":1134,"extension":3310,"meta":3311,"navigation":3312,"path":3313,"seo":3314,"stem":3315,"__hash__":3316},"docs\u002Fhistory\u002Fhistory.20260529.md","작업 이력 — 2026-05-29",{"type":7,"value":8,"toc":3086},"minimark",[9,13,18,27,392,397,495,499,572,576,617,621,655,659,712,715,718,725,727,731,735,738,744,768,773,794,799,832,837,842,847,867,871,874,936,942,950,957,962,1010,1015,1026,1032,1038,1042,1052,1061,1080,1085,1123,1128,1228,1232,1235,1256,1292,1295,1302,1314,1322,1332,1338,1348,1353,1363,1369,1379,1385,1395,1401,1411,1417,1427,1433,1443,1449,1459,1465,1475,1481,1495,1501,1511,1517,1527,1533,1543,1549,1559,1565,1575,1581,1591,1597,1607,1613,1623,1629,1639,1645,1655,1661,1671,1677,1687,1693,1704,1710,1720,1726,1736,1742,1752,1757,1767,1773,1783,1789,1799,1805,1815,1820,1830,1836,1846,1852,1862,1867,1877,1883,1893,1898,1908,1914,1924,1929,1939,1945,1955,1961,1971,1977,1987,1992,2002,2008,2018,2024,2034,2040,2050,2056,2066,2071,2081,2087,2097,2102,2112,2118,2128,2134,2144,2149,2159,2165,2175,2180,2190,2196,2206,2211,2221,2227,2237,2243,2253,2258,2268,2274,2283,2288,2302,2308,2322,2328,2338,2343,2353,2359,2369,2375,2385,2390,2400,2406,2419,2424,2434,2440,2450,2456,2466,2472,2482,2488,2498,2504,2514,2520,2530,2536,2546,2552,2562,2568,2578,2584,2594,2600,2610,2616,2626,2632,2642,2648,2658,2664,2674,2680,2696,2702,2712,2718,2728,2734,2744,2750,2760,2766,2776,2782,2792,2798,2808,2813,2823,2829,2839,2845,2861,2867,2883,2889,2904,2910,2928,2934,3051,3057,3082],[10,11,5],"h1",{"id":12},"작업-이력-2026-05-29",[14,15,17],"h2",{"id":16},"종합-end-of-day","종합 (end-of-day)",[19,20,21,22,26],"p",{},"하루 안에 ",[23,24,25],"strong",{},"스토리보드 수준 PMS 데모 → 진짜 동작하는 LLM 기반 CS 헬퍼 백엔드\u002F관리자","로 도약. 6개 단계 흐름:",[28,29,30,61,103,150,192,246,274],"ol",{},[31,32,33,36],"li",{},[23,34,35],{},"WBS 페이지 폴리시·정합성 정리",[37,38,39,42,45],"ul",{},[31,40,41],{},"인라인 편집(목표일·완료일·상태) + R2 자동 저장(800ms 디바운스)",[31,43,44],{},"가중평균 수식 버그 수정 + stage weight 합 100 정규화 (0.2% → 24.2%)",[31,46,47,48,52,53,56,57,60],{},"PMS 통합 항목(",[49,50,51],"code",{},"P1-3-9~13",")이 실구현이 아닌 ",[23,54,55],{},"사용자단 스토리보드","임을 식별하고 ",[49,58,59],{},"P1-2-7~11","로 재배치 → 진행률 더 정직해짐",[31,62,63,66],{},[23,64,65],{},"인프라 활성화 (Hyperdrive · R2 · AI Gateway)",[37,67,68,79,86,93],{},[31,69,70,71,74,75,78],{},"Hyperdrive ",[49,72,73],{},"pms"," (id ",[49,76,77],{},"aea3...",") → PMS MySQL(5.6.51) 연결",[31,80,81,82,85],{},"R2 ",[49,83,84],{},"malgn-helper-files"," 생성 (WBS 영속화)",[31,87,88,89,92],{},"AI Gateway ",[49,90,91],{},"malgn-helper"," (Authenticated 모드, compat endpoint)",[31,94,95,96,99,100],{},"시크릿: ",[49,97,98],{},"OPENAI_API_KEY",", ",[49,101,102],{},"AI_GATEWAY_TOKEN",[31,104,105,108],{},[23,106,107],{},"PMS DB 연동 + 첫 실 엔드포인트",[37,109,110,117,123,133,139],{},[31,111,112,113,116],{},"DB 탐색용 dev 엔드포인트(",[49,114,115],{},"\u002Fdb\u002Ftables"," 등) 신설, PMS 27개 테이블 구조 파악",[31,118,119,122],{},[49,120,121],{},"GET \u002Fpms\u002Fprojects"," (검색·페이지네이션, 활성 1,653건)",[31,124,125,128,129,132],{},[49,126,127],{},"GET \u002Fpms\u002Fposts\u002F:id"," (직원\u002F고객 분류 + ",[23,130,131],{},"비공개 댓글 본문 마스킹",")",[31,134,135,138],{},[49,136,137],{},"GET \u002Fpms\u002Fprojects\u002F:id\u002Fbriefing"," (DB-only 집계 — 멤버\u002F통계\u002F라벨\u002F알림)",[31,140,141,142,145,146,149],{},"PMS의 ",[49,143,144],{},"BriefingCard"," 모킹을 ",[23,147,148],{},"실 API 호출","로 전환 (P1-2-7 스토리보드 → 실서비스)",[31,151,152,155],{},[23,153,154],{},"헬퍼 전용 DB 스키마 + 캐싱 인프라",[37,156,157,176,179],{},[31,158,159,162,163,166,167,166,170,166,173],{},[49,160,161],{},"hp_*"," 4 테이블 설계·문서화: ",[49,164,165],{},"hp_briefing"," \u002F ",[49,168,169],{},"hp_qa_eval",[49,171,172],{},"hp_standard_answer",[49,174,175],{},"hp_llm_log",[31,177,178],{},"일회용 admin 엔드포인트로 DDL 실행 후 secret·코드 제거",[31,180,181,184,185,188,189,191],{},[49,182,183],{},"POST \u002Fpms\u002Fprojects\u002F:id\u002Fbriefing\u002Fgenerate"," — ",[49,186,187],{},"llm_input_hash"," 기반 24h 캐시 hit + ",[49,190,175],{}," 감사 기록 + graceful degrade",[31,193,194,197],{},[23,195,196],{},"LLM 실 연동 (OpenAI via AI Gateway)",[37,198,199,206,209,228,235],{},[31,200,201,202,205],{},"CLAUDE.md: Claude → OpenAI(",[49,203,204],{},"gpt-4o-mini"," 기본)로 변경",[31,207,208],{},"첫 호출 검증: project 1446 hotTopics 7개 군집화 (\"훈련생 오류 15 \u002F 서버 10 \u002F ...\")",[31,210,211,212,215,216,215,219,215,222,215,225],{},"브리핑 LLM 확장: ",[49,213,214],{},"oneLiner"," + ",[49,217,218],{},"statusReason",[49,220,221],{},"urgentCount",[49,223,224],{},"faq",[49,226,227],{},"policies",[31,229,230,231,234],{},"Q&A 평가 카드 전체 LLM 연동: 5축(A~E) score + commentary + ",[23,232,233],{},"D축 templates 자동 생성"," + followups + observation",[31,236,237,238,241,242,245],{},"LLM 2회 호출 ",[23,239,240],{},"병렬화"," (",[49,243,244],{},"Promise.allSettled","): 7s → 3.5s (50% 단축)",[31,247,248,251],{},[23,249,250],{},"운영·관리자 도구",[37,252,253,262,268],{},[31,254,255,258,259,261],{},[49,256,257],{},"\u002Fadmin\u002Fcost"," 대시보드 (",[49,260,175],{}," 일·모델·엔티티 집계 + 최근 100건 추적)",[31,263,264,267],{},[49,265,266],{},"\u002Fadmin\u002Fevals"," Q&A 평가 목록 (정렬·필터·점수 색 분기, score_asc로 취약 응대 발굴)",[31,269,270,273],{},[49,271,272],{},"\u002Fprojects"," 프로젝트 목록 (1,653건, 검색·페이지네이션)",[31,275,276,279,280],{},[23,277,278],{},"Q&A 평가 카드 폴리시 라운드"," (20:10 이후)",[37,281,282,292,301,332,342,352,372,378,381],{},[31,283,284,287,288,291],{},[23,285,286],{},"Vision으로 이미지 직접 분석"," — 원본 응답의 ",[49,289,290],{},"\u003Cimg src>","를 절대URL로 변환 후 GPT-4o Vision에 첨부. LLM이 화면 내용(메뉴\u002F버튼명)을 인지하고 적절한 캡션과 함께 답변에 배치 (이미지 있을 때만 mini → 4o 자동 업그레이드)",[31,293,294,297,298,300],{},[23,295,296],{},"표준답변 컨텍스트 보강"," — 같은 프로젝트의 ",[49,299,172],{}," 최근 5건을 톤·구조 참고용으로 LLM에 전달 (복붙 금지)",[31,302,303,306,307,310,311,315,316,318,319,321,322,324,325,327,328,331],{},[23,304,305],{},"문단 분리 prompt 강제"," — 한 ",[49,308,309],{},"\u003Cp>","에 모든 답변을 몰아넣던 문제 해결. ",[312,313,314],"span",{},"인사\u002F공감\u002F핵심\u002F보조\u002F마무리","를 별도 ",[49,317,309],{},"로 분리, 변형별 최소 ",[49,320,309],{}," 수 명시. 검증: 짧은 답변 1 → 4 ",[49,323,309],{},", 긴 답변 1 → 6 ",[49,326,309],{},", 단계별 안내는 ",[49,329,330],{},"\u003Col>"," 절차로 시각화",[31,333,334,337,338,341],{},[23,335,336],{},"모달 UX 개선"," — 분석 모달은 valid 결과(",[49,339,340],{},"axes.length > 0",") 도착 후에만 열기 (빈 0점 모달 노출 fix). Q&A 본문은 초기 접힌 상태로. 모달 안 🗑 삭제 → 서버 + 메모리 동기화",[31,343,344,347,348,351],{},[23,345,346],{},"빈 섹션 정리"," — LLM이 매번 빈 배열만 채워 ",[49,349,350],{},"후속 조치 0"," 빈 박스만 보이던 followups 필드 완전 제거 (schema·prompt·UI·clipboard 4곳)",[31,353,354,359,360,363,364,367,368,371],{},[23,355,356,358],{},[49,357,266],{}," 모달 즉시 열기"," — 행 클릭 시 라우팅 대신 ",[49,361,362],{},"GET \u002Fpms\u002Fevals\u002F:id"," → ",[49,365,366],{},"QaEvalCard"," 모달. db_only 폴백·빈 결과 행은 기본 목록에서 숨김 (",[49,369,370],{},"?includeEmpty=1","로 디버그 노출)",[31,373,374,377],{},[49,375,376],{},"\u002Fdoc"," Scalar + OpenAPI 3.1 (수동 스펙, 22개 엔드포인트)",[31,379,380],{},"홈에 4개 진입 링크 노출, 헤더 제목 \"고객사 목록\" → \"맑은도우미 데모\"",[31,382,383,384,387,388,391],{},"Cloudflare Access ",[49,385,386],{},"\u002Fadmin\u002F*"," ",[49,389,390],{},"\u002Fdb\u002F*"," 보호 가이드 문서",[393,394,396],"h3",{"id":395},"산출-카운트","산출 카운트",[398,399,400,414],"table",{},[401,402,403],"thead",{},[404,405,406,410],"tr",{},[407,408,409],"th",{},"항목",[407,411,413],{"align":412},"right","수",[415,416,417,426,445,455,463,479,487],"tbody",{},[404,418,419,423],{},[420,421,422],"td",{},"신규 API 엔드포인트",[420,424,425],{"align":412},"22개",[404,427,428,431],{},[420,429,430],{},"신규 PMS 페이지",[420,432,433,434,387,436,387,438,387,440,387,442,444],{"align":412},"5개 (",[49,435,272],{},[49,437,257],{},[49,439,266],{},[49,441,257],{},[49,443,376],{},"은 API 측)",[404,446,447,450],{},[420,448,449],{},"신규 DB 테이블 (PMS DB)",[420,451,452,453,132],{"align":412},"4개 (",[49,454,161],{},[404,456,457,460],{},[420,458,459],{},"신규 인프라",[420,461,462],{"align":412},"R2 버킷 1 \u002F Hyperdrive 1 \u002F AI Gateway 1",[404,464,465,468],{},[420,466,467],{},"신규 문서",[420,469,470,166,473,166,476],{"align":412},[49,471,472],{},"WBS-TRACKER.md",[49,474,475],{},"HP-SCHEMA.md",[49,477,478],{},"CLOUDFLARE-ACCESS.md",[404,480,481,484],{},[420,482,483],{},"메모리 추가",[420,485,486],{"align":412},"2건 (스토리보드 식별 \u002F Hyperdrive 캐싱 stale)",[404,488,489,492],{},[420,490,491],{},"배포 (정식 deploy.sh)",[420,493,494],{"align":412},"약 35회 (말미 기준)",[393,496,498],{"id":497},"첫-llm-호출-결과-project-1446","첫 LLM 호출 결과 (project 1446)",[398,500,501,510],{},[401,502,503],{},[404,504,505,507],{},[407,506,409],{},[407,508,509],{},"값",[415,511,512,520,528,540,548,556,564],{},[404,513,514,517],{},[420,515,516],{},"hotTopics",[420,518,519],{},"훈련생 오류 15 \u002F 서버·접속 10 \u002F 강의·콘텐츠 10 \u002F 수료증 8 \u002F 문서 6 \u002F 결제 5 \u002F 기타 4",[404,521,522,525],{},[420,523,524],{},"statusReason (LLM)",[420,526,527],{},"\"긴급 문의가 다수 발생\"",[404,529,530,533],{},[420,531,532],{},"urgent",[420,534,535,536,539],{},"0 (DB) → ",[23,537,538],{},"6"," (LLM 추정)",[404,541,542,545],{},[420,543,544],{},"faq (자동 추출)",[420,546,547],{},"학습시간 오류 \u002F SSL 갱신 \u002F 강의 오류메세지 \u002F 모바일 영상 \u002F 과제 재제출 불가",[404,549,550,553],{},[420,551,552],{},"policies (직원 응답 패턴)",[420,554,555],{},"강의 수강 환경 안내 \u002F SSL 인증서 관리",[404,557,558,561],{},[420,559,560],{},"비용",[420,562,563],{},"$0.0012 (≈ ₩1.6) \u002F brief 1회",[404,565,566,569],{},[420,567,568],{},"캐시 hit 시 비용",[420,570,571],{},"$0",[393,573,575],{"id":574},"결정사건","결정\u002F사건",[37,577,578,584,593,599,605,611],{},[31,579,580,583],{},[23,581,582],{},"D1 DB 거부 → R2 + JSON 영속화"," (어제 결정 유지)",[31,585,586,592],{},[23,587,588,589,591],{},"PMS 운영 DB에 ",[49,590,161],{}," 접두사로 헬퍼 테이블 공존"," (별도 DB 분리는 추후 시나리오 문서화)",[31,594,595,598],{},[23,596,597],{},"LLM 공급자 Claude → OpenAI"," (사용자 키 제공 따라)",[31,600,601,604],{},[23,602,603],{},"AI Gateway Authenticated 모드"," (cf-aig-authorization 토큰)",[31,606,607,610],{},[23,608,609],{},"사용자단 스토리보드 vs 실서비스 구분"," 룰 명문화 (메모리)",[31,612,613,616],{},[23,614,615],{},"OpenAI 키 채팅 노출"," 사용자가 재발급 보류 — 그대로 사용 결정",[393,618,620],{"id":619},"알려진-잔여-이슈","알려진 잔여 이슈",[37,622,623,636,639,650],{},[31,624,625,363,632,635],{},[626,627,628,631],"del",{},[49,629,630],{},"hp_qa_eval.overall_verdict"," VARCHAR(20)",[23,633,634],{},"VARCHAR(100) 마이그레이션 완료"," (eod 추가 작업, 검증: \"문의에 대한 답변이 부족하여 개선이 필요합니다.\" 26자 정상 저장)",[31,637,638],{},"Hyperdrive read 캐싱으로 write 후 GET이 stale 보일 수 있음 (메모리 기록, 임팩트 작음)",[31,640,641,387,643,645,646,649],{},[49,642,386],{},[49,644,390],{}," 무인증 — 가이드(",[49,647,648],{},"doc\u002FCLOUDFLARE-ACCESS.md",")대로 적용 권장",[31,651,652,654],{},[49,653,390],{}," 탐색 엔드포인트는 안정화 후 제거 예정 (OpenAPI에 명시)",[393,656,658],{"id":657},"미리보기-링크","미리보기 링크",[37,660,661,670,677,684,691,698,705],{},[31,662,663,664],{},"홈: ",[665,666,667],"a",{"href":667,"rel":668},"https:\u002F\u002Fmalgn-helper-pms.pages.dev\u002F",[669],"nofollow",[31,671,672,673],{},"프로젝트 목록: ",[665,674,675],{"href":675,"rel":676},"https:\u002F\u002Fmalgn-helper-pms.pages.dev\u002Fprojects",[669],[31,678,679,680],{},"프로젝트 브리핑 (LLM): ",[665,681,682],{"href":682,"rel":683},"https:\u002F\u002Fmalgn-helper-pms.pages.dev\u002Fprojects\u002F1446",[669],[31,685,686,687],{},"Q&A 평가 목록: ",[665,688,689],{"href":689,"rel":690},"https:\u002F\u002Fmalgn-helper-pms.pages.dev\u002Fadmin\u002Fevals",[669],[31,692,693,694],{},"LLM 비용 대시보드: ",[665,695,696],{"href":696,"rel":697},"https:\u002F\u002Fmalgn-helper-pms.pages.dev\u002Fadmin\u002Fcost",[669],[31,699,700,701],{},"WBS Tracker: ",[665,702,703],{"href":703,"rel":704},"https:\u002F\u002Fmalgn-helper-pms.pages.dev\u002Fwbs",[669],[31,706,707,708],{},"API 문서: ",[665,709,710],{"href":710,"rel":711},"https:\u002F\u002Fmalgn-helper-api.malgnsoft.workers.dev\u002Fdoc",[669],[713,714],"hr",{},[14,716,717],{"id":717},"요약",[19,719,720,724],{},[665,721,723],{"href":722},"..\u002FWBS","WBS.md"," 현행화. 어제(2026-05-28) 누적된 19개 작업 단위와 4개 repo의 진행 상태를 반영해 전 단계 진행률·상태·신규 카테고리(PMS 애드온)를 추가.",[713,726],{},[14,728,730],{"id":729},"작업-내역","작업 내역",[393,732,734],{"id":733},"_1-wbs-전면-현행화","1. WBS 전면 현행화",[19,736,737],{},"기존 WBS는 작업 항목만 나열한 상태였음. 다음을 추가·갱신:",[19,739,740,743],{},[23,741,742],{},"상단 신규 섹션",":",[37,745,746,752,762],{},[31,747,748,751],{},[23,749,750],{},"진행률 스냅샷"," — 6개 단계별 % + 핵심 진행 사항",[31,753,754,757,758,761],{},[23,755,756],{},"누적 완료 자산"," — 인프라 \u002F 문서·자산 \u002F ",[49,759,760],{},"malgn-helper-pms"," 데모 \u002F 운영 정책 4개 카테고리로 정리",[31,763,764,767],{},[23,765,766],{},"상태 범례"," (✅ 완료 · 🟢 진행 중 · ⚪ 대기 · ⛔ 보류)",[19,769,770,743],{},[23,771,772],{},"기존 표 갱신",[37,774,775,782,788],{},[31,776,777,778,781],{},"모든 작업 항목에 ",[23,779,780],{},"상태 컬럼"," 추가",[31,783,784,787],{},[23,785,786],{},"산출물 컬럼","에 실제 생성된 파일·경로 명시",[31,789,790,793],{},[23,791,792],{},"비고 컬럼"," 신설 — 미진 사유·후속 작업 안내",[19,795,796,743],{},[23,797,798],{},"P1-3 구현에 신규 카테고리 추가",[37,800,801],{},[31,802,803,808,809],{},[23,804,805,806,132],{},"PMS 애드온 (",[49,807,760],{}," — 3-9 ~ 3-15 (총 7개 항목)\n",[37,810,811,814,817,820,823,826,829],{},[31,812,813],{},"3-9 브리핑 카드 컴포넌트 통합 ✅",[31,815,816],{},"3-10 Q&A 평가 카드 컴포넌트 통합 ✅",[31,818,819],{},"3-11 워크플로 페이지 ✅",[31,821,822],{},"3-12 임베드 인터페이스 ✅",[31,824,825],{},"3-13 표준답변 다중 템플릿 + 저장 ✅",[31,827,828],{},"3-14 실제 API 연동 ⚪",[31,830,831],{},"3-15 Q&A 평가 워크플로 페이지 ⚪",[19,833,834,743],{},[23,835,836],{},"횡단 운영 도구 섹션 신규",[37,838,839],{},[31,840,841],{},"일괄 배포 스크립트 \u002F 일단위 이력 \u002F 다중 계정 Cloudflare \u002F Pages 배포 표준 \u002F 작성자 분류 규칙 — 모두 ✅",[19,843,844,743],{},[23,845,846],{},"다음 단계 우선순위 제안 (6건)",[28,848,849,852,855,858,861,864],{},[31,850,851],{},"P1-3-1 DB 구축",[31,853,854],{},"P1-2-4 데이터 설계",[31,856,857],{},"P1-3-6 API 개발 (1차)",[31,859,860],{},"P1-3-14 PMS ↔ API 실연동",[31,862,863],{},"P1-2-6 AI 프로토타입",[31,865,866],{},"P1-3-15 Q&A 평가 워크플로 페이지",[393,868,870],{"id":869},"_2-진행률-현황-산정","2. 진행률 현황 산정",[19,872,873],{},"각 단계별로 어제까지 누적된 작업을 환산:",[398,875,876,886],{},[401,877,878],{},[404,879,880,883],{},[407,881,882],{},"Phase 1 단계",[407,884,885],{},"진행률",[415,887,888,896,904,912,920,928],{},[404,889,890,893],{},[420,891,892],{},"착수\u002F분석",[420,894,895],{},"70% (요구사항만 미완)",[404,897,898,901],{},[420,899,900],{},"설계",[420,902,903],{},"40% (데이터 설계·AI PoC 미진)",[404,905,906,909],{},[420,907,908],{},"구현",[420,910,911],{},"25% (보일러플레이트+PMS 데모만, API·DB·관리자 본격 미진)",[404,913,914,917],{},[420,915,916],{},"교육·연동",[420,918,919],{},"10% (배포 스크립트·이력 시스템)",[404,921,922,925],{},[420,923,924],{},"테스트",[420,926,927],{},"0%",[404,929,930,933],{},[420,931,932],{},"이행",[420,934,935],{},"5% (보일러플레이트 첫 배포만)",[937,938,939],"blockquote",{},[19,940,941],{},"M1 인프라 Ready 게이트 직전. 다음 6개 작업 완료 시 M2(자료 수집) 진입.",[393,943,945,946,949],{"id":944},"_2-malgn-helper-pms에-wbs-진행-현황-페이지-신규","2. malgn-helper-pms에 ",[49,947,948],{},"\u002Fwbs"," 진행 현황 페이지 신규",[19,951,952,953,956],{},"WBS.md 내용을 시각화한 페이지. 메인 페이지(",[49,954,955],{},"\u002F",")에서 우상단 링크로 진입.",[19,958,959,743],{},[23,960,961],{},"섹션 구성",[37,963,964,967,973,979,984,995,1001,1007],{},[31,965,966],{},"헤더 — WBS 배지 + 마지막 현행화 일자",[31,968,969,972],{},[23,970,971],{},"가중평균 진행률"," 큰 숫자 + 게이지 바 (Phase 1 6단계 가중 계산)",[31,974,975,978],{},[23,976,977],{},"단계별 진행률"," 6개 카드 (각 단계 ID·이름·비중·진행률·요약 + 게이지)",[31,980,981,983],{},[23,982,756],{}," 4 카드 (인프라\u002F문서\u002FPMS 데모\u002F운영 정책 + 진행률·항목 리스트)",[31,985,986,989,990],{},[23,987,988],{},"Phase 1 작업 상세"," — 6개 접기\u002F펴기 details 블록 (진행 중인 단계는 기본 펼침)\n",[37,991,992],{},[31,993,994],{},"각 작업 항목 한 줄: ID · 제목 · 비고 · 상태 배지(✅\u002F🟢\u002F⚪\u002F⛔)",[31,996,997,1000],{},[23,998,999],{},"다음 단계 우선순위 6건"," 카드",[31,1002,1003,1006],{},[23,1004,1005],{},"Phase 2"," placeholder (모두 대기)",[31,1008,1009],{},"푸터에 WBS.md \u002F history\u002F 원본 링크",[19,1011,1012,743],{},[23,1013,1014],{},"디자인 토큰",[37,1016,1017,1020,1023],{},[31,1018,1019],{},"상태 배지: emerald(done) · amber(in_progress) · neutral(pending) · rose(blocked)",[31,1021,1022],{},"게이지 색상: 70%+ emerald · 30%+ amber · 0%+ neutral",[31,1024,1025],{},"카드: rounded-lg border-neutral-200 bg-white p-4 (브리핑\u002FQA 카드와 일관)",[19,1027,1028,1031],{},[23,1029,1030],{},"데이터",": 현재 WBS.md를 미러링한 TypeScript 인라인. 추후 빌드 타임 마크다운 파싱으로 자동화 검토.",[19,1033,1034,1035],{},"배포 URL: ",[665,1036,703],{"href":703,"rel":1037},[669],[393,1039,1041],{"id":1040},"_3-wbs-데이터-저장소를-json-정적-파일로-결정","3. WBS 데이터 저장소를 JSON 정적 파일로 결정",[19,1043,1044,1047,1048,1051],{},[23,1045,1046],{},"경위",": WBS 영속화를 위해 D1 DB를 한 차례 시도(생성·바인딩·CRUD 엔드포인트·CORS까지 구현 완료) 했으나, 사용자 결정으로 ",[23,1049,1050],{},"정적 JSON 공유 방식으로 전환",".",[19,1053,1054,1057,1058],{},[23,1055,1056],{},"최종 채택",": ",[49,1059,1060],{},"malgn-helper-pms\u002Fpublic\u002Fwbs.json",[37,1062,1063,1070,1077],{},[31,1064,1065,1066,1069],{},"파일 1개. 편집 후 ",[49,1067,1068],{},".\u002Fscripts\u002Fdeploy.sh malgn-helper-pms ..."," 한 번이면 배포·공유 완료",[31,1071,1072,1073,1076],{},"공개 URL ",[49,1074,1075],{},"https:\u002F\u002Fmalgn-helper-pms.pages.dev\u002Fwbs.json"," 으로 다른 시스템에서도 fetch 가능 (CORS 별도 설정 불요)",[31,1078,1079],{},"DB·런타임 의존 없음 → 장애 영향 0",[19,1081,1082,743],{},[23,1083,1084],{},"롤백 \u002F 정리",[37,1086,1087,1097,1103,1109],{},[31,1088,1089,1092,1093,1096],{},[49,1090,1091],{},"malgn-helper-api\u002Fwrangler.jsonc","에서 ",[49,1094,1095],{},"d1_databases"," 바인딩 제거",[31,1098,1099,1102],{},[49,1100,1101],{},"src\u002Findex.ts","를 원래 형태(hello + healthz)로 환원",[31,1104,1105,1108],{},[49,1106,1107],{},"migrations\u002F"," 폴더 삭제",[31,1110,1111,1112,99,1115,1118,1119,1122],{},"D1 DB 자체는 Cloudflare에 잔존 (",[49,1113,1114],{},"malgn-helper-wbs",[49,1116,1117],{},"558d397e-…",") — 사용 안함. 추후 ",[49,1120,1121],{},"wrangler d1 delete malgn-helper-wbs"," 가능",[19,1124,1125,743],{},[23,1126,1127],{},"JSON 스키마",[1129,1130,1135],"pre",{"className":1131,"code":1132,"language":1133,"meta":1134,"style":1134},"language-jsonc shiki shiki-themes github-light github-dark","{\n  \"_meta\": { \"lastUpdated\": \"2026-05-29\", \"project\": \"...\", \"source\": \"...\", \"editGuide\": \"...\" },\n  \"phase1\": {\n    \"stages\": [\n      {\n        \"id\": \"P1-1\", \"name\": \"...\", \"weight\": 10, \"progress\": 70, \"summary\": \"...\",\n        \"tasks\": [\n          { \"id\": \"P1-1-1\", \"taskNo\": \"1-1\", \"title\": \"...\",\n            \"status\": \"done|in_progress|pending|blocked\",\n            \"note\": \"...\", \"targetDate\": \"YYYY-MM-DD\", \"completionDate\": \"YYYY-MM-DD\" }\n        ]\n      }\n    ]\n  }\n}\n","jsonc","",[49,1136,1137,1144,1150,1156,1162,1168,1174,1180,1186,1192,1198,1204,1210,1216,1222],{"__ignoreMap":1134},[312,1138,1141],{"class":1139,"line":1140},"line",1,[312,1142,1143],{},"{\n",[312,1145,1147],{"class":1139,"line":1146},2,[312,1148,1149],{},"  \"_meta\": { \"lastUpdated\": \"2026-05-29\", \"project\": \"...\", \"source\": \"...\", \"editGuide\": \"...\" },\n",[312,1151,1153],{"class":1139,"line":1152},3,[312,1154,1155],{},"  \"phase1\": {\n",[312,1157,1159],{"class":1139,"line":1158},4,[312,1160,1161],{},"    \"stages\": [\n",[312,1163,1165],{"class":1139,"line":1164},5,[312,1166,1167],{},"      {\n",[312,1169,1171],{"class":1139,"line":1170},6,[312,1172,1173],{},"        \"id\": \"P1-1\", \"name\": \"...\", \"weight\": 10, \"progress\": 70, \"summary\": \"...\",\n",[312,1175,1177],{"class":1139,"line":1176},7,[312,1178,1179],{},"        \"tasks\": [\n",[312,1181,1183],{"class":1139,"line":1182},8,[312,1184,1185],{},"          { \"id\": \"P1-1-1\", \"taskNo\": \"1-1\", \"title\": \"...\",\n",[312,1187,1189],{"class":1139,"line":1188},9,[312,1190,1191],{},"            \"status\": \"done|in_progress|pending|blocked\",\n",[312,1193,1195],{"class":1139,"line":1194},10,[312,1196,1197],{},"            \"note\": \"...\", \"targetDate\": \"YYYY-MM-DD\", \"completionDate\": \"YYYY-MM-DD\" }\n",[312,1199,1201],{"class":1139,"line":1200},11,[312,1202,1203],{},"        ]\n",[312,1205,1207],{"class":1139,"line":1206},12,[312,1208,1209],{},"      }\n",[312,1211,1213],{"class":1139,"line":1212},13,[312,1214,1215],{},"    ]\n",[312,1217,1219],{"class":1139,"line":1218},14,[312,1220,1221],{},"  }\n",[312,1223,1225],{"class":1139,"line":1224},15,[312,1226,1227],{},"}\n",[393,1229,1231],{"id":1230},"_4-wbs-페이지에-목표일완료일-컬럼-추가","4. \u002Fwbs 페이지에 목표일·완료일 컬럼 추가",[19,1233,1234],{},"페이지 본문의 작업 상세를 표 구조로 변경:",[398,1236,1237],{},[401,1238,1239],{},[404,1240,1241,1244,1247,1250,1253],{},[407,1242,1243],{},"ID",[407,1245,1246],{},"작업",[407,1248,1249],{},"목표일",[407,1251,1252],{},"완료일",[407,1254,1255],{},"상태",[37,1257,1258,1272,1279,1285],{},[31,1259,1260,1262,1263,99,1266,241,1269,132],{},[23,1261,1249],{}," — 미설정 시 ",[49,1264,1265],{},"—",[23,1267,1268],{},"지난 미완료는 빨강 강조",[49,1270,1271],{},"text-rose-600 font-semibold",[31,1273,1274,1276,1277],{},[23,1275,1252],{}," — 완료된 경우 emerald, 그 외 ",[49,1278,1265],{},[31,1280,1281,1284],{},[49,1282,1283],{},"useFetch('\u002Fwbs.json')"," 로 동기 로드, 로딩·에러 상태 표시",[31,1286,1287,1288,1291],{},"헤더·푸터에 ",[49,1289,1290],{},"\u002Fwbs.json"," 링크 노출 (외부 시스템 임베드 가이드)",[14,1293,1294],{"id":1294},"배포",[393,1296,1298,1299,1301],{"id":1297},"_0834-malgn-helper-pms-cloudflare-pages","08:34 — ",[49,1300,760],{}," → Cloudflare Pages",[37,1303,1304,1311],{},[31,1305,1306,1307,1310],{},"커밋: ",[49,1308,1309],{},"b803162"," (신규 커밋: yes)",[31,1312,1313],{},"메시지: feat: \u002Fwbs 진행 현황 페이지 + 인덱스 링크",[393,1315,1317,1318,1321],{"id":1316},"_0840-malgn-helper-api-cloudflare-workers","08:40 — ",[49,1319,1320],{},"malgn-helper-api"," → Cloudflare Workers",[37,1323,1324,1329],{},[31,1325,1306,1326,1310],{},[49,1327,1328],{},"f29e575",[31,1330,1331],{},"메시지: feat: D1(malgn-helper-wbs) 바인딩 + \u002Fwbs CRUD 엔드포인트 + CORS",[393,1333,1335,1336,1321],{"id":1334},"_0846-malgn-helper-api-cloudflare-workers","08:46 — ",[49,1337,1320],{},[37,1339,1340,1345],{},[31,1341,1306,1342,1310],{},[49,1343,1344],{},"d177b29",[31,1346,1347],{},"메시지: revert: D1 제거 (WBS는 JSON 정적 파일로 전환)",[393,1349,1335,1351,1301],{"id":1350},"_0846-malgn-helper-pms-cloudflare-pages",[49,1352,760],{},[37,1354,1355,1360],{},[31,1356,1306,1357,1310],{},[49,1358,1359],{},"5eda3a4",[31,1361,1362],{},"메시지: feat: WBS를 정적 JSON(\u002Fwbs.json)으로 전환 + 목표일·완료일 컬럼 추가",[393,1364,1366,1367,1301],{"id":1365},"_0851-malgn-helper-pms-cloudflare-pages","08:51 — ",[49,1368,760],{},[37,1370,1371,1376],{},[31,1372,1306,1373,1310],{},[49,1374,1375],{},"a8bd1cb",[31,1377,1378],{},"메시지: fix: \u002Fwbs 페이지의 wbs.json fetch를 client-only로 (SSR 404 회피)",[393,1380,1382,1383,1301],{"id":1381},"_0858-malgn-helper-pms-cloudflare-pages","08:58 — ",[49,1384,760],{},[37,1386,1387,1392],{},[31,1388,1306,1389,1310],{},[49,1390,1391],{},"81031f3",[31,1393,1394],{},"메시지: feat: WBS 산출물 URL 컬럼·인라인 편집·JSON 복사 (localStorage 임시 저장)",[393,1396,1398,1399,1301],{"id":1397},"_0905-malgn-helper-pms-cloudflare-pages","09:05 — ",[49,1400,760],{},[37,1402,1403,1408],{},[31,1404,1306,1405,1310],{},[49,1406,1407],{},"c75d600",[31,1409,1410],{},"메시지: redesign(\u002Fwbs): Editorial Blueprint — Instrument Serif 이탤릭 + JetBrains Mono + 따뜻한 크림지 + 안전 오렌지 액센트 + 플로팅 편집바",[393,1412,1414,1415,1301],{"id":1413},"_0913-malgn-helper-pms-cloudflare-pages","09:13 — ",[49,1416,760],{},[37,1418,1419,1424],{},[31,1420,1306,1421,1310],{},[49,1422,1423],{},"42a259f",[31,1425,1426],{},"메시지: redesign(\u002Fwbs): Terminal\u002FIDE — GitHub Dark Dimmed + JetBrains Mono + 탭바·라인거터·상태바",[393,1428,1430,1431,1301],{"id":1429},"_0918-malgn-helper-pms-cloudflare-pages","09:18 — ",[49,1432,760],{},[37,1434,1435,1440],{},[31,1436,1306,1437,1310],{},[49,1438,1439],{},"21b172c",[31,1441,1442],{},"메시지: redesign(\u002Fwbs): Soft SaaS (Notion\u002FLinear 풍) — 라이트 + Pretendard + 부드러운 모서리·여백",[393,1444,1446,1447,1301],{"id":1445},"_0921-malgn-helper-pms-cloudflare-pages","09:21 — ",[49,1448,760],{},[37,1450,1451,1456],{},[31,1452,1306,1453,1310],{},[49,1454,1455],{},"5460422",[31,1457,1458],{},"메시지: tweak(\u002Fwbs): 전체 폰트 사이즈 +1px (가독성)",[393,1460,1462,1463,1301],{"id":1461},"_0924-malgn-helper-pms-cloudflare-pages","09:24 — ",[49,1464,760],{},[37,1466,1467,1472],{},[31,1468,1306,1469,1310],{},[49,1470,1471],{},"e704617",[31,1473,1474],{},"메시지: tweak(\u002Fwbs): 전체 폰트 -1px (이전 +1 환원)",[393,1476,1478,1479,1301],{"id":1477},"_0929-malgn-helper-pms-cloudflare-pages","09:29 — ",[49,1480,760],{},[37,1482,1483,1488],{},[31,1484,1306,1485,1310],{},[49,1486,1487],{},"8f64bed",[31,1489,1490,1491,1494],{},"메시지: tweak(\u002Fwbs): 목표일·완료일 input",[312,1492,1493],{},"type=date"," 편집 + 컬럼 너비 키움 + 상태 nowrap + URL -1px",[393,1496,1498,1499,1321],{"id":1497},"_0946-malgn-helper-api-cloudflare-workers","09:46 — ",[49,1500,1320],{},[37,1502,1503,1508],{},[31,1504,1306,1505,1310],{},[49,1506,1507],{},"25de7c4",[31,1509,1510],{},"메시지: feat: \u002Fwbs GET·PUT (R2 자동저장) + CORS",[393,1512,1514,1515,1301],{"id":1513},"_0950-malgn-helper-pms-cloudflare-pages","09:50 — ",[49,1516,760],{},[37,1518,1519,1524],{},[31,1520,1306,1521,1310],{},[49,1522,1523],{},"3ce38a9",[31,1525,1526],{},"메시지: feat(\u002Fwbs): API(R2) 자동저장 — 800ms debounce + 저장 상태 표시 + status 인라인 select",[393,1528,1530,1531,1301],{"id":1529},"_1009-malgn-helper-pms-cloudflare-pages","10:09 — ",[49,1532,760],{},[37,1534,1535,1540],{},[31,1536,1306,1537,1310],{},[49,1538,1539],{},"ce94486",[31,1541,1542],{},"메시지: fix(\u002Fwbs): 가중평균 수식 보정 + stage weight 합 100 정규화 (0.2% → 24.2%)",[393,1544,1546,1547,1301],{"id":1545},"_1019-malgn-helper-pms-cloudflare-pages","10:19 — ",[49,1548,760],{},[37,1550,1551,1556],{},[31,1552,1306,1553,1310],{},[49,1554,1555],{},"e341642",[31,1557,1558],{},"메시지: chore(\u002Fwbs): PMS 스토리보드 5건을 P1-2(설계) 하위로 재배치 (id·taskNo 압축)",[393,1560,1562,1563,1321],{"id":1561},"_1037-malgn-helper-api-cloudflare-workers","10:37 — ",[49,1564,1320],{},[37,1566,1567,1572],{},[31,1568,1306,1569,1310],{},[49,1570,1571],{},"acac93e",[31,1573,1574],{},"메시지: feat: Hyperdrive(pms) 바인딩 + GET \u002Fdb\u002Fping (mysql2)",[393,1576,1578,1579,1321],{"id":1577},"_1045-malgn-helper-api-cloudflare-workers","10:45 — ",[49,1580,1320],{},[37,1582,1583,1588],{},[31,1584,1306,1585,1310],{},[49,1586,1587],{},"36ef602",[31,1589,1590],{},"메시지: feat: PMS 연동 GET \u002Fpms\u002Fposts\u002F:id — 직원\u002F고객 분류 + 비공개 댓글 마스킹 + 탐색용 \u002Fdb\u002F* 엔드포인트",[393,1592,1594,1595,1301],{"id":1593},"_1052-malgn-helper-pms-cloudflare-pages","10:52 — ",[49,1596,760],{},[37,1598,1599,1604],{},[31,1600,1306,1601,1310],{},[49,1602,1603],{},"eadcbd2",[31,1605,1606],{},"메시지: feat: BriefingCard 실 API 연동 — generateBriefing()이 \u002Fpms\u002Fprojects\u002F:id\u002Fbriefing 호출 (P1-2-7 스토리보드 → 실서비스)",[393,1608,1610,1611,1321],{"id":1609},"_1053-malgn-helper-api-cloudflare-workers","10:53 — ",[49,1612,1320],{},[37,1614,1615,1620],{},[31,1616,1306,1617,1310],{},[49,1618,1619],{},"615204f",[31,1621,1622],{},"메시지: feat: GET \u002Fpms\u002Fprojects\u002F:id\u002Fbriefing — 멤버\u002F통계\u002F라벨\u002F알림 집계 (LLM 영역 제외)",[393,1624,1626,1627,1301],{"id":1625},"_1059-malgn-helper-pms-cloudflare-pages","10:59 — ",[49,1628,760],{},[37,1630,1631,1636],{},[31,1632,1306,1633,1310],{},[49,1634,1635],{},"04f41d0",[31,1637,1638],{},"메시지: feat: \u002Fprojects 프로젝트 목록 페이지 (검색·페이지네이션·최근활동)",[393,1640,1642,1643,1321],{"id":1641},"_1100-malgn-helper-api-cloudflare-workers","11:00 — ",[49,1644,1320],{},[37,1646,1647,1652],{},[31,1648,1306,1649,1310],{},[49,1650,1651],{},"e8f5d31",[31,1653,1654],{},"메시지: feat: GET \u002Fpms\u002Fprojects?q=&limit=&offset= 목록 + 검색 + 카운트",[393,1656,1658,1659,1321],{"id":1657},"_1104-malgn-helper-api-cloudflare-workers","11:04 — ",[49,1660,1320],{},[37,1662,1663,1668],{},[31,1664,1306,1665,1310],{},[49,1666,1667],{},"778453c",[31,1669,1670],{},"메시지: fix(\u002Fpms\u002Fprojects): id > 0 조건 추가 (시스템\u002F임시 row 제외)",[393,1672,1674,1675,1321],{"id":1673},"_1115-malgn-helper-api-cloudflare-workers","11:15 — ",[49,1676,1320],{},[37,1678,1679,1684],{},[31,1680,1306,1681,1310],{},[49,1682,1683],{},"d28a282",[31,1685,1686],{},"메시지: feat: \u002Fdoc API 문서 페이지 (Scalar + OpenAPI 3.1)",[393,1688,1690,1691,1321],{"id":1689},"_1131-malgn-helper-api-cloudflare-workers","11:31 — ",[49,1692,1320],{},[37,1694,1695,1701],{},[31,1696,1306,1697,1700],{},[49,1698,1699],{},"d7ce674"," (신규 커밋: no)",[31,1702,1703],{},"메시지: chore: migrate-hp-tables 일회용 엔드포인트 제거 (4테이블 생성 완료)",[393,1705,1707,1708,1301],{"id":1706},"_1137-malgn-helper-pms-cloudflare-pages","11:37 — ",[49,1709,760],{},[37,1711,1712,1717],{},[31,1713,1306,1714,1310],{},[49,1715,1716],{},"e1d8d20",[31,1718,1719],{},"메시지: feat: BriefingCard generateBriefing()을 POST ...\u002Fgenerate로 전환 (서버 id 사용)",[393,1721,1723,1724,1321],{"id":1722},"_1138-malgn-helper-api-cloudflare-workers","11:38 — ",[49,1725,1320],{},[37,1727,1728,1733],{},[31,1729,1306,1730,1310],{},[49,1731,1732],{},"4bab4d2",[31,1734,1735],{},"메시지: feat: POST \u002Fbriefing\u002Fgenerate + 캐시·로깅 (hp_briefing, hp_llm_log) + 목록\u002F단건\u002F삭제 + OpenAPI 갱신",[393,1737,1739,1740,1301],{"id":1738},"_1144-malgn-helper-pms-cloudflare-pages","11:44 — ",[49,1741,760],{},[37,1743,1744,1749],{},[31,1745,1306,1746,1310],{},[49,1747,1748],{},"b724b9f",[31,1750,1751],{},"메시지: feat: QaEvalCard 저장 버튼을 POST \u002Fstandard-answers로 실연동 (localStorage → hp_standard_answer)",[393,1753,1739,1755,1321],{"id":1754},"_1144-malgn-helper-api-cloudflare-workers",[49,1756,1320],{},[37,1758,1759,1764],{},[31,1760,1306,1761,1310],{},[49,1762,1763],{},"5ee2608",[31,1765,1766],{},"메시지: feat: \u002Fstandard-answers CRUD + \u002Fuse + OpenAPI (hp_standard_answer)",[393,1768,1770,1771,1321],{"id":1769},"_1155-malgn-helper-api-cloudflare-workers","11:55 — ",[49,1772,1320],{},[37,1774,1775,1780],{},[31,1776,1306,1777,1310],{},[49,1778,1779],{},"d0b91e8",[31,1781,1782],{},"메시지: feat: OpenAI 연동 인프라 — AI Gateway + LLM hotTopics + hp_llm_log 비용·토큰",[393,1784,1786,1787,1321],{"id":1785},"_1203-malgn-helper-api-cloudflare-workers","12:03 — ",[49,1788,1320],{},[37,1790,1791,1796],{},[31,1792,1306,1793,1310],{},[49,1794,1795],{},"ea13e0d",[31,1797,1798],{},"메시지: fix(llm): cost 계산이 model prefix(openai\u002F...)를 인식하도록 base 추출 + Gateway 토큰 헤더 지원",[393,1800,1802,1803,1301],{"id":1801},"_1214-malgn-helper-pms-cloudflare-pages","12:14 — ",[49,1804,760],{},[37,1806,1807,1812],{},[31,1808,1306,1809,1310],{},[49,1810,1811],{},"d8a0197",[31,1813,1814],{},"메시지: feat(QaEvalCard): 실 API 연동 — POST \u002Fpms\u002Fposts\u002F:id\u002Feval\u002Fgenerate",[393,1816,1802,1818,1321],{"id":1817},"_1214-malgn-helper-api-cloudflare-workers",[49,1819,1320],{},[37,1821,1822,1827],{},[31,1823,1306,1824,1310],{},[49,1825,1826],{},"2368b29",[31,1828,1829],{},"메시지: feat: Q&A 평가 카드 LLM 연동 (5축 + templates + hp_qa_eval) + OpenAPI 4건 추가",[393,1831,1833,1834,1321],{"id":1832},"_1218-malgn-helper-api-cloudflare-workers","12:18 — ",[49,1835,1320],{},[37,1837,1838,1843],{},[31,1839,1306,1840,1310],{},[49,1841,1842],{},"e191511",[31,1844,1845],{},"메시지: feat: 브리핑 LLM 확장 — oneLiner\u002FstatusReason\u002Furgent\u002Ffaq\u002Fpolicies 채우기",[393,1847,1849,1850,1301],{"id":1848},"_1231-malgn-helper-pms-cloudflare-pages","12:31 — ",[49,1851,760],{},[37,1853,1854,1859],{},[31,1855,1306,1856,1310],{},[49,1857,1858],{},"78d4873",[31,1860,1861],{},"메시지: feat: \u002Fadmin\u002Fcost LLM 비용·호출 대시보드 페이지",[393,1863,1849,1865,1321],{"id":1864},"_1231-malgn-helper-api-cloudflare-workers",[49,1866,1320],{},[37,1868,1869,1874],{},[31,1870,1306,1871,1310],{},[49,1872,1873],{},"60b6f30",[31,1875,1876],{},"메시지: feat: GET \u002Fadmin\u002Fcost — hp_llm_log 일·모델·엔티티 집계 + OpenAPI",[393,1878,1880,1881,1301],{"id":1879},"_1241-malgn-helper-pms-cloudflare-pages","12:41 — ",[49,1882,760],{},[37,1884,1885,1890],{},[31,1886,1306,1887,1310],{},[49,1888,1889],{},"281ba35",[31,1891,1892],{},"메시지: feat: 홈에 \u002Fadmin\u002Fcost · \u002Fprojects · \u002Fwbs 진입 링크 노출",[393,1894,1880,1896,1321],{"id":1895},"_1241-malgn-helper-api-cloudflare-workers",[49,1897,1320],{},[37,1899,1900,1905],{},[31,1901,1306,1902,1310],{},[49,1903,1904],{},"845515f",[31,1906,1907],{},"메시지: perf: briefing LLM 2회 호출 병렬화 (Promise.allSettled) — 7s→3.5s",[393,1909,1911,1912,1301],{"id":1910},"_1246-malgn-helper-pms-cloudflare-pages","12:46 — ",[49,1913,760],{},[37,1915,1916,1921],{},[31,1917,1306,1918,1310],{},[49,1919,1920],{},"b023aab",[31,1922,1923],{},"메시지: feat: \u002Fadmin\u002Fevals Q&A 평가 목록·정렬·필터 + 홈 링크 추가",[393,1925,1911,1927,1321],{"id":1926},"_1246-malgn-helper-api-cloudflare-workers",[49,1928,1320],{},[37,1930,1931,1936],{},[31,1932,1306,1933,1310],{},[49,1934,1935],{},"68c9bd6",[31,1937,1938],{},"메시지: feat: GET \u002Fadmin\u002Fevals (정렬·필터·post\u002Fproject JOIN) + OpenAPI",[393,1940,1942,1943,1301],{"id":1941},"_1249-malgn-helper-pms-cloudflare-pages","12:49 — ",[49,1944,760],{},[37,1946,1947,1952],{},[31,1948,1306,1949,1310],{},[49,1950,1951],{},"014c513",[31,1953,1954],{},"메시지: tweak(home): 제목 '고객사 목록' → '맑은도우미 데모'",[393,1956,1958,1959,1321],{"id":1957},"_1254-malgn-helper-api-cloudflare-workers","12:54 — ",[49,1960,1320],{},[37,1962,1963,1968],{},[31,1964,1306,1965,1310],{},[49,1966,1967],{},"614dff7",[31,1969,1970],{},"메시지: chore(hp_qa_eval): overall_verdict VARCHAR(20→100) + trim 완화 + admin 엔드포인트 정리",[393,1972,1974,1975,1301],{"id":1973},"_1301-malgn-helper-pms-cloudflare-pages","13:01 — ",[49,1976,760],{},[37,1978,1979,1984],{},[31,1980,1306,1981,1310],{},[49,1982,1983],{},"bbf380d",[31,1985,1986],{},"메시지: feat: \u002Fadmin\u002Fsuggestions 표준답변 후보 자동 추출 페이지 + evals\u002F홈 링크",[393,1988,1974,1990,1321],{"id":1989},"_1301-malgn-helper-api-cloudflare-workers",[49,1991,1320],{},[37,1993,1994,1999],{},[31,1995,1306,1996,1310],{},[49,1997,1998],{},"c4342d1",[31,2000,2001],{},"메시지: feat: POST \u002Fpms\u002Fprojects\u002F:id\u002Fstandard-answer-suggestions — LLM 패턴 추출 + OpenAPI",[393,2003,2005,2006,1301],{"id":2004},"_1311-malgn-helper-pms-cloudflare-pages","13:11 — ",[49,2007,760],{},[37,2009,2010,2015],{},[31,2011,1306,2012,1310],{},[49,2013,2014],{},"a7de0f3",[31,2016,2017],{},"메시지: feat: AppHeader 공통 컴포넌트로 5개 페이지 상단 디자인 통일 + 현재 라우트 강조",[393,2019,2021,2022,1301],{"id":2020},"_1321-malgn-helper-pms-cloudflare-pages","13:21 — ",[49,2023,760],{},[37,2025,2026,2031],{},[31,2027,1306,2028,1310],{},[49,2029,2030],{},"ad807cd",[31,2032,2033],{},"메시지: feat: 5개 admin 페이지 본문 톤을 메인·브리핑·QnA 카드와 통일 (UContainer\u002Fh1 text-3xl\u002F표 thead bg-neutral-50 uppercase tracking-wider\u002F카드 hover primary-500\u002F링 칩)",[393,2035,2037,2038,1321],{"id":2036},"_1325-malgn-helper-api-cloudflare-workers","13:25 — ",[49,2039,1320],{},[37,2041,2042,2047],{},[31,2043,1306,2044,1310],{},[49,2045,2046],{},"870fa16",[31,2048,2049],{},"메시지: feat(\u002Fpms\u002Fprojects): site_id=1 기본 필터 (?siteId=all로 우회 가능) + OpenAPI",[393,2051,2053,2054,1301],{"id":2052},"_1335-malgn-helper-pms-cloudflare-pages","13:35 — ",[49,2055,760],{},[37,2057,2058,2063],{},[31,2059,1306,2060,1310],{},[49,2061,2062],{},"ed0e208",[31,2064,2065],{},"메시지: feat(\u002Fprojects): 그룹 컬럼 추가 (tb_project_group 매칭)",[393,2067,2053,2069,1321],{"id":2068},"_1335-malgn-helper-api-cloudflare-workers",[49,2070,1320],{},[37,2072,2073,2078],{},[31,2074,1306,2075,1310],{},[49,2076,2077],{},"0a0ef9a",[31,2079,2080],{},"메시지: feat(\u002Fpms\u002Fprojects): tb_project_group JOIN으로 groupName 반환 + OpenAPI",[393,2082,2084,2085,1301],{"id":2083},"_1341-malgn-helper-pms-cloudflare-pages","13:41 — ",[49,2086,760],{},[37,2088,2089,2094],{},[31,2090,1306,2091,1310],{},[49,2092,2093],{},"7712afb",[31,2095,2096],{},"메시지: feat: \u002Fprojects 그룹 셀렉트 + \u002Fadmin\u002Fevals 그룹 인라인 칩",[393,2098,2084,2100,1321],{"id":2099},"_1341-malgn-helper-api-cloudflare-workers",[49,2101,1320],{},[37,2103,2104,2109],{},[31,2105,1306,2106,1310],{},[49,2107,2108],{},"71771f8",[31,2110,2111],{},"메시지: feat: GET \u002Fpms\u002Fgroups + \u002Fpms\u002Fprojects ?groupId + \u002Fadmin\u002Fevals groupName JOIN",[393,2113,2115,2116,1301],{"id":2114},"_1345-malgn-helper-pms-cloudflare-pages","13:45 — ",[49,2117,760],{},[37,2119,2120,2125],{},[31,2121,1306,2122,1310],{},[49,2123,2124],{},"d7b8edc",[31,2126,2127],{},"메시지: fix(BriefingCard): 담당자\u002F보조 이름 표시 — UTooltip 제거하고 일반 span+title",[393,2129,2131,2132,1301],{"id":2130},"_1409-malgn-helper-pms-cloudflare-pages","14:09 — ",[49,2133,760],{},[37,2135,2136,2141],{},[31,2137,1306,2138,1310],{},[49,2139,2140],{},"8b60916",[31,2142,2143],{},"메시지: fix(BriefingCard): 고객 primary\u002Fothers도 UTooltip 제거하여 이름 표시",[393,2145,2131,2147,1321],{"id":2146},"_1409-malgn-helper-api-cloudflare-workers",[49,2148,1320],{},[37,2150,2151,2156],{},[31,2152,1306,2153,1310],{},[49,2154,2155],{},"81b422f",[31,2157,2158],{},"메시지: feat(briefing): 180일 cutoff — 사람·FRT·미응답·긴급·알림은 180일 \u002F 누적·핫카테고리·FAQ·정책은 전체. statusLabel '휴면' 추가. extras LLM input에 RECENT_180 분리",[393,2160,2162,2163,1301],{"id":2161},"_1417-malgn-helper-pms-cloudflare-pages","14:17 — ",[49,2164,760],{},[37,2166,2167,2172],{},[31,2168,1306,2169,1310],{},[49,2170,2171],{},"0874622",[31,2173,2174],{},"메시지: tweak(BriefingCard): 평균 FRT hint를 영업시간 안내로 (avgFRTNote)",[393,2176,2162,2178,1321],{"id":2177},"_1417-malgn-helper-api-cloudflare-workers",[49,2179,1320],{},[37,2181,2182,2187],{},[31,2183,1306,2184,1310],{},[49,2185,2186],{},"e8a7500",[31,2188,2189],{},"메시지: feat(FRT): 영업시간(KST 평일 9~17, 공휴일 제외) 기준 계산",[393,2191,2193,2194,1301],{"id":2192},"_1422-malgn-helper-pms-cloudflare-pages","14:22 — ",[49,2195,760],{},[37,2197,2198,2203],{},[31,2199,1306,2200,1310],{},[49,2201,2202],{},"ce0aaec",[31,2204,2205],{},"메시지: tweak(BriefingCard): FRT hint를 avgFRTGrade로 (매우 빠름\u002F빠른 편\u002F보통\u002F느린 편\u002F응답 지연)",[393,2207,2193,2209,1321],{"id":2208},"_1422-malgn-helper-api-cloudflare-workers",[49,2210,1320],{},[37,2212,2213,2218],{},[31,2214,1306,2215,1310],{},[49,2216,2217],{},"afe3cbf",[31,2219,2220],{},"메시지: feat(briefing): avgFRTGrade 동적 등급 — 영업시간 분 기준 5단계",[393,2222,2224,2225,1321],{"id":2223},"_1425-malgn-helper-api-cloudflare-workers","14:25 — ",[49,2226,1320],{},[37,2228,2229,2234],{},[31,2230,1306,2231,1310],{},[49,2232,2233],{},"a0237f1",[31,2235,2236],{},"메시지: fix(timezone): PMS DB가 KST 기준 — mysql2 timezone='+09:00' + toIso에 +09:00 명시",[393,2238,2240,2241,1301],{"id":2239},"_1437-malgn-helper-pms-cloudflare-pages","14:37 — ",[49,2242,760],{},[37,2244,2245,2250],{},[31,2246,1306,2247,1310],{},[49,2248,2249],{},"d5d5b59",[31,2251,2252],{},"메시지: feat(BriefingCard): 응대 통계 5칸으로(최근 180일 추가) + customer.primary name fallback 강화",[393,2254,2240,2256,1321],{"id":2255},"_1437-malgn-helper-api-cloudflare-workers",[49,2257,1320],{},[37,2259,2260,2265],{},[31,2261,1306,2262,1310],{},[49,2263,2264],{},"c7946dc",[31,2266,2267],{},"메시지: feat(briefing): stats.recent 180일 문의수 + customer 이름 fallback(email 로컬파트)",[393,2269,2271,2272,1301],{"id":2270},"_1445-malgn-helper-pms-cloudflare-pages","14:45 — ",[49,2273,760],{},[37,2275,2276,2280],{},[31,2277,1306,2278,1700],{},[49,2279,2249],{},[31,2281,2282],{},"메시지: chore: BriefingCard 캐시 무효화 (협력사 분류 적용)",[393,2284,2271,2286,1321],{"id":2285},"_1445-malgn-helper-api-cloudflare-workers",[49,2287,1320],{},[37,2289,2290,2295],{},[31,2291,1306,2292,1310],{},[49,2293,2294],{},"f56abe5",[31,2296,2297,2298,2301],{},"메시지: feat: 협력사 분류 (PARTNER_WHITELIST=",[312,2299,2300],{},"'플로즈'",") — customer.primary 후순위, partners 배열 신설",[393,2303,2305,2306,1301],{"id":2304},"_1447-malgn-helper-pms-cloudflare-pages","14:47 — ",[49,2307,760],{},[37,2309,2310,2315],{},[31,2311,1306,2312,1310],{},[49,2313,2314],{},"6459da6",[31,2316,2317,2318,2321],{},"메시지: tweak(\u002Fprojects\u002F",[312,2319,2320],{},"id","): 미니 통계 5칸으로 + 최근 180일 추가",[393,2323,2325,2326,1301],{"id":2324},"_1535-malgn-helper-pms-cloudflare-pages","15:35 — ",[49,2327,760],{},[37,2329,2330,2335],{},[31,2331,1306,2332,1310],{},[49,2333,2334],{},"e62f2e5",[31,2336,2337],{},"메시지: feat(BriefingCard): 고객 응대 톤·태도 박스 추가 (customer.persona)",[393,2339,2325,2341,1321],{"id":2340},"_1535-malgn-helper-api-cloudflare-workers",[49,2342,1320],{},[37,2344,2345,2350],{},[31,2346,1306,2347,1310],{},[49,2348,2349],{},"520c200",[31,2351,2352],{},"메시지: feat(briefing): customerPersona LLM 추출 — 고객 메시지(180일, 비공개·직원·협력사 제외) 30건 분석",[393,2354,2356,2357,1321],{"id":2355},"_1550-malgn-helper-api-cloudflare-workers","15:50 — ",[49,2358,1320],{},[37,2360,2361,2366],{},[31,2362,1306,2363,1310],{},[49,2364,2365],{},"978f358",[31,2367,2368],{},"메시지: feat(briefing): statusLabel 5단계 enum + 미응답 임계값 룰 고정. LLM은 statusLabel·statusReason 출력 금지. urgentCount≥5만 긴급 격상",[393,2370,2372,2373,1301],{"id":2371},"_1607-malgn-helper-pms-cloudflare-pages","16:07 — ",[49,2374,760],{},[37,2376,2377,2382],{},[31,2378,1306,2379,1310],{},[49,2380,2381],{},"43f6582",[31,2383,2384],{},"메시지: feat(BriefingCard): 협력사 영역 + 상담사 톤·태도 + 직함 trim + 라벨 변경",[393,2386,2372,2388,1321],{"id":2387},"_1607-malgn-helper-api-cloudflare-workers",[49,2389,1320],{},[37,2391,2392,2397],{},[31,2393,1306,2394,1310],{},[49,2395,2396],{},"246b27c",[31,2398,2399],{},"메시지: feat(briefing): partners 분리 + staffPersona LLM 추출",[393,2401,2403,2404,1301],{"id":2402},"_1700-malgn-helper-pms-cloudflare-pages","17:00 — ",[49,2405,760],{},[37,2407,2408,2413],{},[31,2409,1306,2410,1310],{},[49,2411,2412],{},"19a34e5",[31,2414,2415,2416,2418],{},"메시지: fix(\u002Fprojects\u002F",[312,2417,2320],{},"): 헤더 메타를 API 단건 호출로 로드 (이름·발주처·그룹·마지막활동·상태)",[393,2420,2403,2422,1321],{"id":2421},"_1700-malgn-helper-api-cloudflare-workers",[49,2423,1320],{},[37,2425,2426,2431],{},[31,2427,1306,2428,1310],{},[49,2429,2430],{},"0cfe132",[31,2432,2433],{},"메시지: feat: GET \u002Fpms\u002Fprojects\u002F:id 단건 메타 엔드포인트",[393,2435,2437,2438,1301],{"id":2436},"_1705-malgn-helper-pms-cloudflare-pages","17:05 — ",[49,2439,760],{},[37,2441,2442,2447],{},[31,2443,1306,2444,1310],{},[49,2445,2446],{},"5fd1550",[31,2448,2449],{},"메시지: fix(BriefingHistory): localStorage → 서버 fetch — 모든 브라우저에서 동일 데이터",[393,2451,2453,2454,1321],{"id":2452},"_1720-malgn-helper-api-cloudflare-workers","17:20 — ",[49,2455,1320],{},[37,2457,2458,2463],{},[31,2459,1306,2460,1310],{},[49,2461,2462],{},"4ea9760",[31,2464,2465],{},"메시지: perf(briefing): MySQL 부하 큰 폭 감소 — quick-check 캐시 + email LIKE → user_id IN",[393,2467,2469,2470,1321],{"id":2468},"_1748-malgn-helper-api-cloudflare-workers","17:48 — ",[49,2471,1320],{},[37,2473,2474,2479],{},[31,2475,1306,2476,1310],{},[49,2477,2478],{},"f77e24b",[31,2480,2481],{},"메시지: perf(briefing): members 쿼리 분리로 92s → 244ms (380배 단축, force=1 총 130s→10s) + timings 응답 노출",[393,2483,2485,2486,1321],{"id":2484},"_1752-malgn-helper-api-cloudflare-workers","17:52 — ",[49,2487,1320],{},[37,2489,2490,2495],{},[31,2491,1306,2492,1310],{},[49,2493,2494],{},"c0fddd8",[31,2496,2497],{},"메시지: fix(briefing): persona 없는 옛 캐시는 자동 폐기 후 재생성 + LLM 프롬프트에 persona 누락 금지 명시",[393,2499,2501,2502,1321],{"id":2500},"_1757-malgn-helper-api-cloudflare-workers","17:57 — ",[49,2503,1320],{},[37,2505,2506,2511],{},[31,2507,1306,2508,1310],{},[49,2509,2510],{},"4bdc3eb",[31,2512,2513],{},"메시지: feat(classify): 직원 룰에 tb_user.company='맑은소프트' 추가 (이메일 + 회사명 OR)",[393,2515,2517,2518,1321],{"id":2516},"_1759-malgn-helper-api-cloudflare-workers","17:59 — ",[49,2519,1320],{},[37,2521,2522,2527],{},[31,2523,1306,2524,1310],{},[49,2525,2526],{},"69256bb",[31,2528,2529],{},"메시지: fix(cors): allowMethods에 DELETE\u002FPATCH 추가 (브리핑·평가 삭제 실패 fix)",[393,2531,2533,2534,1301],{"id":2532},"_1805-malgn-helper-pms-cloudflare-pages","18:05 — ",[49,2535,760],{},[37,2537,2538,2543],{},[31,2539,1306,2540,1310],{},[49,2541,2542],{},"25bcd37",[31,2544,2545],{},"메시지: tweak(BriefingCard): 협력사를 고객 영역 하단으로 + 두 persona를 사람 grid 밖 좌우 나란히",[393,2547,2549,2550,1301],{"id":2548},"_1810-malgn-helper-pms-cloudflare-pages","18:10 — ",[49,2551,760],{},[37,2553,2554,2559],{},[31,2555,1306,2556,1310],{},[49,2557,2558],{},"64f8340",[31,2560,2561],{},"메시지: fix(BriefingHistory): v1 localStorage 자동 정리 (옛 캐시 잔존 → 삭제한 카드가 새로고침 시 다시 표시되던 문제)",[393,2563,2565,2566,1301],{"id":2564},"_1812-malgn-helper-pms-cloudflare-pages","18:12 — ",[49,2567,760],{},[37,2569,2570,2575],{},[31,2571,1306,2572,1310],{},[49,2573,2574],{},"43dd327",[31,2576,2577],{},"메시지: tweak(BriefingCard): 헤더 제목 옆 statusLabel 칩 제거",[393,2579,2581,2582,1321],{"id":2580},"_1816-malgn-helper-api-cloudflare-workers","18:16 — ",[49,2583,1320],{},[37,2585,2586,2591],{},[31,2587,1306,2588,1310],{},[49,2589,2590],{},"268daca",[31,2592,2593],{},"메시지: feat(classify): PARTNER_WHITELIST에 '옐로우윈' 추가",[393,2595,2597,2598,1321],{"id":2596},"_1819-malgn-helper-api-cloudflare-workers","18:19 — ",[49,2599,1320],{},[37,2601,2602,2607],{},[31,2603,1306,2604,1310],{},[49,2605,2606],{},"4eab3f4",[31,2608,2609],{},"메시지: feat(classify): PARTNER_WHITELIST에 오케어\u002F송한나 추가",[393,2611,2613,2614,1321],{"id":2612},"_1820-malgn-helper-api-cloudflare-workers","18:20 — ",[49,2615,1320],{},[37,2617,2618,2623],{},[31,2619,1306,2620,1310],{},[49,2621,2622],{},"77969bf",[31,2624,2625],{},"메시지: fix(classify): '오케어' → '온케어' 오타 수정",[393,2627,2629,2630,1301],{"id":2628},"_1830-malgn-helper-pms-cloudflare-pages","18:30 — ",[49,2631,760],{},[37,2633,2634,2639],{},[31,2635,1306,2636,1310],{},[49,2637,2638],{},"ab42ce6",[31,2640,2641],{},"메시지: feat: \u002Fprojects\u002F:id\u002Fposts 게시글 목록 페이지 + 진입 링크",[393,2643,2645,2646,1321],{"id":2644},"_1831-malgn-helper-api-cloudflare-workers","18:31 — ",[49,2647,1320],{},[37,2649,2650,2655],{},[31,2651,1306,2652,1310],{},[49,2653,2654],{},"5bffb41",[31,2656,2657],{},"메시지: feat: GET \u002Fpms\u002Fprojects\u002F:id\u002Fposts (검색·필터·페이지네이션 + 작성자 분류) + OpenAPI",[393,2659,2661,2662,1301],{"id":2660},"_1834-malgn-helper-pms-cloudflare-pages","18:34 — ",[49,2663,760],{},[37,2665,2666,2671],{},[31,2667,1306,2668,1310],{},[49,2669,2670],{},"75b3e8e",[31,2672,2673],{},"메시지: fix(BriefingCard): '새 카드 생성' 버튼이 force=true로 호출 (캐시 hit 우회)",[393,2675,2677,2678,1301],{"id":2676},"_1835-malgn-helper-pms-cloudflare-pages","18:35 — ",[49,2679,760],{},[37,2681,2682,2687],{},[31,2683,1306,2684,1310],{},[49,2685,2686],{},"2a4e75b",[31,2688,2689,2690,2692,2693,2695],{},"메시지: fix(routing): pages\u002Fprojects\u002F",[312,2691,2320],{},".vue → ",[312,2694,2320],{},"\u002Findex.vue (게시글 페이지로 이동 안 되던 문제)",[393,2697,2699,2700,1301],{"id":2698},"_1938-malgn-helper-pms-cloudflare-pages","19:38 — ",[49,2701,760],{},[37,2703,2704,2709],{},[31,2705,1306,2706,1310],{},[49,2707,2708],{},"9e123e8",[31,2710,2711],{},"메시지: feat: \u002Fposts\u002F:id 게시물 상세 페이지 + 게시글 목록 행 클릭은 상세로 (평가는 별도)",[393,2713,2715,2716,1301],{"id":2714},"_1943-malgn-helper-pms-cloudflare-pages","19:43 — ",[49,2717,760],{},[37,2719,2720,2725],{},[31,2721,1306,2722,1310],{},[49,2723,2724],{},"465d635",[31,2726,2727],{},"메시지: fix(posts): \u002Fdata\u002F 절대경로 이미지·링크에 ppm.malgn.co.kr 도메인 prefix",[393,2729,2731,2732,1301],{"id":2730},"_1950-malgn-helper-pms-cloudflare-pages","19:50 — ",[49,2733,760],{},[37,2735,2736,2741],{},[31,2737,1306,2738,1310],{},[49,2739,2740],{},"6c66221",[31,2742,2743],{},"메시지: feat(posts): AI 문의 답변 분석을 게시물 페이지 모달로 + 분석 로딩 + Q&A HTML 렌더",[393,2745,2747,2748,1321],{"id":2746},"_1954-malgn-helper-api-cloudflare-workers","19:54 — ",[49,2749,1320],{},[37,2751,2752,2757],{},[31,2753,1306,2754,1310],{},[49,2755,2756],{},"fc5b701",[31,2758,2759],{},"메시지: feat(QaEval): D축 templates 6개로 확장 (1~3개 → 정확히 6개, maxTokens 1500→3000)",[393,2761,2763,2764,1301],{"id":2762},"_1957-malgn-helper-pms-cloudflare-pages","19:57 — ",[49,2765,760],{},[37,2767,2768,2773],{},[31,2769,1306,2770,1310],{},[49,2771,2772],{},"43724ce",[31,2774,2775],{},"메시지: feat(QaEvalCard): '평가' 라벨 → '분석' + 더보기(...) 버튼을 삭제 버튼으로 교체 + 부모에서 DELETE 처리",[393,2777,2779,2780,1321],{"id":2778},"_2001-malgn-helper-api-cloudflare-workers","20:01 — ",[49,2781,1320],{},[37,2783,2784,2789],{},[31,2785,1306,2786,1310],{},[49,2787,2788],{},"2f3151b",[31,2790,2791],{},"메시지: feat(QaEval): D축 templates answer 형식·길이 가이드 강화 (인사+본문+마무리, 변형별 길이 명시)",[393,2793,2795,2796,1321],{"id":2794},"_2007-malgn-helper-api-cloudflare-workers","20:07 — ",[49,2797,1320],{},[37,2799,2800,2805],{},[31,2801,1306,2802,1310],{},[49,2803,2804],{},"6c185f3",[31,2806,2807],{},"메시지: feat(QaEval): templates answer를 HTML 허용 + 원본 이미지 그대로 포함 가이드",[393,2809,2795,2811,1301],{"id":2810},"_2007-malgn-helper-pms-cloudflare-pages",[49,2812,760],{},[37,2814,2815,2820],{},[31,2816,1306,2817,1310],{},[49,2818,2819],{},"48d4fd1",[31,2821,2822],{},"메시지: feat(QaAxisCard): 답변을 HTML 렌더 + fixPmsHtml로 이미지·링크 도메인 처리",[393,2824,2826,2827,1321],{"id":2825},"_2010-malgn-helper-api-cloudflare-workers","20:10 — ",[49,2828,1320],{},[37,2830,2831,2836],{},[31,2832,1306,2833,1310],{},[49,2834,2835],{},"b37e9de",[31,2837,2838],{},"메시지: feat(QaEval): 원본 이미지 src 명시적 입력 + HTML 출력 강제 + 단계별 안내에 이미지 배치 가이드",[393,2840,2842,2843,1301],{"id":2841},"_2025-malgn-helper-pms-cloudflare-pages","20:25 — ",[49,2844,760],{},[37,2846,2847,2852,2858],{},[31,2848,1306,2849,2851],{},[49,2850,2819],{}," 재배포 (신규 커밋: no — 사용자 브라우저의 옛 chunk hash 캐시 무효화용)",[31,2853,2854,2855],{},"배포: ",[49,2856,2857],{},"c9d9460e.malgn-helper-pms.pages.dev",[31,2859,2860],{},"메시지: (재배포) QaAxisCard 답변 HTML 렌더가 브라우저 캐시로 인해 plain text로 보이던 문제 — chunk hash 갱신",[393,2862,2864,2865,1321],{"id":2863},"_2040-malgn-helper-api-cloudflare-workers","20:40 — ",[49,2866,1320],{},[37,2868,2869,2880],{},[31,2870,2871,2872,2875,2876,2879],{},"배포: version ",[49,2873,2874],{},"e4c91fd1-fa0f-4906-9d52-71c0a88d8a2e"," (커밋은 21:10 ",[49,2877,2878],{},"1446679","에 일괄 포함)",[31,2881,2882],{},"메시지: feat(QaEval): followups 필드 제거 (LLM이 매번 빈 배열만 채워 \"후속 조치 0\" 빈 박스만 노출되던 문제) — schema·prompt·매핑·기본값 모두 제거",[393,2884,2886,2887,1301],{"id":2885},"_2042-malgn-helper-pms-cloudflare-pages","20:42 — ",[49,2888,760],{},[37,2890,2891,2896,2901],{},[31,2892,1306,2893,1310],{},[49,2894,2895],{},"88910ba",[31,2897,2854,2898],{},[49,2899,2900],{},"bb78b5be.malgn-helper-pms.pages.dev",[31,2902,2903],{},"메시지: feat(QaEval): followups 섹션 제거 — QaEvalCard·clipboard·types·example 정리",[393,2905,2907,2908,1301],{"id":2906},"_2055-malgn-helper-pms-cloudflare-pages","20:55 — ",[49,2909,760],{},[37,2911,2912,2917,2922],{},[31,2913,1306,2914,1310],{},[49,2915,2916],{},"60239a4",[31,2918,2854,2919],{},[49,2920,2921],{},"d8868fac.malgn-helper-pms.pages.dev",[31,2923,2924,2925,2927],{},"메시지: fix(posts): 분석 모달은 valid 결과 도착 후에만 열기 + Q&A 본문 초기 접기 — 빈 결과(axes=",[312,2926],{},") 응답이 0점 모달로 보이던 문제 fix, 다시 시도 옵션 추가",[393,2929,2931,2932,1321],{"id":2930},"_2110-malgn-helper-api-cloudflare-workers","21:10 — ",[49,2933,1320],{},[37,2935,2936,2941,2956,3036],{},[31,2937,1306,2938,2940],{},[49,2939,2878],{}," (신규 커밋: yes — followups 제거·Vision·표준답변 컨텍스트·문단 분리 prompt·admin\u002Fevals 필터를 한 커밋에 통합)",[31,2942,2943,2944,363,2947,363,2950,363,2953,132],{},"배포: 통산 4회 (",[49,2945,2946],{},"e4c91fd1",[49,2948,2949],{},"3893f30d",[49,2951,2952],{},"d9cb7e26",[49,2954,2955],{},"0b4c6b5a",[31,2957,2958,2959],{},"메시지: feat(QaEval): Vision 이미지 분석 + 표준답변 컨텍스트 + 문단 분리 prompt 강화\n",[37,2960,2961,2972,3001,3026],{},[31,2962,2963,2964,2967,2968,2971],{},"llm.ts: ",[49,2965,2966],{},"callOpenAiJson","에 ",[49,2969,2970],{},"images?: string[]"," 추가 (image_url multimodal). 이미지 있으면 자동 gpt-4o 업그레이드",[31,2973,2974,2975,2977,2978,2981,2982,2985,2986,2988,2989,2992,2993,2996,2997,3000],{},"eval\u002Fgenerate:\n· 원본 응답의 ",[49,2976,290],{},"를 절대URL(",[49,2979,2980],{},"ppm.malgn.co.kr",")로 변환 후 Vision에 첨부 (최대 8장, ",[49,2983,2984],{},"detail=low",")\n· 같은 프로젝트의 ",[49,2987,172],{}," 최근 5건을 톤·구조 참고 컨텍스트로 전달 (복붙 금지)\n· ",[49,2990,2991],{},"maxTokens"," 6000 → 8000, ",[49,2994,2995],{},"temperature"," 0.2 → 0.3, ",[49,2998,2999],{},"timeoutMs"," 25s → 60s",[31,3002,3003,3006,3007,3014,3015,3017,3018,315,3020,3022,3023,3025],{},[49,3004,3005],{},"QA_SYSTEM_PROMPT",":\n· 이미지 처리 규칙 — 이미지마다 ",[312,3008,3009,3010,3013],{},"안내 1~2줄 + ",[49,3011,3012],{},"\u003Cimg>"," + 짧은 캡션(실제 메뉴\u002F버튼명 그대로)"," 묶음 강제\n· 문단 분리 강제 — 한 ",[49,3016,309],{},"에 몰아넣지 말고 ",[312,3019,314],{},[49,3021,309],{},"로. 변형별 최소 ",[49,3024,309],{}," 수 명시",[31,3027,3028,3029,3032,3033,3035],{},"admin\u002Fevals: 기본 필터로 ",[49,3030,3031],{},"generator='hybrid' AND overall_score IS NOT NULL"," 강제 (db_only 폴백·빈 결과 행 숨김). ",[49,3034,370],{},"로 전체 노출 가능",[31,3037,3038,3039,3042,3043,3046,3047,3050],{},"검증 (post 149512 \u002F id 24): 짧은 답변 ",[49,3040,3041],{},"\u003Cp>=4",", 긴 답변 ",[49,3044,3045],{},"\u003Cp>=6",", 단계별 안내 ",[49,3048,3049],{},"\u003Cp>=6 + \u003Col>=1 + \u003Cli>=3"," — 한 덩어리 텍스트 사라지고 의미 단위로 분리",[393,3052,3054,3055,1301],{"id":3053},"_2125-malgn-helper-pms-cloudflare-pages","21:25 — ",[49,3056,760],{},[37,3058,3059,3064,3069],{},[31,3060,1306,3061,1310],{},[49,3062,3063],{},"8c794f7",[31,3065,2854,3066],{},[49,3067,3068],{},"4429f5b1.malgn-helper-pms.pages.dev",[31,3070,3071,3072,3075,3076,3078,3079,3081],{},"메시지: feat(admin\u002Fevals): 행 클릭 시 평가 카드 모달 즉시 열기 — ",[49,3073,3074],{},"$router.push"," 대신 ",[49,3077,362],{}," 호출 → ",[49,3080,366],{}," 모달. 로딩 스피너 \u002F 빈 결과 에러 모달 \u002F 삭제·표준답변 저장 핸들러 추가",[3083,3084,3085],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1134,"searchDepth":1152,"depth":1152,"links":3087},[3088,3095,3096,3104],{"id":16,"depth":1146,"text":17,"children":3089},[3090,3091,3092,3093,3094],{"id":395,"depth":1152,"text":396},{"id":497,"depth":1152,"text":498},{"id":574,"depth":1152,"text":575},{"id":619,"depth":1152,"text":620},{"id":657,"depth":1152,"text":658},{"id":717,"depth":1146,"text":717},{"id":729,"depth":1146,"text":730,"children":3097},[3098,3099,3100,3102,3103],{"id":733,"depth":1152,"text":734},{"id":869,"depth":1152,"text":870},{"id":944,"depth":1152,"text":3101},"2. malgn-helper-pms에 \u002Fwbs 진행 현황 페이지 신규",{"id":1040,"depth":1152,"text":1041},{"id":1230,"depth":1152,"text":1231},{"id":1294,"depth":1146,"text":1294,"children":3105},[3106,3108,3110,3112,3114,3116,3118,3120,3122,3124,3126,3128,3130,3132,3134,3136,3138,3140,3142,3144,3146,3148,3150,3152,3154,3156,3158,3160,3162,3164,3166,3168,3170,3172,3174,3176,3178,3180,3182,3184,3186,3188,3190,3192,3194,3196,3198,3200,3202,3204,3206,3208,3210,3212,3214,3216,3218,3220,3222,3224,3226,3228,3230,3232,3234,3236,3238,3240,3242,3244,3246,3248,3250,3252,3254,3256,3258,3260,3262,3264,3266,3268,3270,3272,3274,3276,3278,3280,3282,3284,3286,3288,3290,3292,3294,3296,3298,3300,3302,3304,3306,3308],{"id":1297,"depth":1152,"text":3107},"08:34 — malgn-helper-pms → Cloudflare Pages",{"id":1316,"depth":1152,"text":3109},"08:40 — malgn-helper-api → Cloudflare Workers",{"id":1334,"depth":1152,"text":3111},"08:46 — malgn-helper-api → Cloudflare Workers",{"id":1350,"depth":1152,"text":3113},"08:46 — malgn-helper-pms → Cloudflare Pages",{"id":1365,"depth":1152,"text":3115},"08:51 — malgn-helper-pms → Cloudflare Pages",{"id":1381,"depth":1152,"text":3117},"08:58 — malgn-helper-pms → Cloudflare Pages",{"id":1397,"depth":1152,"text":3119},"09:05 — malgn-helper-pms → Cloudflare Pages",{"id":1413,"depth":1152,"text":3121},"09:13 — malgn-helper-pms → Cloudflare Pages",{"id":1429,"depth":1152,"text":3123},"09:18 — malgn-helper-pms → Cloudflare Pages",{"id":1445,"depth":1152,"text":3125},"09:21 — malgn-helper-pms → Cloudflare Pages",{"id":1461,"depth":1152,"text":3127},"09:24 — malgn-helper-pms → Cloudflare Pages",{"id":1477,"depth":1152,"text":3129},"09:29 — malgn-helper-pms → Cloudflare Pages",{"id":1497,"depth":1152,"text":3131},"09:46 — malgn-helper-api → Cloudflare Workers",{"id":1513,"depth":1152,"text":3133},"09:50 — malgn-helper-pms → Cloudflare Pages",{"id":1529,"depth":1152,"text":3135},"10:09 — malgn-helper-pms → Cloudflare Pages",{"id":1545,"depth":1152,"text":3137},"10:19 — malgn-helper-pms → Cloudflare Pages",{"id":1561,"depth":1152,"text":3139},"10:37 — malgn-helper-api → Cloudflare Workers",{"id":1577,"depth":1152,"text":3141},"10:45 — malgn-helper-api → Cloudflare Workers",{"id":1593,"depth":1152,"text":3143},"10:52 — malgn-helper-pms → Cloudflare Pages",{"id":1609,"depth":1152,"text":3145},"10:53 — malgn-helper-api → Cloudflare Workers",{"id":1625,"depth":1152,"text":3147},"10:59 — malgn-helper-pms → Cloudflare Pages",{"id":1641,"depth":1152,"text":3149},"11:00 — malgn-helper-api → Cloudflare Workers",{"id":1657,"depth":1152,"text":3151},"11:04 — malgn-helper-api → Cloudflare Workers",{"id":1673,"depth":1152,"text":3153},"11:15 — malgn-helper-api → Cloudflare Workers",{"id":1689,"depth":1152,"text":3155},"11:31 — malgn-helper-api → Cloudflare Workers",{"id":1706,"depth":1152,"text":3157},"11:37 — malgn-helper-pms → Cloudflare Pages",{"id":1722,"depth":1152,"text":3159},"11:38 — malgn-helper-api → Cloudflare Workers",{"id":1738,"depth":1152,"text":3161},"11:44 — malgn-helper-pms → Cloudflare Pages",{"id":1754,"depth":1152,"text":3163},"11:44 — malgn-helper-api → Cloudflare Workers",{"id":1769,"depth":1152,"text":3165},"11:55 — malgn-helper-api → Cloudflare Workers",{"id":1785,"depth":1152,"text":3167},"12:03 — malgn-helper-api → Cloudflare Workers",{"id":1801,"depth":1152,"text":3169},"12:14 — malgn-helper-pms → Cloudflare Pages",{"id":1817,"depth":1152,"text":3171},"12:14 — malgn-helper-api → Cloudflare Workers",{"id":1832,"depth":1152,"text":3173},"12:18 — malgn-helper-api → Cloudflare Workers",{"id":1848,"depth":1152,"text":3175},"12:31 — malgn-helper-pms → Cloudflare Pages",{"id":1864,"depth":1152,"text":3177},"12:31 — malgn-helper-api → Cloudflare Workers",{"id":1879,"depth":1152,"text":3179},"12:41 — malgn-helper-pms → Cloudflare Pages",{"id":1895,"depth":1152,"text":3181},"12:41 — malgn-helper-api → Cloudflare Workers",{"id":1910,"depth":1152,"text":3183},"12:46 — malgn-helper-pms → Cloudflare Pages",{"id":1926,"depth":1152,"text":3185},"12:46 — malgn-helper-api → Cloudflare Workers",{"id":1941,"depth":1152,"text":3187},"12:49 — malgn-helper-pms → Cloudflare Pages",{"id":1957,"depth":1152,"text":3189},"12:54 — malgn-helper-api → Cloudflare Workers",{"id":1973,"depth":1152,"text":3191},"13:01 — malgn-helper-pms → Cloudflare Pages",{"id":1989,"depth":1152,"text":3193},"13:01 — malgn-helper-api → Cloudflare Workers",{"id":2004,"depth":1152,"text":3195},"13:11 — malgn-helper-pms → Cloudflare Pages",{"id":2020,"depth":1152,"text":3197},"13:21 — malgn-helper-pms → Cloudflare Pages",{"id":2036,"depth":1152,"text":3199},"13:25 — malgn-helper-api → Cloudflare Workers",{"id":2052,"depth":1152,"text":3201},"13:35 — malgn-helper-pms → Cloudflare Pages",{"id":2068,"depth":1152,"text":3203},"13:35 — malgn-helper-api → Cloudflare Workers",{"id":2083,"depth":1152,"text":3205},"13:41 — malgn-helper-pms → Cloudflare Pages",{"id":2099,"depth":1152,"text":3207},"13:41 — malgn-helper-api → Cloudflare Workers",{"id":2114,"depth":1152,"text":3209},"13:45 — malgn-helper-pms → Cloudflare Pages",{"id":2130,"depth":1152,"text":3211},"14:09 — malgn-helper-pms → Cloudflare Pages",{"id":2146,"depth":1152,"text":3213},"14:09 — malgn-helper-api → Cloudflare Workers",{"id":2161,"depth":1152,"text":3215},"14:17 — malgn-helper-pms → Cloudflare Pages",{"id":2177,"depth":1152,"text":3217},"14:17 — malgn-helper-api → Cloudflare Workers",{"id":2192,"depth":1152,"text":3219},"14:22 — malgn-helper-pms → Cloudflare Pages",{"id":2208,"depth":1152,"text":3221},"14:22 — malgn-helper-api → Cloudflare Workers",{"id":2223,"depth":1152,"text":3223},"14:25 — malgn-helper-api → Cloudflare Workers",{"id":2239,"depth":1152,"text":3225},"14:37 — malgn-helper-pms → Cloudflare Pages",{"id":2255,"depth":1152,"text":3227},"14:37 — malgn-helper-api → Cloudflare Workers",{"id":2270,"depth":1152,"text":3229},"14:45 — malgn-helper-pms → Cloudflare Pages",{"id":2285,"depth":1152,"text":3231},"14:45 — malgn-helper-api → Cloudflare Workers",{"id":2304,"depth":1152,"text":3233},"14:47 — malgn-helper-pms → Cloudflare Pages",{"id":2324,"depth":1152,"text":3235},"15:35 — malgn-helper-pms → Cloudflare Pages",{"id":2340,"depth":1152,"text":3237},"15:35 — malgn-helper-api → Cloudflare Workers",{"id":2355,"depth":1152,"text":3239},"15:50 — malgn-helper-api → Cloudflare Workers",{"id":2371,"depth":1152,"text":3241},"16:07 — malgn-helper-pms → Cloudflare Pages",{"id":2387,"depth":1152,"text":3243},"16:07 — malgn-helper-api → Cloudflare Workers",{"id":2402,"depth":1152,"text":3245},"17:00 — malgn-helper-pms → Cloudflare Pages",{"id":2421,"depth":1152,"text":3247},"17:00 — malgn-helper-api → Cloudflare Workers",{"id":2436,"depth":1152,"text":3249},"17:05 — malgn-helper-pms → Cloudflare Pages",{"id":2452,"depth":1152,"text":3251},"17:20 — malgn-helper-api → Cloudflare Workers",{"id":2468,"depth":1152,"text":3253},"17:48 — malgn-helper-api → Cloudflare Workers",{"id":2484,"depth":1152,"text":3255},"17:52 — malgn-helper-api → Cloudflare Workers",{"id":2500,"depth":1152,"text":3257},"17:57 — malgn-helper-api → Cloudflare Workers",{"id":2516,"depth":1152,"text":3259},"17:59 — malgn-helper-api → Cloudflare Workers",{"id":2532,"depth":1152,"text":3261},"18:05 — malgn-helper-pms → Cloudflare Pages",{"id":2548,"depth":1152,"text":3263},"18:10 — malgn-helper-pms → Cloudflare Pages",{"id":2564,"depth":1152,"text":3265},"18:12 — malgn-helper-pms → Cloudflare Pages",{"id":2580,"depth":1152,"text":3267},"18:16 — malgn-helper-api → Cloudflare Workers",{"id":2596,"depth":1152,"text":3269},"18:19 — malgn-helper-api → Cloudflare Workers",{"id":2612,"depth":1152,"text":3271},"18:20 — malgn-helper-api → Cloudflare Workers",{"id":2628,"depth":1152,"text":3273},"18:30 — malgn-helper-pms → Cloudflare Pages",{"id":2644,"depth":1152,"text":3275},"18:31 — malgn-helper-api → Cloudflare Workers",{"id":2660,"depth":1152,"text":3277},"18:34 — malgn-helper-pms → Cloudflare Pages",{"id":2676,"depth":1152,"text":3279},"18:35 — malgn-helper-pms → Cloudflare Pages",{"id":2698,"depth":1152,"text":3281},"19:38 — malgn-helper-pms → Cloudflare Pages",{"id":2714,"depth":1152,"text":3283},"19:43 — malgn-helper-pms → Cloudflare Pages",{"id":2730,"depth":1152,"text":3285},"19:50 — malgn-helper-pms → Cloudflare Pages",{"id":2746,"depth":1152,"text":3287},"19:54 — malgn-helper-api → Cloudflare Workers",{"id":2762,"depth":1152,"text":3289},"19:57 — malgn-helper-pms → Cloudflare Pages",{"id":2778,"depth":1152,"text":3291},"20:01 — malgn-helper-api → Cloudflare Workers",{"id":2794,"depth":1152,"text":3293},"20:07 — malgn-helper-api → Cloudflare Workers",{"id":2810,"depth":1152,"text":3295},"20:07 — malgn-helper-pms → Cloudflare Pages",{"id":2825,"depth":1152,"text":3297},"20:10 — malgn-helper-api → Cloudflare Workers",{"id":2841,"depth":1152,"text":3299},"20:25 — malgn-helper-pms → Cloudflare Pages",{"id":2863,"depth":1152,"text":3301},"20:40 — malgn-helper-api → Cloudflare Workers",{"id":2885,"depth":1152,"text":3303},"20:42 — malgn-helper-pms → Cloudflare Pages",{"id":2906,"depth":1152,"text":3305},"20:55 — malgn-helper-pms → Cloudflare Pages",{"id":2930,"depth":1152,"text":3307},"21:10 — malgn-helper-api → Cloudflare Workers",{"id":3053,"depth":1152,"text":3309},"21:25 — malgn-helper-pms → Cloudflare Pages","md",{},true,"\u002Fhistory\u002Fhistory.20260529",{"title":5,"description":1134},"history\u002Fhistory.20260529","XbhKTVJvYwuNzfcH93QGSc_6pzNQtAT9Y7oYOTsidzw",1780986551105]