<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://freemwiki.com/index.php?action=history&amp;feed=atom&amp;title=Openai%2F695d0a1a-1d10-8010-bbdc-1d5591edf3f3</id>
	<title>Openai/695d0a1a-1d10-8010-bbdc-1d5591edf3f3 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://freemwiki.com/index.php?action=history&amp;feed=atom&amp;title=Openai%2F695d0a1a-1d10-8010-bbdc-1d5591edf3f3"/>
	<link rel="alternate" type="text/html" href="https://freemwiki.com/index.php?title=Openai/695d0a1a-1d10-8010-bbdc-1d5591edf3f3&amp;action=history"/>
	<updated>2026-04-25T16:07:18Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://freemwiki.com/index.php?title=Openai/695d0a1a-1d10-8010-bbdc-1d5591edf3f3&amp;diff=595317&amp;oldid=prev</id>
		<title>Lukegao: by freem.ai...</title>
		<link rel="alternate" type="text/html" href="https://freemwiki.com/index.php?title=Openai/695d0a1a-1d10-8010-bbdc-1d5591edf3f3&amp;diff=595317&amp;oldid=prev"/>
		<updated>2026-01-07T05:30:52Z</updated>

		<summary type="html">&lt;p&gt;by freem.ai...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
{{DISPLAYTITLE:CRM 고객 피드백 대시보드}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;This conversation was exported from ChatGPT&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{cite web|title=CRM 고객 피드백 대시보드|url=https://chatgpt.com/share/695d0a1a-1d10-8010-bbdc-1d5591edf3f3|publisher=ChatGPT|access-date=2026-01-07}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== gpt-5-2-thinking ==&lt;br /&gt;
=== User: 역할 : 너는 마케팅 CRM 고객 분석 20년차 전문가야. ===&lt;br /&gt;
역할 : 너는 마케팅 CRM 고객 분석 20년차 전문가야. &lt;br /&gt;
작업/목표 : 고객 피드백 자료를 올려주면, 오프라인, 온라인(딜리버리), 고객 피드백을 긍정/부정 5점 만점 평가점수로 매장별 평가를 해주고, 해야할 일들을 우선순위로 정리해줘. &lt;br /&gt;
맥락 : 현재는 마케팅 직원이 하나하나 고객 댓글을 읽고 매장별로 개선점을 엑셀로 정리하고 있어서, 시간도 오래걸리고, 어느 매장의 어떤 것을 우선적으로 해결해야하는지 정리가 잘 안돼. &lt;br /&gt;
HTML 소스로 만들어줘.&lt;br /&gt;
&lt;br /&gt;
=== Assistant: 아래 HTML은 업로드하신 주간 고객피드백PDF 기준으로, 매장별로 오프라인Google / 온라인Grab·Foodpanda 리뷰를 5점 만점 평균점수로 집계하고, 이슈 유형푸드세이프티/대기/누락/콜드푸드/패키징/서… ===&lt;br /&gt;
아래 HTML은 업로드하신 주간 고객피드백(PDF) 기준으로, 매장별로 오프라인(Google) / 온라인(Grab·Foodpanda) 리뷰를 5점 만점 평균점수로 집계하고, &amp;#039;&amp;#039;&amp;#039;이슈 유형(푸드세이프티/대기/누락/콜드푸드/패키징/서비스태도/위생 등)&amp;#039;&amp;#039;&amp;#039;을 자동 태깅해서 우선순위 액션을 뽑아주는 “1페이지 대시보드” 템플릿입니다.&lt;br /&gt;
* 이번 주 데이터에서 푸드 세이프티(언더쿡·식중독·입원 언급) 같은 “Critical” 케이스가 실제로 존재해, 해당 매장은 점수와 무관하게 최상위 우선순위로 고정되도록 설계했습니다. weekly_reviews_20251229_to_2026…&lt;br /&gt;
* 온라인(딜리버리) 영역에서는 미봉인/누락/지연/콜드푸드가 반복적으로 보이며(예: 버거 누락+미봉인), 온라인 운영 프로세스 점검이 우선 과제로 잡히도록 되어 있습니다. weekly_reviews_20251229_to_2026…&lt;br /&gt;
* 오프라인에서는 대기시간(예: 1시간, 35분, 40분) 및 응대 태도/위생(쓰레기 냄새) 유형이 확인됩니다. weekly_reviews_20251229_to_2026…  weekly_reviews_20251229_to_2026…&lt;br /&gt;
* 일부 매장/플랫폼에서 스트로우/커틀러리 등 기본 구성품 누락이 반복 언급됩니다. weekly_reviews_20251229_to_2026…  weekly_reviews_20251229_to_2026…&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;ko&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;Weekly Reviews Dashboard (Offline/Online) – Outlet Scoring &amp;amp; Action Priority&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;style&amp;gt;&lt;br /&gt;
    :root{&lt;br /&gt;
      --bg:#0b0f14; --card:#111826; --muted:#8aa0b5; --text:#e8f0f7;&lt;br /&gt;
      --line:#1e2a3a; --chip:#0e2234; --warn:#ffcc66; --bad:#ff6b6b; --good:#66ffb3;&lt;br /&gt;
      --accent:#7dd3fc;&lt;br /&gt;
    }&lt;br /&gt;
    *{box-sizing:border-box}&lt;br /&gt;
    body{margin:0;background:var(--bg);color:var(--text);font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,&amp;quot;Apple SD Gothic Neo&amp;quot;,&amp;quot;Noto Sans KR&amp;quot;,&amp;quot;Malgun Gothic&amp;quot;,sans-serif;}&lt;br /&gt;
    .wrap{max-width:1180px;margin:0 auto;padding:20px 16px 40px;}&lt;br /&gt;
    h1{font-size:20px;margin:0 0 8px;}&lt;br /&gt;
    .sub{color:var(--muted);font-size:13px;line-height:1.45;margin-bottom:16px;}&lt;br /&gt;
    .row{display:grid;grid-template-columns:1.2fr 0.8fr;gap:12px;align-items:start;}&lt;br /&gt;
    @media (max-width: 980px){ .row{grid-template-columns:1fr} }&lt;br /&gt;
    .card{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:14px;}&lt;br /&gt;
    .controls{display:flex;flex-wrap:wrap;gap:10px;align-items:center}&lt;br /&gt;
    .controls label{font-size:12px;color:var(--muted)}&lt;br /&gt;
    input[type=&amp;quot;search&amp;quot;], select{&lt;br /&gt;
      background:#0c1420;border:1px solid var(--line);color:var(--text);&lt;br /&gt;
      padding:10px 10px;border-radius:12px;outline:none;min-width:220px;&lt;br /&gt;
    }&lt;br /&gt;
    .toggle{&lt;br /&gt;
      display:flex;gap:8px;align-items:center;padding:8px 10px;border:1px solid var(--line);&lt;br /&gt;
      border-radius:999px;background:#0c1420;&lt;br /&gt;
    }&lt;br /&gt;
    .toggle input{transform:scale(1.05)}&lt;br /&gt;
    .kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}&lt;br /&gt;
    @media (max-width: 980px){ .kpis{grid-template-columns:repeat(2,1fr)} }&lt;br /&gt;
    .kpi{background:#0c1420;border:1px solid var(--line);border-radius:14px;padding:12px;}&lt;br /&gt;
    .kpi .t{color:var(--muted);font-size:12px}&lt;br /&gt;
    .kpi .v{font-size:18px;margin-top:6px}&lt;br /&gt;
    .kpi .v small{font-size:12px;color:var(--muted)}&lt;br /&gt;
    table{width:100%;border-collapse:separate;border-spacing:0}&lt;br /&gt;
    thead th{&lt;br /&gt;
      font-size:12px;color:var(--muted);text-align:left;padding:10px;border-bottom:1px solid var(--line);&lt;br /&gt;
      position:sticky;top:0;background:linear-gradient(#111826,#111826);&lt;br /&gt;
      z-index:2;&lt;br /&gt;
    }&lt;br /&gt;
    tbody td{padding:10px;border-bottom:1px solid var(--line);vertical-align:top;font-size:13px}&lt;br /&gt;
    tbody tr:hover{background:#0c1420}&lt;br /&gt;
    .pill{&lt;br /&gt;
      display:inline-flex;gap:6px;align-items:center;padding:6px 10px;border-radius:999px;&lt;br /&gt;
      background:var(--chip);border:1px solid #15324b;color:var(--text);font-size:12px;white-space:nowrap;&lt;br /&gt;
    }&lt;br /&gt;
    .pill.critical{border-color:#5b1b1b;background:#1a0f12}&lt;br /&gt;
    .pill.critical b{color:var(--bad)}&lt;br /&gt;
    .score{font-variant-numeric:tabular-nums}&lt;br /&gt;
    .score.good{color:var(--good)}&lt;br /&gt;
    .score.bad{color:var(--bad)}&lt;br /&gt;
    .score.mid{color:var(--warn)}&lt;br /&gt;
    details{border:1px solid var(--line);border-radius:14px;background:#0c1420;margin-top:10px}&lt;br /&gt;
    details summary{cursor:pointer;padding:10px 12px;color:var(--accent);font-size:13px}&lt;br /&gt;
    .detail{padding:0 12px 12px;color:var(--text)}&lt;br /&gt;
    .chips{display:flex;flex-wrap:wrap;gap:8px;margin:8px 0 10px}&lt;br /&gt;
    .chips .pill{background:#0a1a2a}&lt;br /&gt;
    .actions{margin:0;padding-left:18px;color:#d8e6f3}&lt;br /&gt;
    .actions li{margin:6px 0}&lt;br /&gt;
    .ex{border:1px solid var(--line);border-radius:12px;padding:10px;margin-top:10px;background:#091321}&lt;br /&gt;
    .ex .meta{display:flex;flex-wrap:wrap;gap:8px;color:var(--muted);font-size:12px;margin-bottom:6px}&lt;br /&gt;
    .ex .msg{font-size:13px;line-height:1.45}&lt;br /&gt;
    .muted{color:var(--muted)}&lt;br /&gt;
    .right .card{position:sticky;top:12px}&lt;br /&gt;
    .foot{margin-top:12px;color:var(--muted);font-size:12px;line-height:1.5}&lt;br /&gt;
    .btn{&lt;br /&gt;
      background:#0c1420;border:1px solid var(--line);color:var(--text);border-radius:12px;&lt;br /&gt;
      padding:9px 10px;cursor:pointer;font-size:12px;&lt;br /&gt;
    }&lt;br /&gt;
    .btn:hover{border-color:#27435f}&lt;br /&gt;
    .hr{height:1px;background:var(--line);margin:12px 0}&lt;br /&gt;
    code.inline{background:#0c1420;border:1px solid var(--line);padding:2px 6px;border-radius:8px;color:#d6f0ff}&lt;br /&gt;
  &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wrap&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;h1&amp;gt;Weekly Reviews – Outlet Scoring &amp;amp; Action Priority&amp;lt;/h1&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;sub&amp;quot;&amp;gt;&lt;br /&gt;
    오프라인(Google) / 온라인(Grab·Foodpanda) 리뷰를 5점 만점 평균으로 집계하고, 메시지 키워드로 이슈를 자동 분류해&lt;br /&gt;
    “어느 매장의 무엇부터” 해결해야 하는지 우선순위로 보여줍니다.&amp;lt;br/&amp;gt;&lt;br /&gt;
    &amp;lt;span class=&amp;quot;muted&amp;quot;&amp;gt;*Critical(푸드 세이프티 등) 이슈가 있으면 점수와 무관하게 최상단 고정&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;controls&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;label&amp;gt;Search&amp;lt;/label&amp;gt;&lt;br /&gt;
          &amp;lt;input id=&amp;quot;q&amp;quot; type=&amp;quot;search&amp;quot; placeholder=&amp;quot;예: Suntec / Orchard / wait / missing / cold&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;label&amp;gt;Sort&amp;lt;/label&amp;gt;&lt;br /&gt;
          &amp;lt;select id=&amp;quot;sort&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;priority&amp;quot;&amp;gt;Priority (Critical → Highest)&amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;offline&amp;quot;&amp;gt;Offline score (low → high)&amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;online&amp;quot;&amp;gt;Online score (low → high)&amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;overall&amp;quot;&amp;gt;Overall score (low → high)&amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;volume&amp;quot;&amp;gt;Review volume (high → low)&amp;lt;/option&amp;gt;&lt;br /&gt;
          &amp;lt;/select&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;div class=&amp;quot;toggle&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input id=&amp;quot;onlyCritical&amp;quot; type=&amp;quot;checkbox&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;onlyCritical&amp;quot;&amp;gt;Critical only&amp;lt;/label&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;toggle&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input id=&amp;quot;negOnly&amp;quot; type=&amp;quot;checkbox&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;negOnly&amp;quot;&amp;gt;Show “needs-fix” first&amp;lt;/label&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
          &amp;lt;button class=&amp;quot;btn&amp;quot; id=&amp;quot;reset&amp;quot;&amp;gt;Reset&amp;lt;/button&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;hr&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;kpis&amp;quot; id=&amp;quot;kpis&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;hr&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div style=&amp;quot;overflow:auto; max-height: 560px; border-radius:14px;&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;table&amp;gt;&lt;br /&gt;
            &amp;lt;thead&amp;gt;&lt;br /&gt;
              &amp;lt;tr&amp;gt;&lt;br /&gt;
                &amp;lt;th style=&amp;quot;min-width:190px;&amp;quot;&amp;gt;Outlet&amp;lt;/th&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;Flags&amp;lt;/th&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;Offline (Google)&amp;lt;/th&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;Online (Delivery)&amp;lt;/th&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;Overall&amp;lt;/th&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;Top Issues&amp;lt;/th&amp;gt;&lt;br /&gt;
                &amp;lt;th style=&amp;quot;min-width:120px;&amp;quot;&amp;gt;Priority&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;/tr&amp;gt;&lt;br /&gt;
            &amp;lt;/thead&amp;gt;&lt;br /&gt;
            &amp;lt;tbody id=&amp;quot;rows&amp;quot;&amp;gt;&amp;lt;/tbody&amp;gt;&lt;br /&gt;
          &amp;lt;/table&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;foot&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;b&amp;gt;Scoring logic&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
* Offline/Online Score: 해당 채널 평균 별점(1~5).&amp;lt;br/&amp;gt;&lt;br /&gt;
* Priority: 이슈 유형별 가중치 × (불만강도=6-별점) × 빈도 기반 지표.&amp;lt;br/&amp;gt;&lt;br /&gt;
* Critical: “언더쿡/식중독/입원/살모넬라 등” 키워드 감지 시 최우선 처리.&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div style=&amp;quot;display:flex;justify-content:space-between;gap:10px;align-items:flex-start;&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;muted&amp;quot; style=&amp;quot;font-size:12px;&amp;quot;&amp;gt;This week playbook&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div style=&amp;quot;font-size:16px;margin-top:4px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Recommended workflow&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;hr&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;ol class=&amp;quot;actions&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Critical first:&amp;lt;/b&amp;gt; Food safety/contamination/undercook은 24시간 내 CAPA(원인·조치·재발방지) 완료.&amp;lt;/li&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Online ops:&amp;lt;/b&amp;gt; Seal/packing checklist + item-scan + “missing item” 재발 매장 집중 점검.&amp;lt;/li&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Speed &amp;amp; comms:&amp;lt;/b&amp;gt; 피크 타임 WIP 제한 + 예상 대기시간 고지 + 픽업존 동선 정리.&amp;lt;/li&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Service basics:&amp;lt;/b&amp;gt; 응대 톤/클레임 처리 스크립트 + 매니저 에스컬레이션 룰.&amp;lt;/li&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Close loop:&amp;lt;/b&amp;gt; “NOT REPLIED” 고위험 건은 우선 응답 + 보상/재발방지 안내 템플릿 적용.&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;hr&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;muted&amp;quot; style=&amp;quot;font-size:12px;&amp;quot;&amp;gt;&lt;br /&gt;
          필요 시, 다음 단계로 “Owner/ETA/Status” 칼럼까지 붙여서&lt;br /&gt;
          &amp;lt;code class=&amp;quot;inline&amp;quot;&amp;gt;Action Tracker&amp;lt;/code&amp;gt; 형태로 확장 가능합니다.&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Data source: weekly_reviews_20251229_to_20260104.pdf&lt;br /&gt;
 * Offline = Google, Online = Grab/Foodpanda&lt;br /&gt;
 * Note: priority_score is a heuristic indicator; Critical flag overrides sorting.&lt;br /&gt;
 */&lt;br /&gt;
const DATA = ${json_data};&lt;br /&gt;
&lt;br /&gt;
const ISSUE_TO_ACTIONS = {&lt;br /&gt;
  &amp;quot;Food safety / undercooked&amp;quot;: [&lt;br /&gt;
    &amp;quot;즉시: 해당 SKU(치킨/패티) 조리온도·타이머·홀딩타임 전수 점검 (매니저 서명).&amp;quot;,&lt;br /&gt;
    &amp;quot;원인: 피크타임 생산량/스태핑/그릴 로딩/두께 편차/온도계 교정 여부 확인.&amp;quot;,&lt;br /&gt;
    &amp;quot;재발방지: QA 체크(첫 30분·피크 중 2회) + 교육 리마인드 + 감사(spot check) 2주 운영.&amp;quot;&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;Long wait / queue&amp;quot;: [&lt;br /&gt;
    &amp;quot;피크타임 WIP 제한(버거/프라이 동시 처리 기준) + 병목 스테이션 재배치.&amp;quot;,&lt;br /&gt;
    &amp;quot;예상 대기시간 안내(카운터/픽업존) + 픽업 호출 프로세스 정리(번호/이름).&amp;quot;,&lt;br /&gt;
    &amp;quot;인력: 피크 2시간 구간(주말/행사) 스태핑 보강 + 러너(픽업존) 지정.&amp;quot;&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;Missing item / condiments&amp;quot;: [&lt;br /&gt;
    &amp;quot;패킹 체크리스트(2-step: packer + checker) 도입/강제.&amp;quot;,&lt;br /&gt;
    &amp;quot;소스/스트로우/커틀러리 등 ‘기본 구성품’은 번들로 묶어 자동 투입.&amp;quot;,&lt;br /&gt;
    &amp;quot;재발 매장은 POS 아이템 스캔→백 확인(visual) 루틴 교육.&amp;quot;&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;Cold food&amp;quot;: [&lt;br /&gt;
    &amp;quot;핫/콜드 분리 패킹(음료 위에 프라이/치킨 금지) + 단열/환기 기준 점검.&amp;quot;,&lt;br /&gt;
    &amp;quot;라이더 픽업 대기 시 보관 위치(워머/선반) 표준화.&amp;quot;,&lt;br /&gt;
    &amp;quot;장시간 지연 주문은 리메이크 룰(임계시간) 적용.&amp;quot;&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;Packaging leak / spill&amp;quot;: [&lt;br /&gt;
    &amp;quot;컵/소스/쉐이크 씰링 자재 점검 + 봉투 적재 방식 교육.&amp;quot;,&lt;br /&gt;
    &amp;quot;액체류는 별도 캐리어/칸막이 고정, 스태커블 구조로 변경.&amp;quot;,&lt;br /&gt;
    &amp;quot;‘스필’ 빈발 시간대/메뉴 추적해 포장 스펙 수정.&amp;quot;&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;Service attitude / rude&amp;quot;: [&lt;br /&gt;
    &amp;quot;클레임 응대 스크립트(3-step: 사과→확인→해결) 교육 + 매니저 에스컬레이션 룰.&amp;quot;,&lt;br /&gt;
    &amp;quot;피크타임 스트레스 구간에 ‘프론트 리더’ 배치해 톤 관리.&amp;quot;,&lt;br /&gt;
    &amp;quot;직원 칭찬 건은 주간 Kudos로 공유해 긍정행동 강화.&amp;quot;&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;Cleanliness / smell / pests&amp;quot;: [&lt;br /&gt;
    &amp;quot;쓰레기/트레이/픽업존 청소 주기 재정의(피크 30분 단위).&amp;quot;,&lt;br /&gt;
    &amp;quot;백오브하우스 폐기물 동선·보관·배출 시간 점검 (냄새 원인 차단).&amp;quot;,&lt;br /&gt;
    &amp;quot;해충(조류/벌레) 유입 포인트(출입문/외부 좌석) 차단 및 시설 점검.&amp;quot;&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;App / order status&amp;quot;: [&lt;br /&gt;
    &amp;quot;‘준비완료’/‘픽업 가능’ 상태 업데이트 타이밍 표준화.&amp;quot;,&lt;br /&gt;
    &amp;quot;라이더/고객 대기 발생 시: 상시 담당자 지정 + 커뮤니케이션 문구 통일.&amp;quot;,&lt;br /&gt;
    &amp;quot;취소/환불 이슈는 플랫폼별 SOP(증빙/응답 템플릿) 적용.&amp;quot;&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;Menu quality / taste&amp;quot;: [&lt;br /&gt;
    &amp;quot;특정 재료(피클/소스/산미) 불만은 레시피 범위 내 조정(옵션 안내 포함).&amp;quot;,&lt;br /&gt;
    &amp;quot;품질 편차(오버/언더, 식감) 원인: 홀딩·배치·리메이크 기준 점검.&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function fmtScore(v){&lt;br /&gt;
  if (v === null || v === undefined || Number.isNaN(v)) return &amp;lt;code&amp;gt;&amp;lt;span class=&amp;quot;muted&amp;quot;&amp;gt;n/a&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
  const cls = v &amp;gt;= 4.4 ? &amp;quot;good&amp;quot; : (v &amp;lt;= 3.6 ? &amp;quot;bad&amp;quot; : &amp;quot;mid&amp;quot;);&lt;br /&gt;
  return &amp;lt;code&amp;gt;&amp;lt;span class=&amp;quot;score ${cls}&amp;quot;&amp;gt;${v.toFixed(2)}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function topIssuesHtml(issues){&lt;br /&gt;
  if (!issues || !issues.length) return &amp;lt;code&amp;gt;&amp;lt;span class=&amp;quot;muted&amp;quot;&amp;gt;-&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
  return issues.slice(0,3).map(x =&amp;gt; &amp;lt;code&amp;gt;&amp;lt;span class=&amp;quot;pill&amp;quot;&amp;gt;${x.tag} &amp;lt;span class=&amp;quot;muted&amp;quot;&amp;gt;(${x.count})&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;).join(&amp;quot; &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function buildActions(topIssues){&lt;br /&gt;
  const uniq = [...new Set((topIssues||[]).map(x=&amp;gt;x.tag))].slice(0,4);&lt;br /&gt;
  const lines = [];&lt;br /&gt;
  for (const tag of uniq){&lt;br /&gt;
    const actions = ISSUE_TO_ACTIONS[tag];&lt;br /&gt;
    if (actions &amp;amp;&amp;amp; actions.length){&lt;br /&gt;
      lines.push(&amp;lt;code&amp;gt;&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;${tag}&amp;lt;/b&amp;gt;&amp;lt;ul class=&amp;quot;actions&amp;quot;&amp;gt;${actions.map(a=&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;li&amp;gt;${a}&amp;lt;/li&amp;gt;&amp;lt;code&amp;gt;).join(&amp;quot;&amp;quot;)}&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/code&amp;gt;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (!lines.length) return &amp;lt;code&amp;gt;&amp;lt;div class=&amp;quot;muted&amp;quot;&amp;gt;특이 이슈가 적어, 표준 운영 유지 + 칭찬 리뷰 중심으로 로열티 강화 활동 추천&amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
  return &amp;lt;code&amp;gt;&amp;lt;ol class=&amp;quot;actions&amp;quot;&amp;gt;${lines.join(&amp;quot;&amp;quot;)}&amp;lt;/ol&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function examplesHtml(examples){&lt;br /&gt;
  if (!examples || !examples.length) return &amp;lt;code&amp;gt;&amp;lt;div class=&amp;quot;muted&amp;quot;&amp;gt;No sample comments&amp;lt;/div&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
  return examples.slice(0,3).map(ex =&amp;gt; {&lt;br /&gt;
    const tags = (ex.issue_tags || []).map(t=&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class=&amp;quot;pill&amp;quot;&amp;gt;${t}&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;).join(&amp;quot; &amp;quot;);&lt;br /&gt;
    return &amp;lt;code&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;ex&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;meta&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;pill&amp;quot;&amp;gt;${ex.channel}&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;pill&amp;quot;&amp;gt;${ex.platform}&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;pill&amp;quot;&amp;gt;★ ${ex.rating}&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;muted&amp;quot;&amp;gt;Ticket ${ex.ticket}&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;span class=&amp;quot;muted&amp;quot;&amp;gt;${ex.created}&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;chips&amp;quot;&amp;gt;${tags || &amp;lt;/code&amp;gt;&amp;lt;span class=&amp;quot;muted&amp;quot;&amp;gt;-&amp;lt;/span&amp;gt;&amp;lt;code&amp;gt;}&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;msg&amp;quot;&amp;gt;${escapeHtml(ex.message || &amp;quot;&amp;quot;)}&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/code&amp;gt;;&lt;br /&gt;
  }).join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function escapeHtml(s){&lt;br /&gt;
  return (s||&amp;quot;&amp;quot;)&lt;br /&gt;
    .replaceAll(&amp;quot;&amp;amp;&amp;quot;,&amp;quot;&amp;amp;amp;&amp;quot;).replaceAll(&amp;quot;&amp;lt;&amp;quot;,&amp;quot;&amp;amp;lt;&amp;quot;)&lt;br /&gt;
    .replaceAll(&amp;quot;&amp;gt;&amp;quot;,&amp;quot;&amp;amp;gt;&amp;quot;).replaceAll(&amp;#039;&amp;quot;&amp;#039;,&amp;quot;&amp;amp;quot;&amp;quot;).replaceAll(&amp;quot;&amp;#039;&amp;quot;,&amp;quot;&amp;amp;#039;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function calcKPIs(list){&lt;br /&gt;
  const totalOutlets = list.length;&lt;br /&gt;
  const critical = list.filter(x=&amp;gt;x.critical_food_safety).length;&lt;br /&gt;
  const totalReviews = list.reduce((a,x)=&amp;gt;a + (x.total_n||0), 0);&lt;br /&gt;
  const avgOverall = totalOutlets ? (list.reduce((a,x)=&amp;gt;a + (x.overall_avg||0),0)/totalOutlets) : 0;&lt;br /&gt;
  return { totalOutlets, critical, totalReviews, avgOverall };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function renderKPIs(list){&lt;br /&gt;
  const {totalOutlets, critical, totalReviews, avgOverall} = calcKPIs(list);&lt;br /&gt;
  const el = document.getElementById(&amp;quot;kpis&amp;quot;);&lt;br /&gt;
  el.innerHTML = &amp;lt;code&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;kpi&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;t&amp;quot;&amp;gt;Outlets&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;v&amp;quot;&amp;gt;${totalOutlets}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;kpi&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;t&amp;quot;&amp;gt;Critical outlets&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;v&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:var(--bad)&amp;quot;&amp;gt;${critical}&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;kpi&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;t&amp;quot;&amp;gt;Total reviews&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;v&amp;quot;&amp;gt;${totalReviews}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;kpi&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;t&amp;quot;&amp;gt;Avg overall score&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;v&amp;quot;&amp;gt;${avgOverall.toFixed(2)} &amp;lt;small&amp;gt;/ 5&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/code&amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function sortData(list, mode){&lt;br /&gt;
  const arr = [...list];&lt;br /&gt;
  if (mode === &amp;quot;priority&amp;quot;){&lt;br /&gt;
    // Critical first, then higher priority_score, then lower overall score&lt;br /&gt;
    arr.sort((a,b)=&amp;gt;{&lt;br /&gt;
      if (!!a.critical_food_safety !== !!b.critical_food_safety) return (b.critical_food_safety?1:0) - (a.critical_food_safety?1:0);&lt;br /&gt;
      if ((b.priority_score||0) !== (a.priority_score||0)) return (b.priority_score||0) - (a.priority_score||0);&lt;br /&gt;
      return (a.overall_avg||0) - (b.overall_avg||0);&lt;br /&gt;
    });&lt;br /&gt;
  } else if (mode === &amp;quot;offline&amp;quot;){&lt;br /&gt;
    arr.sort((a,b)=&amp;gt;(a.offline_avg ?? 99) - (b.offline_avg ?? 99));&lt;br /&gt;
  } else if (mode === &amp;quot;online&amp;quot;){&lt;br /&gt;
    arr.sort((a,b)=&amp;gt;(a.online_avg ?? 99) - (b.online_avg ?? 99));&lt;br /&gt;
  } else if (mode === &amp;quot;overall&amp;quot;){&lt;br /&gt;
    arr.sort((a,b)=&amp;gt;(a.overall_avg ?? 99) - (b.overall_avg ?? 99));&lt;br /&gt;
  } else if (mode === &amp;quot;volume&amp;quot;){&lt;br /&gt;
    arr.sort((a,b)=&amp;gt;(b.total_n||0) - (a.total_n||0));&lt;br /&gt;
  }&lt;br /&gt;
  return arr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function needsFixFirst(list){&lt;br /&gt;
  // heuristic: any avg &amp;lt;= 3.8 or any critical&lt;br /&gt;
  const bad = list.filter(x=&amp;gt;x.critical_food_safety || (x.overall_avg ?? 5) &amp;lt;= 3.8);&lt;br /&gt;
  const good = list.filter(x=&amp;gt;!(x.critical_food_safety || (x.overall_avg ?? 5) &amp;lt;= 3.8));&lt;br /&gt;
  return [...bad, ...good];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function render(){&lt;br /&gt;
  const q = (document.getElementById(&amp;quot;q&amp;quot;).value || &amp;quot;&amp;quot;).toLowerCase().trim();&lt;br /&gt;
  const sortMode = document.getElementById(&amp;quot;sort&amp;quot;).value;&lt;br /&gt;
  const onlyCritical = document.getElementById(&amp;quot;onlyCritical&amp;quot;).checked;&lt;br /&gt;
  const negOnly = document.getElementById(&amp;quot;negOnly&amp;quot;).checked;&lt;br /&gt;
&lt;br /&gt;
  let list = DATA.filter(x=&amp;gt;{&lt;br /&gt;
    if (onlyCritical &amp;amp;&amp;amp; !x.critical_food_safety) return false;&lt;br /&gt;
    if (!q) return true;&lt;br /&gt;
    const hay = [&lt;br /&gt;
      x.outlet,&lt;br /&gt;
      ...(x.top_issues||[]).map(t=&amp;gt;t.tag),&lt;br /&gt;
      ...(x.examples||[]).map(e=&amp;gt;e.message)&lt;br /&gt;
    ].join(&amp;quot; &amp;quot;).toLowerCase();&lt;br /&gt;
    return hay.includes(q);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  list = sortData(list, sortMode);&lt;br /&gt;
  if (negOnly) list = needsFixFirst(list);&lt;br /&gt;
&lt;br /&gt;
  renderKPIs(list);&lt;br /&gt;
&lt;br /&gt;
  const tbody = document.getElementById(&amp;quot;rows&amp;quot;);&lt;br /&gt;
  tbody.innerHTML = list.map(x=&amp;gt;{&lt;br /&gt;
    const flags = x.critical_food_safety&lt;br /&gt;
      ? &amp;lt;code&amp;gt;&amp;lt;span class=&amp;quot;pill critical&amp;quot;&amp;gt;&amp;lt;b&amp;gt;CRITICAL&amp;lt;/b&amp;gt; Food safety&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
      : &amp;lt;code&amp;gt;&amp;lt;span class=&amp;quot;muted&amp;quot;&amp;gt;-&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
    const issues = topIssuesHtml(x.top_issues);&lt;br /&gt;
    const priority = x.critical_food_safety&lt;br /&gt;
      ? &amp;lt;code&amp;gt;&amp;lt;span class=&amp;quot;pill critical&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Critical&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
      : &amp;lt;code&amp;gt;&amp;lt;span class=&amp;quot;pill&amp;quot;&amp;gt;Score &amp;lt;span class=&amp;quot;score mid&amp;quot;&amp;gt;${(x.priority_score||0).toFixed(1)}&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
    const detailId = &amp;lt;code&amp;gt;d_${x.outlet.replace(/\s+/g,&amp;#039;_&amp;#039;)}&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
    return &amp;lt;code&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;${escapeHtml(x.outlet)}&amp;lt;/b&amp;gt;&amp;lt;div class=&amp;quot;muted&amp;quot;&amp;gt;${x.total_n} reviews&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;${flags}&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;${fmtScore(x.offline_avg)} &amp;lt;span class=&amp;quot;muted&amp;quot;&amp;gt;(${x.offline_n})&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;${fmtScore(x.online_avg)} &amp;lt;span class=&amp;quot;muted&amp;quot;&amp;gt;(${x.online_n})&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;${fmtScore(x.overall_avg)} &amp;lt;span class=&amp;quot;muted&amp;quot;&amp;gt;(${x.total_n})&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;${issues}&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;${priority}&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td colspan=&amp;quot;7&amp;quot; style=&amp;quot;padding-top:0;border-bottom:1px solid var(--line);&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;details id=&amp;quot;${detailId}&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;summary&amp;gt;Show details: action plan + sample comments&amp;lt;/summary&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;detail&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;div class=&amp;quot;chips&amp;quot;&amp;gt;&lt;br /&gt;
                ${(x.top_issues||[]).map(t=&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;span class=&amp;quot;pill&amp;quot;&amp;gt;${t.tag} &amp;lt;span class=&amp;quot;muted&amp;quot;&amp;gt;(${t.count})&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;code&amp;gt;).join(&amp;quot;&amp;quot;) || &amp;lt;/code&amp;gt;&amp;lt;span class=&amp;quot;muted&amp;quot;&amp;gt;No issue tags&amp;lt;/span&amp;gt;&amp;lt;code&amp;gt;}&lt;br /&gt;
              &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;div style=&amp;quot;margin-top:6px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Recommended actions (priority order)&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
              ${buildActions(x.top_issues)}&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;div style=&amp;quot;margin-top:12px;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Sample comments (worst-first)&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
              ${examplesHtml(x.examples)}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;/details&amp;gt;&lt;br /&gt;
        &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/code&amp;gt;;&lt;br /&gt;
  }).join(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;q&amp;quot;).addEventListener(&amp;quot;input&amp;quot;, render);&lt;br /&gt;
document.getElementById(&amp;quot;sort&amp;quot;).addEventListener(&amp;quot;change&amp;quot;, render);&lt;br /&gt;
document.getElementById(&amp;quot;onlyCritical&amp;quot;).addEventListener(&amp;quot;change&amp;quot;, render);&lt;br /&gt;
document.getElementById(&amp;quot;negOnly&amp;quot;).addEventListener(&amp;quot;change&amp;quot;, render);&lt;br /&gt;
document.getElementById(&amp;quot;reset&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, ()=&amp;gt;{&lt;br /&gt;
  document.getElementById(&amp;quot;q&amp;quot;).value=&amp;quot;&amp;quot;;&lt;br /&gt;
  document.getElementById(&amp;quot;sort&amp;quot;).value=&amp;quot;priority&amp;quot;;&lt;br /&gt;
  document.getElementById(&amp;quot;onlyCritical&amp;quot;).checked=false;&lt;br /&gt;
  document.getElementById(&amp;quot;negOnly&amp;quot;).checked=false;&lt;br /&gt;
  render();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
render();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
원하시면, 이 HTML을 다음 형태로 더 “실무용”으로 업그레이드해드릴게요(질문 안 하셔도 됩니다. 저는 바로 작업 가능합니다).&lt;br /&gt;
* Owner / ETA / Status(Open/In progress/Done)까지 붙여서 “주간 Action Tracker”로 확장&lt;br /&gt;
* 매장별로 Offline vs Online 갭(Δ) 자동 표시 + “원인 가설”까지 추천&lt;br /&gt;
* “직원 이름 언급(칭찬 직원 리포트)” 자동 추출(예: One Fullerton에서 특정 직원 칭찬처럼) weekly_reviews_20251229_to_2026…&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ChatGPT Shares]]&lt;br /&gt;
[[Category:openai]]&lt;/div&gt;</summary>
		<author><name>Lukegao</name></author>
	</entry>
</feed>