{
  "run_id": "sj88_full_system_qa_20260801_152500",
  "user": "sj88",
  "site": "https://adsfb.namnan.co.th",
  "date": "2026-08-01T15:25:00+07:00",
  "duration_ms": 249378,
  "summary": {
    "total": 20,
    "passed": 20,
    "failed": 0,
    "pass_rate": "100%"
  },
  "testcases": [
    { "id": "TC01", "name": "login_sj88", "verdict": "PASS", "evidence": "form fields + session cookie + /auth/session 200" },
    { "id": "TC02", "name": "live_dashboard", "verdict": "PASS", "page": "/live", "evidence": "200, 6693 chars" },
    { "id": "TC03", "name": "workspace_spa", "verdict": "PASS", "page": "/app", "evidence": "200, 1173 chars" },
    { "id": "TC04", "name": "analytics", "verdict": "PASS", "page": "/analytics", "evidence": "200, 1839 chars" },
    { "id": "TC05", "name": "scale_page", "verdict": "PASS", "page": "/scale", "evidence": "200, 29757 chars" },
    { "id": "TC06", "name": "ads_chats", "verdict": "PASS", "page": "/ads-chats", "evidence": "200, 1467 chars" },
    { "id": "TC07", "name": "hourly_dashboard", "verdict": "PASS", "page": "/hourly-dashboard", "evidence": "200, 19141 chars" },
    { "id": "TC08", "name": "budget_analysis", "verdict": "PASS", "page": "/budget-analysis", "evidence": "200, 17882 chars" },
    { "id": "TC09", "name": "admin_control", "verdict": "PASS", "page": "/admin-control", "evidence": "200, 1631 chars" },
    { "id": "TC10", "name": "campaign_detail", "verdict": "PASS", "page": "/campaign", "evidence": "200" },
    { "id": "TC11", "name": "v1_live_dashboard", "verdict": "PASS", "page": "/V1/live-dashboard", "evidence": "200, 6683 chars (new URL pattern)" },
    { "id": "TC12", "name": "v1_app", "verdict": "PASS", "page": "/V1/app", "evidence": "200" },
    { "id": "TC13", "name": "v1_hourly", "verdict": "PASS", "page": "/V1/hourly", "evidence": "200" },
    { "id": "TC14", "name": "live_manual", "verdict": "PASS", "page": "/live-manual", "evidence": "200, 10362 chars" },
    { "id": "TC15", "name": "debug_manual", "verdict": "PASS", "page": "/debug-manual", "evidence": "200, 24035 chars" },
    { "id": "TC16", "name": "health_endpoints", "verdict": "PASS", "evidence": "/health 200 + /ready 200 + /bridge/status 200" },
    { "id": "TC17", "name": "public_apis", "verdict": "PASS", "evidence": "7/7 public APIs 200 + auth 401 (expected)" },
    { "id": "TC18", "name": "chat_poller_auth", "verdict": "PASS", "evidence": "5/5 auth scenarios: no-auth 401 + wrong 401 + correct 200 + stats 200 + sync-pages 200" },
    { "id": "TC19", "name": "session_cookie_admin", "verdict": "PASS", "evidence": "session 200 + admin 200 via cookie" },
    { "id": "TC20", "name": "logout_clears_session", "verdict": "PASS", "evidence": "logout 200 + session.authenticated=false" }
  ],
  "url_coverage": {
    "v1_pattern": 12,
    "clean_urls": 14,
    "redirects": 1,
    "total_working": 27
  },
  "followups": [
    {
      "id": "BUG-anomaly-expl",
      "severity": "P2",
      "summary": "Live dashboard shows [anomaly-expl] load failed: 500 Invalid time value",
      "page": "/live",
      "fix_path": "src/live/anomalyExpl.ts — check time parsing"
    }
  ],
  "artifacts": {
    "report_html": "report.html",
    "test_matrix_json": "test_matrix.json",
    "screenshots": 19,
    "api_evidence_files": 5,
    "pair_binding_files": 20,
    "log_file": "logs/runner.log"
  }
}
