{
  "matrix_id": "full-audit_20260713",
  "testcases": [
    {
      "id": "TC1",
      "name": "/public/chats totalMessages",
      "ui_evidence": "screenshots/live_final.png (chat panel: Messages=11)",
      "api_evidence": "GET /public/chats?days=7 → totalMessages=11",
      "before": 0, "after": 11, "verdict": "PASS"
    },
    {
      "id": "TC2",
      "name": "/public/chats totalUnread",
      "ui_evidence": "screenshots/live_final.png (chat panel: Unread=7 ต้องตอบ)",
      "api_evidence": "GET /public/chats?days=7 → totalUnread=7",
      "before": 0, "after": 7, "verdict": "PASS"
    },
    {
      "id": "TC3",
      "name": "/public/chats perPage filter is_active",
      "ui_evidence": "screenshots/live_final.png (2/61 pages active)",
      "api_evidence": "GET /public/chats?days=7 → perPage.length=61, 2 with count>0",
      "before": "4 (incl. excluded pages)", "after": "61 (active only)", "verdict": "PASS"
    },
    {
      "id": "TC4",
      "name": "/public/dashboard-alerts route exists",
      "ui_evidence": "screenshots/app_fixed.png (Smart Alerts: 1)",
      "api_evidence": "GET /public/dashboard-alerts → 200",
      "before": "404 Route not registered", "after": "200 OK", "verdict": "PASS"
    },
    {
      "id": "TC5",
      "name": "/public/ads-chats/pages",
      "ui_evidence": "screenshots/ads-chats_fixed.png (AD PAGES: 6)",
      "api_evidence": "GET /public/ads-chats/pages → 200",
      "before": "404", "after": "200 with 6 pages", "verdict": "PASS"
    },
    {
      "id": "TC6",
      "name": "/public/ads-chats/conversations",
      "ui_evidence": "screenshots/ads-chats_fixed.png (CONVERSATIONS: 2)",
      "api_evidence": "GET /public/ads-chats/conversations → 200",
      "before": "404", "after": "200", "verdict": "PASS"
    },
    {
      "id": "TC7",
      "name": "/public/ads-chats/messages",
      "ui_evidence": "n/a (admin-only data)",
      "api_evidence": "GET /public/ads-chats/messages → 200",
      "before": "404", "after": "200", "verdict": "PASS"
    },
    {
      "id": "TC8",
      "name": "/public/chat-stats totals",
      "ui_evidence": "n/a (no UI for chat-stats yet)",
      "api_evidence": "GET /public/chat-stats?days=7 → totals.conversations=6",
      "before": "0/0/0", "after": "6/6/3", "verdict": "PASS"
    },
    {
      "id": "TC9",
      "name": "/live/chat-reply registered",
      "ui_evidence": "n/a",
      "api_evidence": "POST /live/chat-reply → 200 (was 404)",
      "before": "404", "after": "200", "verdict": "PASS"
    },
    {
      "id": "TC10",
      "name": "/app nginx route",
      "ui_evidence": "screenshots/app_fixed.png",
      "api_evidence": "GET /app → 200 (was 404)",
      "before": "404", "after": "200", "verdict": "PASS"
    },
    {
      "id": "TC11",
      "name": "app.html 'alerts is not defined'",
      "ui_evidence": "screenshots/app_fixed.png (renders without error)",
      "api_evidence": "n/a (frontend JS error)",
      "before": "2 page errors", "after": "0 errors", "verdict": "PASS"
    },
    {
      "id": "TC12",
      "name": "Live page chat panel renders data",
      "ui_evidence": "screenshots/live_final.png (6 chats, 11 msgs, 7 unread)",
      "api_evidence": "GET /public/chats?days=7 → 11 msgs, 7 unread, 6 convs",
      "before": "0 chats, 0/4 pages", "after": "6 chats, 2/61 pages, 7 unread", "verdict": "PASS"
    },
    {
      "id": "TC13",
      "name": "ads-chats.html loads conversations",
      "ui_evidence": "screenshots/ads-chats_fixed.png (AD PAGES=6, CONVERSATIONS=2)",
      "api_evidence": "GET /public/ads-chats/pages → 6, /conversations → 2",
      "before": "0 pages, 0 conversations", "after": "6 pages, 2 conversations", "verdict": "PASS"
    },
    {
      "id": "TC14",
      "name": "app.html dashboard Smart Alerts work",
      "ui_evidence": "screenshots/app_fixed.png (Smart Alerts=1, Scale opportunity)",
      "api_evidence": "GET /public/dashboard-alerts → 200 (was 404)",
      "before": "broken (404)", "after": "working", "verdict": "PASS"
    }
  ],
  "summary": {
    "total": 14,
    "passed": 14,
    "failed": 0,
    "verdict": "PASS"
  }
}
