{
  "summary": {
    "run_id": "scheduled-20260729T094646",
    "started_at": "2026-07-29T09:46:50.632Z",
    "finished_at": "2026-07-29T10:11:00.678Z",
    "total": 469,
    "passed": 307,
    "failed": 132,
    "skipped": 20,
    "not_exec": 10,
    "flaky": 0,
    "results": [
      {
        "id": "FE-ACT-001",
        "status": "PASS",
        "duration_ms": 2.007755999999972
      },
      {
        "id": "FE-ACT-002",
        "status": "PASS",
        "duration_ms": 0.5496330000000853
      },
      {
        "id": "FE-ACT-003",
        "status": "PASS",
        "duration_ms": 0.25602600000001985
      },
      {
        "id": "FE-ACT-004",
        "status": "PASS",
        "duration_ms": 0.23480700000004617
      },
      {
        "id": "FE-ACT-005",
        "status": "PASS",
        "duration_ms": 0.2625780000000759
      },
      {
        "id": "FE-ACT-006",
        "status": "PASS",
        "duration_ms": 0.37311300000010306
      },
      {
        "id": "FE-ACT-007",
        "status": "PASS",
        "duration_ms": 0.23285299999997733
      },
      {
        "id": "FE-ACT-008",
        "status": "PASS",
        "duration_ms": 0.29352700000004006
      },
      {
        "id": "FE-ACT-009",
        "status": "PASS",
        "duration_ms": 0.2882870000000821
      },
      {
        "id": "FE-ACT-010",
        "status": "FAIL",
        "duration_ms": 60369.855009,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m56s\",\"retry_after_seconds\":596,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ACT-011",
        "status": "PASS",
        "duration_ms": 0.6007289999979548
      },
      {
        "id": "FE-AUTH-021",
        "status": "NOT_EXEC",
        "duration_ms": 0
      },
      {
        "id": "FE-AUTH-022",
        "status": "NOT_EXEC",
        "duration_ms": 0
      },
      {
        "id": "FE-AUTH-023",
        "status": "NOT_EXEC",
        "duration_ms": 0
      },
      {
        "id": "FE-AUTH-001",
        "status": "FAIL",
        "duration_ms": 31812.254188000003,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/login\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-AUTH-002",
        "status": "FAIL",
        "duration_ms": 30783.107679,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-AUTH-003",
        "status": "PASS",
        "duration_ms": 83.3424210000012
      },
      {
        "id": "FE-AUTH-004",
        "status": "PASS",
        "duration_ms": 149.36671699999715
      },
      {
        "id": "FE-AUTH-005",
        "status": "FAIL",
        "duration_ms": 30122.574476,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/login\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-AUTH-006",
        "status": "FAIL",
        "duration_ms": 30107.588957,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/login\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-AUTH-007",
        "status": "FAIL",
        "duration_ms": 30108.253913000008,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/login\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-AUTH-008",
        "status": "PASS",
        "duration_ms": 78.79375399998389
      },
      {
        "id": "FE-AUTH-009",
        "status": "PASS",
        "duration_ms": 99.97773799998686
      },
      {
        "id": "FE-AUTH-010",
        "status": "PASS",
        "duration_ms": 34.49365300001227
      },
      {
        "id": "FE-AUTH-011",
        "status": "PASS",
        "duration_ms": 20.468586000002688
      },
      {
        "id": "FE-AUTH-012",
        "status": "FAIL",
        "duration_ms": 60141.970229,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m59s\",\"retry_after_seconds\":719,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-AUTH-013",
        "status": "FAIL",
        "duration_ms": 60194.71788400001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m58s\",\"retry_after_seconds\":658,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-AUTH-014",
        "status": "FAIL",
        "duration_ms": 30143.770216999983,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-AUTH-015",
        "status": "PASS",
        "duration_ms": 48.9380189999938
      },
      {
        "id": "FE-AUTH-016",
        "status": "FAIL",
        "duration_ms": 30186.71970399999,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/\", waiting until \"networkidle\"\n"
      },
      {
        "id": "FE-AUTH-017",
        "status": "FAIL",
        "duration_ms": 60172.93583500001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m58s\",\"retry_after_seconds\":538,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-AUTH-018",
        "status": "FAIL",
        "duration_ms": 60186.348912999965,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7m58s\",\"retry_after_seconds\":478,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-AUTH-019",
        "status": "FAIL",
        "duration_ms": 30090.612887000025,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/login\", waiting until \"networkidle\"\n"
      },
      {
        "id": "FE-AUTH-020",
        "status": "PASS",
        "duration_ms": 305.7019180000061
      },
      {
        "id": "FE-REG-001",
        "status": "FAIL",
        "duration_ms": 31847.595344999998,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-REG-002",
        "status": "FAIL",
        "duration_ms": 30105.137628999997,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"networkidle\"\n"
      },
      {
        "id": "FE-REG-003",
        "status": "FAIL",
        "duration_ms": 30116.26204,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"networkidle\"\n"
      },
      {
        "id": "FE-REG-004",
        "status": "FAIL",
        "duration_ms": 30097.018679999994,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"networkidle\"\n"
      },
      {
        "id": "FE-REG-005",
        "status": "PASS",
        "duration_ms": 109.9575909999985
      },
      {
        "id": "FE-REG-006",
        "status": "FAIL",
        "duration_ms": 30092.894254,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"networkidle\"\n"
      },
      {
        "id": "FE-REG-007",
        "status": "FAIL",
        "duration_ms": 30111.247891000006,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=2\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-REG-008",
        "status": "FAIL",
        "duration_ms": 30096.55574100002,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=2\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-REG-009",
        "status": "FAIL",
        "duration_ms": 30109.381663999986,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=2\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-REG-010",
        "status": "FAIL",
        "duration_ms": 30108.698426000017,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=2\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-REG-011",
        "status": "FAIL",
        "duration_ms": 30100.472093999968,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=4&plan=free\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-REG-012",
        "status": "FAIL",
        "duration_ms": 30114.26314300002,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=4&plan=free\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-REG-013",
        "status": "FAIL",
        "duration_ms": 30163.151188000047,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=4&plan=free\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-REG-014",
        "status": "NOT_EXEC",
        "duration_ms": 0
      },
      {
        "id": "FE-REG-015",
        "status": "NOT_EXEC",
        "duration_ms": 0
      },
      {
        "id": "FE-REG-016",
        "status": "NOT_EXEC",
        "duration_ms": 0
      },
      {
        "id": "FE-REG-017",
        "status": "NOT_EXEC",
        "duration_ms": 0
      },
      {
        "id": "FE-REG-018",
        "status": "NOT_EXEC",
        "duration_ms": 0
      },
      {
        "id": "FE-REG-019",
        "status": "NOT_EXEC",
        "duration_ms": 0
      },
      {
        "id": "FE-REG-020",
        "status": "NOT_EXEC",
        "duration_ms": 0
      },
      {
        "id": "FE-REG-021",
        "status": "FAIL",
        "duration_ms": 30124.219482999993,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-REG-022",
        "status": "FAIL",
        "duration_ms": 30115.773018000007,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=4\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-REG-023",
        "status": "FAIL",
        "duration_ms": 60287.82722400001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7m28s\",\"retry_after_seconds\":448,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-REG-024",
        "status": "FAIL",
        "duration_ms": 30136.52716899995,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-SETUP-001",
        "status": "FAIL",
        "duration_ms": 60421.518527,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 6m25s\",\"retry_after_seconds\":385,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-SETUP-002",
        "status": "FAIL",
        "duration_ms": 15155.251884999998,
        "error": "page.goto: Timeout 15000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/setup\", waiting until \"networkidle\"\n"
      },
      {
        "id": "FE-SETUP-003",
        "status": "FAIL",
        "duration_ms": 60163.16084500002,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 5m10s\",\"retry_after_seconds\":310,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-SETUP-004",
        "status": "FAIL",
        "duration_ms": 60203.97090099999,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 4m10s\",\"retry_after_seconds\":250,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-SETUP-005",
        "status": "FAIL",
        "duration_ms": 60174.514748999994,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 3m10s\",\"retry_after_seconds\":190,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-SETUP-006",
        "status": "PASS",
        "duration_ms": 108.06767899999977
      },
      {
        "id": "FE-SETUP-007",
        "status": "FAIL",
        "duration_ms": 60477.12651099998,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 2m9s\",\"retry_after_seconds\":129,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-AI-001",
        "status": "FAIL",
        "duration_ms": 60556.609496,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 5m56s\",\"retry_after_seconds\":356,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-AI-002",
        "status": "PASS",
        "duration_ms": 1.6388789999982691
      },
      {
        "id": "FE-AI-003",
        "status": "PASS",
        "duration_ms": 0.5025480000040261
      },
      {
        "id": "FE-AI-004",
        "status": "PASS",
        "duration_ms": 0.35087499999644933
      },
      {
        "id": "FE-AI-005",
        "status": "PASS",
        "duration_ms": 0.4521850000019185
      },
      {
        "id": "FE-AI-006",
        "status": "PASS",
        "duration_ms": 0.3789780000006431
      },
      {
        "id": "FE-AI-007",
        "status": "PASS",
        "duration_ms": 0.35291899999720044
      },
      {
        "id": "FE-AI-008",
        "status": "PASS",
        "duration_ms": 0.3286450000014156
      },
      {
        "id": "FE-AI-009",
        "status": "PASS",
        "duration_ms": 0.33451400000194553
      },
      {
        "id": "FE-AI-010",
        "status": "PASS",
        "duration_ms": 0.4231590000053984
      },
      {
        "id": "FE-AI-011",
        "status": "PASS",
        "duration_ms": 0.519468999998935
      },
      {
        "id": "FE-AI-012",
        "status": "PASS",
        "duration_ms": 784.2750159999996
      },
      {
        "id": "FE-AI-013",
        "status": "PASS",
        "duration_ms": 0.23384700000315206
      },
      {
        "id": "FE-AI-014",
        "status": "PASS",
        "duration_ms": 0.4373760000016773
      },
      {
        "id": "FE-AI-015",
        "status": "PASS",
        "duration_ms": 0.39737199999945005
      },
      {
        "id": "FE-AI-016",
        "status": "PASS",
        "duration_ms": 0.8323840000011842
      },
      {
        "id": "FE-AI-017",
        "status": "PASS",
        "duration_ms": 41.488429000004544
      },
      {
        "id": "FE-AI-018",
        "status": "PASS",
        "duration_ms": 0.4115689999962342
      },
      {
        "id": "FE-AI-019",
        "status": "PASS",
        "duration_ms": 0.34194900000147754
      },
      {
        "id": "FE-AI-020",
        "status": "PASS",
        "duration_ms": 190.03237799999624
      },
      {
        "id": "FE-ADM-001",
        "status": "FAIL",
        "duration_ms": 60529.713929,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 5m21s\",\"retry_after_seconds\":321,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ADM-003",
        "status": "FAIL",
        "duration_ms": 60172.268572,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 4m21s\",\"retry_after_seconds\":261,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ADM-004",
        "status": "FAIL",
        "duration_ms": 60350.32642900001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 3m20s\",\"retry_after_seconds\":200,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ADM-005",
        "status": "FAIL",
        "duration_ms": 60342.292663,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 2m20s\",\"retry_after_seconds\":140,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ADM-006",
        "status": "FAIL",
        "duration_ms": 60484.32613599999,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 1m20s\",\"retry_after_seconds\":80,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ADM-007",
        "status": "FAIL",
        "duration_ms": 60284.20704300003,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 19s\",\"retry_after_seconds\":19,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ADM-008",
        "status": "FAIL",
        "duration_ms": 51554.28228099999,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-ADM-012",
        "status": "FAIL",
        "duration_ms": 30461.262641999987,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-ADM-013",
        "status": "FAIL",
        "duration_ms": 60142.03666500002,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m59s\",\"retry_after_seconds\":779,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ADM-014",
        "status": "FAIL",
        "duration_ms": 60156.51987099997,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m59s\",\"retry_after_seconds\":719,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ADM-015",
        "status": "FAIL",
        "duration_ms": 60217.34429000004,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m58s\",\"retry_after_seconds\":658,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ADM-016",
        "status": "FAIL",
        "duration_ms": 60163.41761500004,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m58s\",\"retry_after_seconds\":598,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ADM-002",
        "status": "PASS",
        "duration_ms": 1.9422059999778867
      },
      {
        "id": "FE-ADM-017",
        "status": "FAIL",
        "duration_ms": 30213.846449000062,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-ADM-018",
        "status": "PASS",
        "duration_ms": 1.1759980000788346
      },
      {
        "id": "FE-ADM-PLAN-001",
        "status": "FAIL",
        "duration_ms": 60467.50603600009,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m27s\",\"retry_after_seconds\":507,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ADM-PLAN-002",
        "status": "PASS",
        "duration_ms": 1.0658340000081807
      },
      {
        "id": "FE-ADM-PLAN-003",
        "status": "PASS",
        "duration_ms": 0.7631710000569001
      },
      {
        "id": "FE-ADM-PLAN-004",
        "status": "PASS",
        "duration_ms": 0.40902199991978705
      },
      {
        "id": "FE-ADM-PLAN-005",
        "status": "PASS",
        "duration_ms": 0.5078949999297038
      },
      {
        "id": "FE-ADM-PLAN-006",
        "status": "PASS",
        "duration_ms": 0.31233099999371916
      },
      {
        "id": "FE-ADM-ADDON-001",
        "status": "FAIL",
        "duration_ms": 60147.57846499991,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7m27s\",\"retry_after_seconds\":447,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ADM-ADDON-002",
        "status": "PASS",
        "duration_ms": 0.43079200002830476
      },
      {
        "id": "FE-ADM-ADDON-003",
        "status": "PASS",
        "duration_ms": 0.2728589999023825
      },
      {
        "id": "FE-ADM-ADDON-004",
        "status": "PASS",
        "duration_ms": 0.40818000002764165
      },
      {
        "id": "FE-ADM-ADDON-005",
        "status": "PASS",
        "duration_ms": 0.21616199996788055
      },
      {
        "id": "FE-ADM-PROMO-001",
        "status": "FAIL",
        "duration_ms": 60172.71811699995,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 6m27s\",\"retry_after_seconds\":387,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ADM-PROMO-002",
        "status": "PASS",
        "duration_ms": 0.44794400001410395
      },
      {
        "id": "FE-ADM-PROMO-003",
        "status": "PASS",
        "duration_ms": 0.23681100003886968
      },
      {
        "id": "FE-ADM-PROMO-004",
        "status": "PASS",
        "duration_ms": 0.2828479999443516
      },
      {
        "id": "FE-ADM-PROMO-005",
        "status": "PASS",
        "duration_ms": 0.19366099999751896
      },
      {
        "id": "FE-CAMP-021",
        "status": "FAIL",
        "duration_ms": 80032.062316,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-CAMP-022",
        "status": "FAIL",
        "duration_ms": 30440.10334799999,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-CAMP-023",
        "status": "FAIL",
        "duration_ms": 60185.37942699999,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m59s\",\"retry_after_seconds\":779,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-CAMP-024",
        "status": "FAIL",
        "duration_ms": 60123.518509000016,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m59s\",\"retry_after_seconds\":719,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-CAMP-001",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-002",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-003",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-004",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-005",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-006",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-007",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-008",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-009",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-010",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-011",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-012",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-013",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-014",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-015",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-016",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-017",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-018",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-019",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-CAMP-020",
        "status": "SKIP",
        "duration_ms": 0
      },
      {
        "id": "FE-DEAL-SEARCH-001",
        "status": "FAIL",
        "duration_ms": 47788.113399,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-DEAL-SEARCH-002",
        "status": "FAIL",
        "duration_ms": 30471.535127999996,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-DEAL-SEARCH-003",
        "status": "FAIL",
        "duration_ms": 60173.43680200001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m58s\",\"retry_after_seconds\":778,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-DEAL-SEARCH-004",
        "status": "FAIL",
        "duration_ms": 60106.923731999996,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m58s\",\"retry_after_seconds\":718,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-DEAL-SEARCH-005",
        "status": "PASS",
        "duration_ms": 1.976196000003256
      },
      {
        "id": "FE-DEAL-SEARCH-006",
        "status": "FAIL",
        "duration_ms": 60124.88019699999,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m58s\",\"retry_after_seconds\":658,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-CRED-001",
        "status": "FAIL",
        "duration_ms": 60473.41446,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m53s\",\"retry_after_seconds\":533,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-CRED-002",
        "status": "PASS",
        "duration_ms": 2.8269319999963045
      },
      {
        "id": "FE-CRED-003",
        "status": "PASS",
        "duration_ms": 0.5105899999980466
      },
      {
        "id": "FE-CRED-004",
        "status": "PASS",
        "duration_ms": 0.6198330000042915
      },
      {
        "id": "FE-CRED-005",
        "status": "PASS",
        "duration_ms": 0.3792360000006738
      },
      {
        "id": "FE-CRED-006",
        "status": "PASS",
        "duration_ms": 0.43526099999871803
      },
      {
        "id": "FE-CRED-007",
        "status": "PASS",
        "duration_ms": 0.35382899999967776
      },
      {
        "id": "FE-CRED-008",
        "status": "PASS",
        "duration_ms": 0.346255000004021
      },
      {
        "id": "FE-CRED-009",
        "status": "PASS",
        "duration_ms": 0.5028859999947599
      },
      {
        "id": "FE-CRED-010",
        "status": "PASS",
        "duration_ms": 3.127152000000933
      },
      {
        "id": "FE-CRM-001",
        "status": "FAIL",
        "duration_ms": 60552.577805,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m53s\",\"retry_after_seconds\":653,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-CRM-002",
        "status": "PASS",
        "duration_ms": 2.2195300000021234
      },
      {
        "id": "FE-CRM-003",
        "status": "PASS",
        "duration_ms": 0.5296759999982896
      },
      {
        "id": "FE-CRM-004",
        "status": "PASS",
        "duration_ms": 0.33242800000152783
      },
      {
        "id": "FE-CRM-005",
        "status": "PASS",
        "duration_ms": 0.589417000002868
      },
      {
        "id": "FE-CRM-006",
        "status": "PASS",
        "duration_ms": 0.7608560000007856
      },
      {
        "id": "FE-CRM-007",
        "status": "PASS",
        "duration_ms": 0.3099159999983385
      },
      {
        "id": "FE-CRM-008",
        "status": "PASS",
        "duration_ms": 0.2509370000043418
      },
      {
        "id": "FE-CRM-009",
        "status": "PASS",
        "duration_ms": 1.3592700000008335
      },
      {
        "id": "FE-CRM-010",
        "status": "FAIL",
        "duration_ms": 60169.515994999994,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m53s\",\"retry_after_seconds\":593,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "UNKNOWN-h6354a",
        "status": "PASS",
        "duration_ms": 2.4647869999998875
      },
      {
        "id": "UNKNOWN-g31dv8",
        "status": "PASS",
        "duration_ms": 0.4006859999999506
      },
      {
        "id": "UNKNOWN-xoz90z",
        "status": "PASS",
        "duration_ms": 0.36343699999997625
      },
      {
        "id": "UNKNOWN-6f5fm8",
        "status": "PASS",
        "duration_ms": 0.3148759999999129
      },
      {
        "id": "UNKNOWN-ep4ad0",
        "status": "PASS",
        "duration_ms": 0.24920399999996334
      },
      {
        "id": "UNKNOWN-4y9q28",
        "status": "PASS",
        "duration_ms": 0.2947180000001026
      },
      {
        "id": "UNKNOWN-tiu9ay",
        "status": "PASS",
        "duration_ms": 0.17660899999987123
      },
      {
        "id": "UNKNOWN-4bg104",
        "status": "PASS",
        "duration_ms": 0.2611260000001039
      },
      {
        "id": "UNKNOWN-v3ylhr",
        "status": "PASS",
        "duration_ms": 0.622099000000162
      },
      {
        "id": "UNKNOWN-28nx9p",
        "status": "PASS",
        "duration_ms": 0.2556959999999435
      },
      {
        "id": "FE-CSV-011",
        "status": "PASS",
        "duration_ms": 49.22862399999997
      },
      {
        "id": "FE-CSV-012",
        "status": "PASS",
        "duration_ms": 0.41359799999997904
      },
      {
        "id": "FE-CSV-013",
        "status": "PASS",
        "duration_ms": 0.35414000000002943
      },
      {
        "id": "FE-CSV-014",
        "status": "PASS",
        "duration_ms": 0.43855599999994865
      },
      {
        "id": "FE-CSV-001",
        "status": "FAIL",
        "duration_ms": 60415.122004,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m54s\",\"retry_after_seconds\":534,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-CSV-002",
        "status": "PASS",
        "duration_ms": 2.7745250000007218
      },
      {
        "id": "FE-CSV-003",
        "status": "PASS",
        "duration_ms": 0.4054360000009183
      },
      {
        "id": "FE-CSV-004",
        "status": "PASS",
        "duration_ms": 1.6812090000021271
      },
      {
        "id": "FE-CSV-005",
        "status": "PASS",
        "duration_ms": 0.7470600000015111
      },
      {
        "id": "FE-CSV-006",
        "status": "PASS",
        "duration_ms": 0.41553299999941373
      },
      {
        "id": "FE-CSV-007",
        "status": "PASS",
        "duration_ms": 0.48022400000627385
      },
      {
        "id": "FE-CSV-008",
        "status": "PASS",
        "duration_ms": 0.515198999994027
      },
      {
        "id": "FE-CSV-009",
        "status": "PASS",
        "duration_ms": 0.3869009999980335
      },
      {
        "id": "FE-CSV-010",
        "status": "PASS",
        "duration_ms": 0.3817699999999604
      },
      {
        "id": "FE-DEAL-001",
        "status": "PASS",
        "duration_ms": 107.96714099999986
      },
      {
        "id": "FE-DEAL-002",
        "status": "PASS",
        "duration_ms": 0.9944590000000062
      },
      {
        "id": "FE-DEAL-003",
        "status": "PASS",
        "duration_ms": 0.6132900000000063
      },
      {
        "id": "FE-DEAL-004",
        "status": "PASS",
        "duration_ms": 0.34365900000011607
      },
      {
        "id": "FE-DEAL-005",
        "status": "PASS",
        "duration_ms": 0.36027899999999136
      },
      {
        "id": "FE-DEAL-006",
        "status": "PASS",
        "duration_ms": 0.24883199999999306
      },
      {
        "id": "FE-DEAL-007",
        "status": "PASS",
        "duration_ms": 0.28146300000003066
      },
      {
        "id": "FE-DEAL-008",
        "status": "PASS",
        "duration_ms": 0.28158399999983885
      },
      {
        "id": "FE-DEAL-009",
        "status": "PASS",
        "duration_ms": 0.2947480000000269
      },
      {
        "id": "FE-DEAL-010",
        "status": "PASS",
        "duration_ms": 0.3306039999999939
      },
      {
        "id": "FE-DEAL-011",
        "status": "PASS",
        "duration_ms": 0.23922399999992194
      },
      {
        "id": "FE-DEAL-012",
        "status": "PASS",
        "duration_ms": 0.13979999999992287
      },
      {
        "id": "FE-DEAL-013",
        "status": "PASS",
        "duration_ms": 60.31841599999984
      },
      {
        "id": "FE-DEAL-014",
        "status": "PASS",
        "duration_ms": 20.840022999999974
      },
      {
        "id": "FE-DEAL-015",
        "status": "PASS",
        "duration_ms": 0.384715000000142
      },
      {
        "id": "FE-DEAL-016",
        "status": "PASS",
        "duration_ms": 0.229336000000103
      },
      {
        "id": "FE-DEAL-017",
        "status": "PASS",
        "duration_ms": 0.23816199999987475
      },
      {
        "id": "FE-LAY-001",
        "status": "FAIL",
        "duration_ms": 60461.897105,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m25s\",\"retry_after_seconds\":625,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-LAY-002",
        "status": "FAIL",
        "duration_ms": 60205.149163,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m25s\",\"retry_after_seconds\":565,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-LAY-003",
        "status": "FAIL",
        "duration_ms": 60180.902199000004,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m25s\",\"retry_after_seconds\":505,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-LAY-004",
        "status": "PASS",
        "duration_ms": 4.114882999972906
      },
      {
        "id": "FE-LAY-005",
        "status": "PASS",
        "duration_ms": 0.6789980000176001
      },
      {
        "id": "FE-LAY-006",
        "status": "PASS",
        "duration_ms": 0.5944210000161547
      },
      {
        "id": "FE-LAY-007",
        "status": "PASS",
        "duration_ms": 0.4983409999986179
      },
      {
        "id": "FE-LAY-008",
        "status": "PASS",
        "duration_ms": 0.3577780000050552
      },
      {
        "id": "FE-CROSS-001",
        "status": "FAIL",
        "duration_ms": 60346.382732,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7m24s\",\"retry_after_seconds\":444,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-CROSS-002",
        "status": "PASS",
        "duration_ms": 0.7088840000214987
      },
      {
        "id": "FE-CROSS-003",
        "status": "FAIL",
        "duration_ms": 60154.51907300003,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 6m24s\",\"retry_after_seconds\":384,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-CROSS-004",
        "status": "PASS",
        "duration_ms": 0.4560209999908693
      },
      {
        "id": "FE-CROSS-005",
        "status": "PASS",
        "duration_ms": 0.24258200003532693
      },
      {
        "id": "FE-CROSS-006",
        "status": "PASS",
        "duration_ms": 0.35265900002559647
      },
      {
        "id": "FE-CROSS-007",
        "status": "PASS",
        "duration_ms": 0.280203000002075
      },
      {
        "id": "FE-CROSS-008",
        "status": "PASS",
        "duration_ms": 0.2505179999861866
      },
      {
        "id": "FE-CROSS-009",
        "status": "PASS",
        "duration_ms": 0.2765870000002906
      },
      {
        "id": "FE-CROSS-010",
        "status": "PASS",
        "duration_ms": 0.3160090000019409
      },
      {
        "id": "FE-PERF-001",
        "status": "FAIL",
        "duration_ms": 60473.208696,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m26s\",\"retry_after_seconds\":566,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PERF-002",
        "status": "FAIL",
        "duration_ms": 60187.95601000001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m26s\",\"retry_after_seconds\":506,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PERF-003",
        "status": "FAIL",
        "duration_ms": 60147.61386400001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7m26s\",\"retry_after_seconds\":446,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PERF-004",
        "status": "FAIL",
        "duration_ms": 60221.61660900002,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 6m25s\",\"retry_after_seconds\":385,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PERF-005",
        "status": "FAIL",
        "duration_ms": 60150.27298000001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 5m25s\",\"retry_after_seconds\":325,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PERF-006",
        "status": "FAIL",
        "duration_ms": 60189.86102100002,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 4m25s\",\"retry_after_seconds\":265,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PERF-007",
        "status": "FAIL",
        "duration_ms": 60136.16379999998,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 3m25s\",\"retry_after_seconds\":205,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PERF-008",
        "status": "FAIL",
        "duration_ms": 60257.02394799999,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 2m25s\",\"retry_after_seconds\":145,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PERF-009",
        "status": "FAIL",
        "duration_ms": 60383.107629000035,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 1m24s\",\"retry_after_seconds\":84,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PERF-010",
        "status": "FAIL",
        "duration_ms": 60148.996566000045,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 24s\",\"retry_after_seconds\":24,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PERF-011",
        "status": "FAIL",
        "duration_ms": 56603.53459699999,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-PERF-012",
        "status": "PASS",
        "duration_ms": 1.42646099999547
      },
      {
        "id": "FE-PERF-013",
        "status": "FAIL",
        "duration_ms": 30486.567865999998,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-PERF-014",
        "status": "PASS",
        "duration_ms": 0.602911000023596
      },
      {
        "id": "FE-PERF-015",
        "status": "FAIL",
        "duration_ms": 60154.37574399996,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m58s\",\"retry_after_seconds\":778,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-NOTIF-001",
        "status": "FAIL",
        "duration_ms": 60455.940524,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m55s\",\"retry_after_seconds\":715,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-NOTIF-002",
        "status": "PASS",
        "duration_ms": 1.3911080000034417
      },
      {
        "id": "FE-NOTIF-003",
        "status": "PASS",
        "duration_ms": 0.29864500000257976
      },
      {
        "id": "FE-NOTIF-004",
        "status": "PASS",
        "duration_ms": 0.23788400000194088
      },
      {
        "id": "FE-NOTIF-005",
        "status": "PASS",
        "duration_ms": 0.31237099999998463
      },
      {
        "id": "FE-NOTIF-006",
        "status": "PASS",
        "duration_ms": 0.4108239999986836
      },
      {
        "id": "FE-NOTIF-007",
        "status": "PASS",
        "duration_ms": 0.21275600000080885
      },
      {
        "id": "FE-NOTIF-008",
        "status": "PASS",
        "duration_ms": 0.1870679999992717
      },
      {
        "id": "FE-HELP-001",
        "status": "FAIL",
        "duration_ms": 60328.15953600001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m55s\",\"retry_after_seconds\":655,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-HELP-002",
        "status": "PASS",
        "duration_ms": 0.8006610000011278
      },
      {
        "id": "FE-HELP-003",
        "status": "PASS",
        "duration_ms": 0.4247990000003483
      },
      {
        "id": "FE-HELP-004",
        "status": "PASS",
        "duration_ms": 0.41796800000884105
      },
      {
        "id": "FE-HELP-005",
        "status": "FAIL",
        "duration_ms": 60149.85827900001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m55s\",\"retry_after_seconds\":595,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-HELP-006",
        "status": "PASS",
        "duration_ms": 0.5800599999784026
      },
      {
        "id": "FE-HELP-007",
        "status": "PASS",
        "duration_ms": 0.26582599998801015
      },
      {
        "id": "FE-HELP-008",
        "status": "PASS",
        "duration_ms": 0.37087099999189377
      },
      {
        "id": "FE-EMAIL-IN-012",
        "status": "PASS",
        "duration_ms": 104.75931000000014
      },
      {
        "id": "FE-EMAIL-IN-013",
        "status": "PASS",
        "duration_ms": 22.563331999999946
      },
      {
        "id": "FE-EMAIL-IN-014",
        "status": "PASS",
        "duration_ms": 0.2960010000001603
      },
      {
        "id": "FE-EMAIL-IN-001",
        "status": "PASS",
        "duration_ms": 2.279019000000062
      },
      {
        "id": "FE-EMAIL-IN-002",
        "status": "PASS",
        "duration_ms": 0.49348799999984294
      },
      {
        "id": "FE-EMAIL-IN-003",
        "status": "PASS",
        "duration_ms": 0.42952900000000227
      },
      {
        "id": "FE-EMAIL-IN-004",
        "status": "PASS",
        "duration_ms": 0.4036909999999807
      },
      {
        "id": "FE-EMAIL-IN-005",
        "status": "PASS",
        "duration_ms": 0.3500099999998838
      },
      {
        "id": "FE-EMAIL-IN-006",
        "status": "PASS",
        "duration_ms": 0.4008360000000266
      },
      {
        "id": "FE-EMAIL-IN-007",
        "status": "PASS",
        "duration_ms": 0.48748700000010103
      },
      {
        "id": "FE-EMAIL-IN-008",
        "status": "PASS",
        "duration_ms": 81.66220699999985
      },
      {
        "id": "FE-EMAIL-IN-009",
        "status": "PASS",
        "duration_ms": 0.38555700000006254
      },
      {
        "id": "FE-EMAIL-IN-010",
        "status": "PASS",
        "duration_ms": 0.34859800000003816
      },
      {
        "id": "FE-EMAIL-IN-011",
        "status": "PASS",
        "duration_ms": 0.33078599999998914
      },
      {
        "id": "FE-EMAIL-OUT-013",
        "status": "PASS",
        "duration_ms": 224.11579700000016
      },
      {
        "id": "FE-EMAIL-OUT-014",
        "status": "PASS",
        "duration_ms": 47.362288000000035
      },
      {
        "id": "FE-EMAIL-OUT-015",
        "status": "PASS",
        "duration_ms": 16.34056799999985
      },
      {
        "id": "FE-EMAIL-OUT-001",
        "status": "FAIL",
        "duration_ms": 60592.129112,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 1m7s\",\"retry_after_seconds\":67,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-EMAIL-OUT-002",
        "status": "FAIL",
        "duration_ms": 60205.54221000001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7s\",\"retry_after_seconds\":7,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-EMAIL-OUT-003",
        "status": "PASS",
        "duration_ms": 2.8871429999999236
      },
      {
        "id": "FE-EMAIL-OUT-004",
        "status": "FAIL",
        "duration_ms": 39516.863651999985,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-EMAIL-OUT-005",
        "status": "PASS",
        "duration_ms": 0.5346039999858476
      },
      {
        "id": "FE-EMAIL-OUT-006",
        "status": "PASS",
        "duration_ms": 0.35130300000309944
      },
      {
        "id": "FE-EMAIL-OUT-007",
        "status": "FAIL",
        "duration_ms": 30513.675977000006,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-EMAIL-OUT-008",
        "status": "PASS",
        "duration_ms": 0.669724999985192
      },
      {
        "id": "FE-EMAIL-OUT-009",
        "status": "PASS",
        "duration_ms": 0.5867009999928996
      },
      {
        "id": "FE-EMAIL-OUT-010",
        "status": "FAIL",
        "duration_ms": 60159.36471600001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m58s\",\"retry_after_seconds\":778,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-EMAIL-OUT-011",
        "status": "PASS",
        "duration_ms": 0.9842200000130106
      },
      {
        "id": "FE-EMAIL-OUT-012",
        "status": "PASS",
        "duration_ms": 0.43723299997509457
      },
      {
        "id": "FE-EMAIL-001",
        "status": "FAIL",
        "duration_ms": 60577.548705,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m25s\",\"retry_after_seconds\":565,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-EMAIL-002",
        "status": "FAIL",
        "duration_ms": 60228.757472000005,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m24s\",\"retry_after_seconds\":504,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-EMAIL-003",
        "status": "FAIL",
        "duration_ms": 60149.70712600001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7m24s\",\"retry_after_seconds\":444,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-EMAIL-004",
        "status": "FAIL",
        "duration_ms": 60175.373077999975,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 6m24s\",\"retry_after_seconds\":384,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-EMAIL-005",
        "status": "FAIL",
        "duration_ms": 60221.191974999994,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 5m24s\",\"retry_after_seconds\":324,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-EMAIL-006",
        "status": "FAIL",
        "duration_ms": 60193.07373800001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 4m24s\",\"retry_after_seconds\":264,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-EMAIL-007",
        "status": "FAIL",
        "duration_ms": 60138.20608500001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 3m24s\",\"retry_after_seconds\":204,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-EMAIL-008",
        "status": "FAIL",
        "duration_ms": 60157.866183999984,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 2m23s\",\"retry_after_seconds\":143,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-EMAIL-009",
        "status": "PASS",
        "duration_ms": 5.447680000041146
      },
      {
        "id": "FE-EMAIL-010",
        "status": "FAIL",
        "duration_ms": 61224.08322599996,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 1m23s\",\"retry_after_seconds\":83,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-EMAIL-011",
        "status": "FAIL",
        "duration_ms": 60288.16415999993,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 22s\",\"retry_after_seconds\":22,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-EMAIL-012",
        "status": "PASS",
        "duration_ms": 1.4110510000027716
      },
      {
        "id": "FE-SEC-001",
        "status": "PASS",
        "duration_ms": 127.223434
      },
      {
        "id": "FE-SEC-002",
        "status": "PASS",
        "duration_ms": 9.523049000000128
      },
      {
        "id": "FE-SEC-003",
        "status": "PASS",
        "duration_ms": 0.7263560000001235
      },
      {
        "id": "FE-SEC-004",
        "status": "PASS",
        "duration_ms": 0.38525799999979427
      },
      {
        "id": "FE-SEC-005",
        "status": "PASS",
        "duration_ms": 0.3533899999999903
      },
      {
        "id": "FE-SEC-006",
        "status": "PASS",
        "duration_ms": 0.6146779999999126
      },
      {
        "id": "FE-SEC-007",
        "status": "FAIL",
        "duration_ms": 30425.912129,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-SEC-008",
        "status": "PASS",
        "duration_ms": 0.7006280000023253
      },
      {
        "id": "FE-SEC-009",
        "status": "PASS",
        "duration_ms": 0.4180999999989581
      },
      {
        "id": "FE-SEC-010",
        "status": "PASS",
        "duration_ms": 1.6544390000017302
      },
      {
        "id": "FE-SEC-011",
        "status": "PASS",
        "duration_ms": 1.3325569999979052
      },
      {
        "id": "FE-SEC-012",
        "status": "PASS",
        "duration_ms": 0.4641059999994468
      },
      {
        "id": "FE-SEC-013",
        "status": "PASS",
        "duration_ms": 0.34263999999893713
      },
      {
        "id": "FE-SEC-014",
        "status": "FAIL",
        "duration_ms": 30141.644894999998,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/login\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-SEC-015",
        "status": "PASS",
        "duration_ms": 0.23972800000046846
      },
      {
        "id": "FE-ROLE-001",
        "status": "FAIL",
        "duration_ms": 30557.582557999995,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-ROLE-002",
        "status": "FAIL",
        "duration_ms": 30329.216512,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-ROLE-003",
        "status": "PASS",
        "duration_ms": 2.7876150000083726
      },
      {
        "id": "FE-ROLE-004",
        "status": "PASS",
        "duration_ms": 0.23162199999205768
      },
      {
        "id": "FE-ROLE-005",
        "status": "PASS",
        "duration_ms": 1.1566290000046138
      },
      {
        "id": "FE-ROLE-006",
        "status": "PASS",
        "duration_ms": 0.2084690000046976
      },
      {
        "id": "UNKNOWN-y51ljy",
        "status": "PASS",
        "duration_ms": 127.97908700000005
      },
      {
        "id": "UNKNOWN-zw91bl",
        "status": "PASS",
        "duration_ms": 56.44483600000001
      },
      {
        "id": "UNKNOWN-928i4o",
        "status": "PASS",
        "duration_ms": 45.924375000000055
      },
      {
        "id": "FE-SEAT-001",
        "status": "FAIL",
        "duration_ms": 32118.422174,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-SEAT-002",
        "status": "PASS",
        "duration_ms": 1.404090999996697
      },
      {
        "id": "FE-SEAT-003",
        "status": "PASS",
        "duration_ms": 0.4765399999960209
      },
      {
        "id": "FE-SEAT-004",
        "status": "FAIL",
        "duration_ms": 30654.825228,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-SEAT-005",
        "status": "PASS",
        "duration_ms": 0.5927870000014082
      },
      {
        "id": "FE-SEAT-006",
        "status": "PASS",
        "duration_ms": 0.34083600000303704
      },
      {
        "id": "FE-SEAT-007",
        "status": "PASS",
        "duration_ms": 0.4402330000011716
      },
      {
        "id": "FE-SEAT-008",
        "status": "PASS",
        "duration_ms": 0.36722500000178115
      },
      {
        "id": "FE-SEAT-009",
        "status": "FAIL",
        "duration_ms": 30480.201694000003,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-AH-001",
        "status": "PASS",
        "duration_ms": 0.7829029999993509
      },
      {
        "id": "FE-AH-002",
        "status": "PASS",
        "duration_ms": 0.3264789999957429
      },
      {
        "id": "FE-AH-003",
        "status": "PASS",
        "duration_ms": 0.5175370000069961
      },
      {
        "id": "FE-AH-004",
        "status": "PASS",
        "duration_ms": 0.34352099998795893
      },
      {
        "id": "FE-SIG-001",
        "status": "PASS",
        "duration_ms": 0.2507179999956861
      },
      {
        "id": "FE-SIG-002",
        "status": "PASS",
        "duration_ms": 0.18137900000147056
      },
      {
        "id": "FE-SIG-003",
        "status": "PASS",
        "duration_ms": 0.24623999999312218
      },
      {
        "id": "FE-SIG-004",
        "status": "PASS",
        "duration_ms": 0.18796200001088437
      },
      {
        "id": "FE-SIG-005",
        "status": "PASS",
        "duration_ms": 3.170910000000731
      },
      {
        "id": "FE-MISC-001",
        "status": "PASS",
        "duration_ms": 0.8110639999940759
      },
      {
        "id": "FE-MISC-002",
        "status": "PASS",
        "duration_ms": 1.0107459999999264
      },
      {
        "id": "FE-MISC-003",
        "status": "PASS",
        "duration_ms": 0.27501399999891873
      },
      {
        "id": "FE-MISC-004",
        "status": "PASS",
        "duration_ms": 0.28655499999877065
      },
      {
        "id": "FE-MISC-005",
        "status": "PASS",
        "duration_ms": 0.35261799998988863
      },
      {
        "id": "FE-MISC-006",
        "status": "FAIL",
        "duration_ms": 30575.703728000008,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-MISC-007",
        "status": "PASS",
        "duration_ms": 0.5237480000068899
      },
      {
        "id": "FE-MISC-008",
        "status": "PASS",
        "duration_ms": 0.2727199999935692
      },
      {
        "id": "FE-MISC-009",
        "status": "PASS",
        "duration_ms": 0.2018160000006901
      },
      {
        "id": "FE-MISC-010",
        "status": "PASS",
        "duration_ms": 0.26545599999371916
      },
      {
        "id": "FE-PUR-001",
        "status": "FAIL",
        "duration_ms": 60265.978745000015,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m28s\",\"retry_after_seconds\":748,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PUR-002",
        "status": "PASS",
        "duration_ms": 0.805724999983795
      },
      {
        "id": "FE-PUR-003",
        "status": "PASS",
        "duration_ms": 0.24098999999114312
      },
      {
        "id": "FE-PUR-004",
        "status": "PASS",
        "duration_ms": 0.19853099997271784
      },
      {
        "id": "FE-PUR-005",
        "status": "FAIL",
        "duration_ms": 60198.826436,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m28s\",\"retry_after_seconds\":688,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PUR-006",
        "status": "PASS",
        "duration_ms": 0.4497400000109337
      },
      {
        "id": "FE-PUR-007",
        "status": "PASS",
        "duration_ms": 0.34669900001608767
      },
      {
        "id": "FE-PUR-008",
        "status": "PASS",
        "duration_ms": 0.19037600001320243
      },
      {
        "id": "FE-PHONE-001",
        "status": "FAIL",
        "duration_ms": 60483.02128,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m56s\",\"retry_after_seconds\":716,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PHONE-002",
        "status": "FAIL",
        "duration_ms": 60192.840198,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m56s\",\"retry_after_seconds\":656,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PHONE-003",
        "status": "FAIL",
        "duration_ms": 60110.33511,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m55s\",\"retry_after_seconds\":595,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PHONE-004",
        "status": "FAIL",
        "duration_ms": 60256.78245100001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m55s\",\"retry_after_seconds\":535,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-PHONE-005",
        "status": "PASS",
        "duration_ms": 10.74635600001784
      },
      {
        "id": "FE-PHONE-006",
        "status": "PASS",
        "duration_ms": 6.602750999998534
      },
      {
        "id": "FE-PHONE-007",
        "status": "PASS",
        "duration_ms": 3.505436000006739
      },
      {
        "id": "FE-PHONE-008",
        "status": "PASS",
        "duration_ms": 0.7388849999988452
      },
      {
        "id": "FE-PHONE-009",
        "status": "PASS",
        "duration_ms": 0.42544200000702403
      },
      {
        "id": "FE-SMS-TOKY-001",
        "status": "PASS",
        "duration_ms": 6.00304200000005
      },
      {
        "id": "FE-SMS-TOKY-002",
        "status": "PASS",
        "duration_ms": 0.6680409999999029
      },
      {
        "id": "FE-SMS-TOKY-003",
        "status": "PASS",
        "duration_ms": 0.9469300000000658
      },
      {
        "id": "FE-SMS-TOKY-004",
        "status": "PASS",
        "duration_ms": 0.5610619999999926
      },
      {
        "id": "FE-SMS-TOKY-005",
        "status": "PASS",
        "duration_ms": 0.46449200000006385
      },
      {
        "id": "FE-SMS-TOKY-006",
        "status": "PASS",
        "duration_ms": 0.4990580000001046
      },
      {
        "id": "FE-SMS-TOKY-007",
        "status": "PASS",
        "duration_ms": 0.40571300000010524
      },
      {
        "id": "FE-SMS-TOKY-008",
        "status": "PASS",
        "duration_ms": 0.369275000000016
      },
      {
        "id": "FE-SMS-TOKY-009",
        "status": "PASS",
        "duration_ms": 0.5343130000001111
      },
      {
        "id": "FE-SMS-TOKY-010",
        "status": "PASS",
        "duration_ms": 232.14563700000008
      },
      {
        "id": "FE-SMS-TOKY-011",
        "status": "PASS",
        "duration_ms": 0.6247200000000248
      },
      {
        "id": "FE-SMS-TOKY-012",
        "status": "PASS",
        "duration_ms": 0.26180599999997867
      },
      {
        "id": "FE-SMS-TOKY-013",
        "status": "PASS",
        "duration_ms": 0.42471900000009555
      },
      {
        "id": "FE-SMS-TOKY-014",
        "status": "PASS",
        "duration_ms": 0.4064849999999751
      },
      {
        "id": "FE-SMS-TOKY-015",
        "status": "PASS",
        "duration_ms": 0.14157199999999648
      },
      {
        "id": "FE-SMS-TOKY-016",
        "status": "PASS",
        "duration_ms": 0.34659400000009555
      },
      {
        "id": "FE-SMS-TOKY-017",
        "status": "PASS",
        "duration_ms": 0.3584359999999833
      },
      {
        "id": "FE-SMS-TOKY-018",
        "status": "PASS",
        "duration_ms": 0.38308200000005854
      },
      {
        "id": "FE-SMS-TOKY-019",
        "status": "PASS",
        "duration_ms": 0.502875000000131
      },
      {
        "id": "FE-SMS-TOKY-020",
        "status": "PASS",
        "duration_ms": 0.5623140000000149
      },
      {
        "id": "FE-SMS-TW-001",
        "status": "PASS",
        "duration_ms": 2.1581350000001294
      },
      {
        "id": "FE-SMS-TW-002",
        "status": "PASS",
        "duration_ms": 0.5567160000000513
      },
      {
        "id": "FE-SMS-TW-003",
        "status": "PASS",
        "duration_ms": 0.35083300000019335
      },
      {
        "id": "FE-SMS-TW-004",
        "status": "PASS",
        "duration_ms": 0.32763900000009016
      },
      {
        "id": "FE-SMS-TW-005",
        "status": "PASS",
        "duration_ms": 0.28522099999986494
      },
      {
        "id": "FE-SMS-TW-006",
        "status": "PASS",
        "duration_ms": 0.33008399999994253
      },
      {
        "id": "FE-SMS-TW-007",
        "status": "PASS",
        "duration_ms": 0.3971590000001015
      },
      {
        "id": "FE-SMS-TW-008",
        "status": "PASS",
        "duration_ms": 0.31063799999992625
      },
      {
        "id": "FE-SMS-TW-009",
        "status": "PASS",
        "duration_ms": 0.2955489999999372
      },
      {
        "id": "FE-SMS-TW-010",
        "status": "PASS",
        "duration_ms": 0.517612999999983
      },
      {
        "id": "FE-SMS-TW-011",
        "status": "PASS",
        "duration_ms": 230.9367040000002
      },
      {
        "id": "FE-SMS-TW-012",
        "status": "PASS",
        "duration_ms": 0.29465800000002673
      },
      {
        "id": "FE-SET-G-016",
        "status": "FAIL",
        "duration_ms": 60379.953631000004,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 2m50s\",\"retry_after_seconds\":170,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-SET-G-017",
        "status": "FAIL",
        "duration_ms": 60212.403169,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 1m50s\",\"retry_after_seconds\":110,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-SET-G-018",
        "status": "FAIL",
        "duration_ms": 60192.028525,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 49s\",\"retry_after_seconds\":49,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-SET-G-001",
        "status": "FAIL",
        "duration_ms": 32431.032973999998,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-SET-G-002",
        "status": "FAIL",
        "duration_ms": 30625.652338,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-SET-G-003",
        "status": "PASS",
        "duration_ms": 1.9221989999932703
      },
      {
        "id": "FE-SET-G-004",
        "status": "PASS",
        "duration_ms": 0.4842549999957555
      },
      {
        "id": "FE-SET-G-005",
        "status": "PASS",
        "duration_ms": 0.4440390000017942
      },
      {
        "id": "FE-SET-G-006",
        "status": "FAIL",
        "duration_ms": 30481.345001,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-SET-G-007",
        "status": "PASS",
        "duration_ms": 1.275101999999606
      },
      {
        "id": "FE-SET-G-008",
        "status": "PASS",
        "duration_ms": 0.31090100000437815
      },
      {
        "id": "FE-SET-G-009",
        "status": "PASS",
        "duration_ms": 0.3430999999982305
      },
      {
        "id": "FE-SET-G-010",
        "status": "PASS",
        "duration_ms": 0.3333320000092499
      },
      {
        "id": "FE-SET-G-011",
        "status": "PASS",
        "duration_ms": 0.26744999999937136
      },
      {
        "id": "FE-SET-G-012",
        "status": "PASS",
        "duration_ms": 0.28393900000082795
      },
      {
        "id": "FE-SET-G-013",
        "status": "PASS",
        "duration_ms": 0.3563549999962561
      },
      {
        "id": "FE-SET-G-014",
        "status": "PASS",
        "duration_ms": 0.332550999999512
      },
      {
        "id": "FE-SET-G-015",
        "status": "PASS",
        "duration_ms": 0.37562099999922793
      },
      {
        "id": "FE-SET-S-001",
        "status": "FAIL",
        "duration_ms": 30654.653716,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-SET-S-002",
        "status": "PASS",
        "duration_ms": 0.5069660000008298
      },
      {
        "id": "FE-SET-S-003",
        "status": "PASS",
        "duration_ms": 0.28038400001241826
      },
      {
        "id": "FE-SET-S-004",
        "status": "PASS",
        "duration_ms": 0.36372900000424124
      },
      {
        "id": "FE-SET-S-005",
        "status": "PASS",
        "duration_ms": 0.30120200000237674
      },
      {
        "id": "FE-SET-S-006",
        "status": "PASS",
        "duration_ms": 0.34302100000786595
      },
      {
        "id": "FE-SET-S-007",
        "status": "PASS",
        "duration_ms": 0.2709560000075726
      },
      {
        "id": "FE-SET-M-001",
        "status": "FAIL",
        "duration_ms": 60236.75935900002,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m28s\",\"retry_after_seconds\":748,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-SET-M-002",
        "status": "PASS",
        "duration_ms": 0.39438699997845106
      },
      {
        "id": "FE-SET-M-003",
        "status": "PASS",
        "duration_ms": 0.24632000000565313
      },
      {
        "id": "FE-SET-M-004",
        "status": "PASS",
        "duration_ms": 0.24768199998652562
      },
      {
        "id": "FE-SET-M-005",
        "status": "PASS",
        "duration_ms": 0.2818459999980405
      },
      {
        "id": "FE-SET-M-006",
        "status": "PASS",
        "duration_ms": 0.2631110000074841
      },
      {
        "id": "FE-USER-001",
        "status": "FAIL",
        "duration_ms": 60215.44611600001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m28s\",\"retry_after_seconds\":688,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-USER-002",
        "status": "FAIL",
        "duration_ms": 60190.12771900001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m27s\",\"retry_after_seconds\":627,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-USER-003",
        "status": "PASS",
        "duration_ms": 1.5357180000282824
      },
      {
        "id": "FE-USER-004",
        "status": "PASS",
        "duration_ms": 1.6784130000160076
      },
      {
        "id": "FE-USER-005",
        "status": "PASS",
        "duration_ms": 0.6790780000155792
      },
      {
        "id": "FE-USER-006",
        "status": "PASS",
        "duration_ms": 0.31643000000622123
      },
      {
        "id": "FE-VM-001",
        "status": "FAIL",
        "duration_ms": 60503.268832,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m50s\",\"retry_after_seconds\":530,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-VM-002",
        "status": "PASS",
        "duration_ms": 2.8957609999997658
      },
      {
        "id": "FE-VM-003",
        "status": "PASS",
        "duration_ms": 0.8998240000000806
      },
      {
        "id": "FE-VM-004",
        "status": "PASS",
        "duration_ms": 0.4702760000000126
      },
      {
        "id": "FE-VM-005",
        "status": "PASS",
        "duration_ms": 0.38118000000395114
      },
      {
        "id": "FE-VM-006",
        "status": "PASS",
        "duration_ms": 0.4995589999962249
      },
      {
        "id": "FE-ACT-VM-001",
        "status": "FAIL",
        "duration_ms": 30420.345407,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-ACT-VM-002",
        "status": "PASS",
        "duration_ms": 1.8637090000011085
      },
      {
        "id": "FE-ACT-VM-003",
        "status": "PASS",
        "duration_ms": 0.4619430000020657
      },
      {
        "id": "FE-ACT-VM-004",
        "status": "PASS",
        "duration_ms": 0.36772600000040256
      },
      {
        "id": "FE-ACT-VM-005",
        "status": "PASS",
        "duration_ms": 0.5205519999981334
      },
      {
        "id": "FE-ACT-VM-006",
        "status": "PASS",
        "duration_ms": 0.44419899999775225
      },
      {
        "id": "FE-ACT-VM-007",
        "status": "PASS",
        "duration_ms": 0.36981099999684375
      },
      {
        "id": "FE-ACT-AIC-001",
        "status": "FAIL",
        "duration_ms": 30706.7031,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-ACT-AIC-002",
        "status": "PASS",
        "duration_ms": 0.7613209999981336
      },
      {
        "id": "FE-ACT-AIC-003",
        "status": "PASS",
        "duration_ms": 0.8684510000020964
      },
      {
        "id": "FE-ACT-AIC-004",
        "status": "PASS",
        "duration_ms": 0.634053000001586
      },
      {
        "id": "FE-ACT-AIC-005",
        "status": "PASS",
        "duration_ms": 0.9710629999972298
      },
      {
        "id": "FE-ACT-BBS-001",
        "status": "FAIL",
        "duration_ms": 30469.074651000003,
        "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
      },
      {
        "id": "FE-ACT-BBS-002",
        "status": "PASS",
        "duration_ms": 0.4140929999994114
      },
      {
        "id": "FE-ACT-BBS-003",
        "status": "PASS",
        "duration_ms": 0.3057110000081593
      },
      {
        "id": "FE-ACT-PD-001",
        "status": "FAIL",
        "duration_ms": 60156.630273999996,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m29s\",\"retry_after_seconds\":749,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ACT-PD-002",
        "status": "PASS",
        "duration_ms": 0.39513700001407415
      },
      {
        "id": "FE-ACT-PD-003",
        "status": "PASS",
        "duration_ms": 0.2342169999901671
      },
      {
        "id": "FE-ACT-PD-004",
        "status": "PASS",
        "duration_ms": 0.1545990000013262
      },
      {
        "id": "FE-ACT-PD-005",
        "status": "PASS",
        "duration_ms": 0.22012099999119528
      },
      {
        "id": "UNKNOWN-049p6v",
        "status": "FAIL",
        "duration_ms": 60167.50401800001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m29s\",\"retry_after_seconds\":689,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "UNKNOWN-0z1wox",
        "status": "PASS",
        "duration_ms": 2.1693110000051092
      },
      {
        "id": "UNKNOWN-upi1ii",
        "status": "PASS",
        "duration_ms": 0.27390199998626485
      },
      {
        "id": "UNKNOWN-rut21w",
        "status": "PASS",
        "duration_ms": 0.23722300000372343
      },
      {
        "id": "FE-ACT-SF-001",
        "status": "FAIL",
        "duration_ms": 60251.57429300001,
        "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m29s\",\"retry_after_seconds\":629,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
      },
      {
        "id": "FE-ACT-SF-002",
        "status": "PASS",
        "duration_ms": 0.7655690000392497
      },
      {
        "id": "FE-ACT-SF-003",
        "status": "PASS",
        "duration_ms": 0.18154000001959503
      },
      {
        "id": "FE-ACT-SF-004",
        "status": "PASS",
        "duration_ms": 0.3130339999916032
      }
    ]
  },
  "results": [
    {
      "id": "FE-ACT-001",
      "description": "Outbound SMS produces 'SMS Sent' activity (smoke)",
      "status": "PASS",
      "duration_ms": 2.007755999999972,
      "file_path": "/app/runner/tests/activity/fe-activity.test.ts",
      "test_path": "tests/activity/fe-activity.test.ts > Activity feed (FE-ACT) > FE-ACT-001 — Outbound SMS produces 'SMS Sent' activity (smoke)"
    },
    {
      "id": "FE-ACT-002",
      "description": "Inbound SMS produces 'SMS Received' activity (smoke)",
      "status": "PASS",
      "duration_ms": 0.5496330000000853,
      "file_path": "/app/runner/tests/activity/fe-activity.test.ts",
      "test_path": "tests/activity/fe-activity.test.ts > Activity feed (FE-ACT) > FE-ACT-002 — Inbound SMS produces 'SMS Received' activity (smoke)"
    },
    {
      "id": "FE-ACT-003",
      "description": "Email sent produces 'Email Sent' activity (smoke)",
      "status": "PASS",
      "duration_ms": 0.25602600000001985,
      "file_path": "/app/runner/tests/activity/fe-activity.test.ts",
      "test_path": "tests/activity/fe-activity.test.ts > Activity feed (FE-ACT) > FE-ACT-003 — Email sent produces 'Email Sent' activity (smoke)"
    },
    {
      "id": "FE-ACT-004",
      "description": "Email received produces 'Email Received' activity (smoke)",
      "status": "PASS",
      "duration_ms": 0.23480700000004617,
      "file_path": "/app/runner/tests/activity/fe-activity.test.ts",
      "test_path": "tests/activity/fe-activity.test.ts > Activity feed (FE-ACT) > FE-ACT-004 — Email received produces 'Email Received' activity (smoke)"
    },
    {
      "id": "FE-ACT-005",
      "description": "A2P brand approved produces activity (smoke)",
      "status": "PASS",
      "duration_ms": 0.2625780000000759,
      "file_path": "/app/runner/tests/activity/fe-activity.test.ts",
      "test_path": "tests/activity/fe-activity.test.ts > Activity feed (FE-ACT) > FE-ACT-005 — A2P brand approved produces activity (smoke)"
    },
    {
      "id": "FE-ACT-006",
      "description": "Phone purchase produces 'Phone Number Purchased' (smoke)",
      "status": "PASS",
      "duration_ms": 0.37311300000010306,
      "file_path": "/app/runner/tests/activity/fe-activity.test.ts",
      "test_path": "tests/activity/fe-activity.test.ts > Activity feed (FE-ACT) > FE-ACT-006 — Phone purchase produces 'Phone Number Purchased' (smoke)"
    },
    {
      "id": "FE-ACT-007",
      "description": "Toky import produces 'Phone Number Imported' (smoke)",
      "status": "PASS",
      "duration_ms": 0.23285299999997733,
      "file_path": "/app/runner/tests/activity/fe-activity.test.ts",
      "test_path": "tests/activity/fe-activity.test.ts > Activity feed (FE-ACT) > FE-ACT-007 — Toky import produces 'Phone Number Imported' (smoke)"
    },
    {
      "id": "FE-ACT-008",
      "description": "Deal-loss negative-sentiment activity (smoke)",
      "status": "PASS",
      "duration_ms": 0.29352700000004006,
      "file_path": "/app/runner/tests/activity/fe-activity.test.ts",
      "test_path": "tests/activity/fe-activity.test.ts > Activity feed (FE-ACT) > FE-ACT-008 — Deal-loss negative-sentiment activity (smoke)"
    },
    {
      "id": "FE-ACT-009",
      "description": "Stage processing failure activity (smoke)",
      "status": "PASS",
      "duration_ms": 0.2882870000000821,
      "file_path": "/app/runner/tests/activity/fe-activity.test.ts",
      "test_path": "tests/activity/fe-activity.test.ts > Activity feed (FE-ACT) > FE-ACT-009 — Stage processing failure activity (smoke)"
    },
    {
      "id": "FE-ACT-010",
      "description": "Activities mark-read endpoints respond",
      "status": "FAIL",
      "duration_ms": 60369.855009,
      "file_path": "/app/runner/tests/activity/fe-activity.test.ts",
      "test_path": "tests/activity/fe-activity.test.ts > Activity feed (FE-ACT) > FE-ACT-010 — Activities mark-read endpoints respond",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m56s\",\"retry_after_seconds\":596,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ACT-011",
      "description": "Activity feed scoped to current account_id (smoke)",
      "status": "PASS",
      "duration_ms": 0.6007289999979548,
      "file_path": "/app/runner/tests/activity/fe-activity.test.ts",
      "test_path": "tests/activity/fe-activity.test.ts > Activity feed (FE-ACT) > FE-ACT-011 — Activity feed scoped to current account_id (smoke)"
    },
    {
      "id": "FE-AUTH-021",
      "description": "rapid wrong-password attempts on a unique email return 429 within budget",
      "status": "NOT_EXEC",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/auth/fe-auth-ratelimit.test.ts",
      "test_path": "tests/auth/fe-auth-ratelimit.test.ts > BFF Login Rate Limiter (FE-AUTH) [soak-only] > FE-AUTH-021 — rapid wrong-password attempts on a unique email return 429 within budget"
    },
    {
      "id": "FE-AUTH-022",
      "description": "429 response carries a friendly message + retry hint, no internals leaked",
      "status": "NOT_EXEC",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/auth/fe-auth-ratelimit.test.ts",
      "test_path": "tests/auth/fe-auth-ratelimit.test.ts > BFF Login Rate Limiter (FE-AUTH) [soak-only] > FE-AUTH-022 — 429 response carries a friendly message + retry hint, no internals leaked"
    },
    {
      "id": "FE-AUTH-023",
      "description": "rate limit is scoped per-email (different fakes don't share budget)",
      "status": "NOT_EXEC",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/auth/fe-auth-ratelimit.test.ts",
      "test_path": "tests/auth/fe-auth-ratelimit.test.ts > BFF Login Rate Limiter (FE-AUTH) [soak-only] > FE-AUTH-023 — rate limit is scoped per-email (different fakes don't share budget)"
    },
    {
      "id": "FE-AUTH-001",
      "description": "/login page renders with email + password + Forgot Password + Login + Register link",
      "status": "FAIL",
      "duration_ms": 31812.254188000003,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-001 — /login page renders with email + password + Forgot Password + Login + Register link",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/login\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-AUTH-002",
      "description": "Login with valid credentials → redirect to /automation-campaign",
      "status": "FAIL",
      "duration_ms": 30783.107679,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-002 — Login with valid credentials → redirect to /automation-campaign",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-AUTH-003",
      "description": "Login with wrong password → friendly error, no stack trace",
      "status": "PASS",
      "duration_ms": 83.3424210000012,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-003 — Login with wrong password → friendly error, no stack trace"
    },
    {
      "id": "FE-AUTH-004",
      "description": "Login with non-existent email → generic friendly error (no enumeration)",
      "status": "PASS",
      "duration_ms": 149.36671699999715,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-004 — Login with non-existent email → generic friendly error (no enumeration)"
    },
    {
      "id": "FE-AUTH-005",
      "description": "Login with empty fields → form validation errors",
      "status": "FAIL",
      "duration_ms": 30122.574476,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-005 — Login with empty fields → form validation errors",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/login\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-AUTH-006",
      "description": "Eye icon on password field toggles show/hide",
      "status": "FAIL",
      "duration_ms": 30107.588957,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-006 — Eye icon on password field toggles show/hide",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/login\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-AUTH-007",
      "description": "Forgot Password link → /forgot-password page renders",
      "status": "FAIL",
      "duration_ms": 30108.253913000008,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-007 — Forgot Password link → /forgot-password page renders",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/login\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-AUTH-008",
      "description": "Submit forgot password form with valid email → success message",
      "status": "PASS",
      "duration_ms": 78.79375399998389,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-008 — Submit forgot password form with valid email → success message"
    },
    {
      "id": "FE-AUTH-009",
      "description": "Submit forgot password with non-existent email → generic success (anti-enumeration)",
      "status": "PASS",
      "duration_ms": 99.97773799998686,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-009 — Submit forgot password with non-existent email → generic success (anti-enumeration)"
    },
    {
      "id": "FE-AUTH-010",
      "description": "/auth-reset-password?token=invalid → friendly invalid token error",
      "status": "PASS",
      "duration_ms": 34.49365300001227,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-010 — /auth-reset-password?token=invalid → friendly invalid token error"
    },
    {
      "id": "FE-AUTH-011",
      "description": "/auth-reset-password validates min length and match",
      "status": "PASS",
      "duration_ms": 20.468586000002688,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-011 — /auth-reset-password validates min length and match"
    },
    {
      "id": "FE-AUTH-012",
      "description": "Sign Out clears cookies and redirects to /login",
      "status": "FAIL",
      "duration_ms": 60141.970229,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-012 — Sign Out clears cookies and redirects to /login",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m59s\",\"retry_after_seconds\":719,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-AUTH-013",
      "description": "Hard refresh of authenticated page → session restores, no console errors",
      "status": "FAIL",
      "duration_ms": 60194.71788400001,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-013 — Hard refresh of authenticated page → session restores, no console errors",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m58s\",\"retry_after_seconds\":658,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-AUTH-014",
      "description": "Direct nav to authenticated route while logged out → redirects to /login with ?redirect=",
      "status": "FAIL",
      "duration_ms": 30143.770216999983,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-014 — Direct nav to authenticated route while logged out → redirects to /login with ?redirect=",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-AUTH-015",
      "description": "JWT expires mid-session → next API call triggers refresh; refresh fail → logout",
      "status": "PASS",
      "duration_ms": 48.9380189999938,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-015 — JWT expires mid-session → next API call triggers refresh; refresh fail → logout"
    },
    {
      "id": "FE-AUTH-016",
      "description": "Login on staging hits staging BFF, NOT prod (FE-BUG-002 regression)",
      "status": "FAIL",
      "duration_ms": 30186.71970399999,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-016 — Login on staging hits staging BFF, NOT prod (FE-BUG-002 regression)",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/\", waiting until \"networkidle\"\n"
    },
    {
      "id": "FE-AUTH-017",
      "description": "BFF auth cookies have HttpOnly + Secure + SameSite flags",
      "status": "FAIL",
      "duration_ms": 60172.93583500001,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-017 — BFF auth cookies have HttpOnly + Secure + SameSite flags",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m58s\",\"retry_after_seconds\":538,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-AUTH-018",
      "description": "Open redirect — ?redirect=https://evil.com after login → blocked",
      "status": "FAIL",
      "duration_ms": 60186.348912999965,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-018 — Open redirect — ?redirect=https://evil.com after login → blocked",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7m58s\",\"retry_after_seconds\":478,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-AUTH-019",
      "description": "Login button shows loading spinner while authenticating",
      "status": "FAIL",
      "duration_ms": 30090.612887000025,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-019 — Login button shows loading spinner while authenticating",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/login\", waiting until \"networkidle\"\n"
    },
    {
      "id": "FE-AUTH-020",
      "description": "Rate limiting on /login — rapid wrong-password attempts trigger 429",
      "status": "PASS",
      "duration_ms": 305.7019180000061,
      "file_path": "/app/runner/tests/auth/fe-auth.test.ts",
      "test_path": "tests/auth/fe-auth.test.ts > Authentication (FE-AUTH) > FE-AUTH-020 — Rate limiting on /login — rapid wrong-password attempts trigger 429"
    },
    {
      "id": "FE-REG-001",
      "description": "/signup step 1 renders register form (name, email, password, phone)",
      "status": "FAIL",
      "duration_ms": 31847.595344999998,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-001 — /signup step 1 renders register form (name, email, password, phone)",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-REG-002",
      "description": "Submit empty form → field validation errors",
      "status": "FAIL",
      "duration_ms": 30105.137628999997,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-002 — Submit empty form → field validation errors",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"networkidle\"\n"
    },
    {
      "id": "FE-REG-003",
      "description": "Submit with invalid email format → validation error",
      "status": "FAIL",
      "duration_ms": 30116.26204,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-003 — Submit with invalid email format → validation error",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"networkidle\"\n"
    },
    {
      "id": "FE-REG-004",
      "description": "Submit with weak password → strength meter + rejection",
      "status": "FAIL",
      "duration_ms": 30097.018679999994,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-004 — Submit with weak password → strength meter + rejection",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"networkidle\"\n"
    },
    {
      "id": "FE-REG-005",
      "description": "Submit with duplicate email → friendly 'email already registered'",
      "status": "PASS",
      "duration_ms": 109.9575909999985,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-005 — Submit with duplicate email → friendly 'email already registered'"
    },
    {
      "id": "FE-REG-006",
      "description": "Submit valid form → advances to step 2 (Select Plan)",
      "status": "FAIL",
      "duration_ms": 30092.894254,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-006 — Submit valid form → advances to step 2 (Select Plan)",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"networkidle\"\n"
    },
    {
      "id": "FE-REG-007",
      "description": "Step 2 shows Pulse Free + Pulse Pro side-by-side",
      "status": "FAIL",
      "duration_ms": 30111.247891000006,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-007 — Step 2 shows Pulse Free + Pulse Pro side-by-side",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=2\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-REG-008",
      "description": "Toggle Monthly / Annually switches plan prices",
      "status": "FAIL",
      "duration_ms": 30096.55574100002,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-008 — Toggle Monthly / Annually switches plan prices",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=2\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-REG-009",
      "description": "Click Free Plan → advances to step 4 (Order Information), skipping step 3",
      "status": "FAIL",
      "duration_ms": 30109.381663999986,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-009 — Click Free Plan → advances to step 4 (Order Information), skipping step 3",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=2\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-REG-010",
      "description": "Click Pulse Pro → advances to step 3 (Add-ons)",
      "status": "FAIL",
      "duration_ms": 30108.698426000017,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-010 — Click Pulse Pro → advances to step 3 (Add-ons)",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=2\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-REG-011",
      "description": "Step 4 (Free Plan) — Total Due $0.00, 'Continue' button (NOT 'Continue to Payment')",
      "status": "FAIL",
      "duration_ms": 30100.472093999968,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-011 — Step 4 (Free Plan) — Total Due $0.00, 'Continue' button (NOT 'Continue to Payment')",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=4&plan=free\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-REG-012",
      "description": "Step 4 (Free Plan) — promo code field hidden (FE-BUG-001 fix)",
      "status": "FAIL",
      "duration_ms": 30114.26314300002,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-012 — Step 4 (Free Plan) — promo code field hidden (FE-BUG-001 fix)",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=4&plan=free\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-REG-013",
      "description": "Step 4 (Free Plan) — clicking Continue skips payment form",
      "status": "FAIL",
      "duration_ms": 30163.151188000047,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-013 — Step 4 (Free Plan) — clicking Continue skips payment form",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=4&plan=free\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-REG-014",
      "description": "Step 4 (Paid plan) — Payment Information form shows card fields @paid",
      "status": "NOT_EXEC",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-014 — Step 4 (Paid plan) — Payment Information form shows card fields @paid"
    },
    {
      "id": "FE-REG-015",
      "description": "Step 4 — apply promo code BETAOFFER → 100% discount → label changes @paid",
      "status": "NOT_EXEC",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-015 — Step 4 — apply promo code BETAOFFER → 100% discount → label changes @paid"
    },
    {
      "id": "FE-REG-016",
      "description": "Step 4 — invalid promo code → friendly error @paid",
      "status": "NOT_EXEC",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-016 — Step 4 — invalid promo code → friendly error @paid"
    },
    {
      "id": "FE-REG-017",
      "description": "Step 4 — expired promo code → friendly error @paid",
      "status": "NOT_EXEC",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-017 — Step 4 — expired promo code → friendly error @paid"
    },
    {
      "id": "FE-REG-018",
      "description": "Step 4 — payment form rejects invalid card number @paid",
      "status": "NOT_EXEC",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-018 — Step 4 — payment form rejects invalid card number @paid"
    },
    {
      "id": "FE-REG-019",
      "description": "Step 4 — payment form rejects expired card @paid",
      "status": "NOT_EXEC",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-019 — Step 4 — payment form rejects expired card @paid"
    },
    {
      "id": "FE-REG-020",
      "description": "Step 4 — payment form requires all billing address fields @paid",
      "status": "NOT_EXEC",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-020 — Step 4 — payment form requires all billing address fields @paid"
    },
    {
      "id": "FE-REG-021",
      "description": "Browser back button mid-wizard preserves form state",
      "status": "FAIL",
      "duration_ms": 30124.219482999993,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-021 — Browser back button mid-wizard preserves form state",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-REG-022",
      "description": "Direct nav to ?step=4 without completing 1-3 → redirects",
      "status": "FAIL",
      "duration_ms": 30115.773018000007,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-022 — Direct nav to ?step=4 without completing 1-3 → redirects",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=4\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-REG-023",
      "description": "Already-authenticated user navigating to /signup → redirects to dashboard",
      "status": "FAIL",
      "duration_ms": 60287.82722400001,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-023 — Already-authenticated user navigating to /signup → redirects to dashboard",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7m28s\",\"retry_after_seconds\":448,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-REG-024",
      "description": "Wizard step indicator updates correctly per step",
      "status": "FAIL",
      "duration_ms": 30136.52716899995,
      "file_path": "/app/runner/tests/auth/fe-reg.test.ts",
      "test_path": "tests/auth/fe-reg.test.ts > Registration wizard (FE-REG) > FE-REG-024 — Wizard step indicator updates correctly per step",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/signup?step=1\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-SETUP-001",
      "description": "/setup page renders for newly-signed-up users",
      "status": "FAIL",
      "duration_ms": 60421.518527,
      "file_path": "/app/runner/tests/auth/fe-setup.test.ts",
      "test_path": "tests/auth/fe-setup.test.ts > Onboarding / Setup (FE-SETUP) > FE-SETUP-001 — /setup page renders for newly-signed-up users",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 6m25s\",\"retry_after_seconds\":385,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-SETUP-002",
      "description": "Setup wizard captures business profile info (form renders)",
      "status": "FAIL",
      "duration_ms": 15155.251884999998,
      "file_path": "/app/runner/tests/auth/fe-setup.test.ts",
      "test_path": "tests/auth/fe-setup.test.ts > Onboarding / Setup (FE-SETUP) > FE-SETUP-002 — Setup wizard captures business profile info (form renders)",
      "error": "page.goto: Timeout 15000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/setup\", waiting until \"networkidle\"\n"
    },
    {
      "id": "FE-SETUP-003",
      "description": "Skip onboarding via 'Skip for now' → dashboard with welcome modal (skip CTA exists)",
      "status": "FAIL",
      "duration_ms": 60163.16084500002,
      "file_path": "/app/runner/tests/auth/fe-setup.test.ts",
      "test_path": "tests/auth/fe-setup.test.ts > Onboarding / Setup (FE-SETUP) > FE-SETUP-003 — Skip onboarding via 'Skip for now' → dashboard with welcome modal (skip CTA exists)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 5m10s\",\"retry_after_seconds\":310,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-SETUP-004",
      "description": "/getting-started shows checklist with at least one step",
      "status": "FAIL",
      "duration_ms": 60203.97090099999,
      "file_path": "/app/runner/tests/auth/fe-setup.test.ts",
      "test_path": "tests/auth/fe-setup.test.ts > Onboarding / Setup (FE-SETUP) > FE-SETUP-004 — /getting-started shows checklist with at least one step",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 4m10s\",\"retry_after_seconds\":250,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-SETUP-005",
      "description": "Welcome greeting renders user's first name",
      "status": "FAIL",
      "duration_ms": 60174.514748999994,
      "file_path": "/app/runner/tests/auth/fe-setup.test.ts",
      "test_path": "tests/auth/fe-setup.test.ts > Onboarding / Setup (FE-SETUP) > FE-SETUP-005 — Welcome greeting renders user's first name",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 3m10s\",\"retry_after_seconds\":190,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-SETUP-006",
      "description": "setup_finished flag persists in DB for the test admin",
      "status": "PASS",
      "duration_ms": 108.06767899999977,
      "file_path": "/app/runner/tests/auth/fe-setup.test.ts",
      "test_path": "tests/auth/fe-setup.test.ts > Onboarding / Setup (FE-SETUP) > FE-SETUP-006 — setup_finished flag persists in DB for the test admin"
    },
    {
      "id": "FE-SETUP-007",
      "description": "/getting-started accessible even when setup_finished is true (onboarding route exception)",
      "status": "FAIL",
      "duration_ms": 60477.12651099998,
      "file_path": "/app/runner/tests/auth/fe-setup.test.ts",
      "test_path": "tests/auth/fe-setup.test.ts > Onboarding / Setup (FE-SETUP) > FE-SETUP-007 — /getting-started accessible even when setup_finished is true (onboarding route exception)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 2m9s\",\"retry_after_seconds\":129,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-AI-001",
      "description": "/automation-campaign/[id] shows AI personalization toggle",
      "status": "FAIL",
      "duration_ms": 60556.609496,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-001 — /automation-campaign/[id] shows AI personalization toggle",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 5m56s\",\"retry_after_seconds\":356,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-AI-002",
      "description": "Toggle ON opens cost modal + persists (smoke)",
      "status": "PASS",
      "duration_ms": 1.6388789999982691,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-002 — Toggle ON opens cost modal + persists (smoke)"
    },
    {
      "id": "FE-AI-003",
      "description": "Toggle OFF flips back, banner disappears (smoke)",
      "status": "PASS",
      "duration_ms": 0.5025480000040261,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-003 — Toggle OFF flips back, banner disappears (smoke)"
    },
    {
      "id": "FE-AI-004",
      "description": "Test-Email button disabled when AI flag OFF (smoke)",
      "status": "PASS",
      "duration_ms": 0.35087499999644933,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-004 — Test-Email button disabled when AI flag OFF (smoke)"
    },
    {
      "id": "FE-AI-005",
      "description": "Personalised stage email differs from template (smoke)",
      "status": "PASS",
      "duration_ms": 0.4521850000019185,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-005 — Personalised stage email differs from template (smoke)"
    },
    {
      "id": "FE-AI-006",
      "description": "AI flag OFF sends literal template (smoke)",
      "status": "PASS",
      "duration_ms": 0.3789780000006431,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-006 — AI flag OFF sends literal template (smoke)"
    },
    {
      "id": "FE-AI-007",
      "description": "AI ON + empty goal → fallback to template (smoke)",
      "status": "PASS",
      "duration_ms": 0.35291899999720044,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-007 — AI ON + empty goal → fallback to template (smoke)"
    },
    {
      "id": "FE-AI-008",
      "description": "AI ON + empty offering → fallback (smoke)",
      "status": "PASS",
      "duration_ms": 0.3286450000014156,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-008 — AI ON + empty offering → fallback (smoke)"
    },
    {
      "id": "FE-AI-009",
      "description": "Stage SMS with AI ON personalises body (smoke)",
      "status": "PASS",
      "duration_ms": 0.33451400000194553,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-009 — Stage SMS with AI ON personalises body (smoke)"
    },
    {
      "id": "FE-AI-010",
      "description": "AI runs before merge-tag rendering (smoke)",
      "status": "PASS",
      "duration_ms": 0.4231590000053984,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-010 — AI runs before merge-tag rendering (smoke)"
    },
    {
      "id": "FE-AI-011",
      "description": "generate_ai_variants switch hidden in prod (smoke)",
      "status": "PASS",
      "duration_ms": 0.519468999998935,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-011 — generate_ai_variants switch hidden in prod (smoke)"
    },
    {
      "id": "FE-AI-012",
      "description": "ai-agent /health endpoint reports OpenAI connectivity",
      "status": "PASS",
      "duration_ms": 784.2750159999996,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-012 — ai-agent /health endpoint reports OpenAI connectivity"
    },
    {
      "id": "FE-AI-013",
      "description": "Inbound sentiment runs regardless of AI flag (smoke)",
      "status": "PASS",
      "duration_ms": 0.23384700000315206,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-013 — Inbound sentiment runs regardless of AI flag (smoke)"
    },
    {
      "id": "FE-AI-014",
      "description": "Heuristic infers NEGATIVE on 'unsubscribe' fast (smoke)",
      "status": "PASS",
      "duration_ms": 0.4373760000016773,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-014 — Heuristic infers NEGATIVE on 'unsubscribe' fast (smoke)"
    },
    {
      "id": "FE-AI-015",
      "description": "Heuristic falls through to OpenAI (smoke)",
      "status": "PASS",
      "duration_ms": 0.39737199999945005,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-015 — Heuristic falls through to OpenAI (smoke)"
    },
    {
      "id": "FE-AI-016",
      "description": "OpenAI failure retries 5 times → sentiment NONE (smoke)",
      "status": "PASS",
      "duration_ms": 0.8323840000011842,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-016 — OpenAI failure retries 5 times → sentiment NONE (smoke)"
    },
    {
      "id": "FE-AI-017",
      "description": "sentiment-webhook from public internet must require auth",
      "status": "PASS",
      "duration_ms": 41.488429000004544,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-017 — sentiment-webhook from public internet must require auth"
    },
    {
      "id": "FE-AI-018",
      "description": "Credit balance drops by AI rate after personalised send (smoke)",
      "status": "PASS",
      "duration_ms": 0.4115689999962342,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-018 — Credit balance drops by AI rate after personalised send (smoke)"
    },
    {
      "id": "FE-AI-019",
      "description": "Toky + AI charges AI credits, not phone (smoke)",
      "status": "PASS",
      "duration_ms": 0.34194900000147754,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-019 — Toky + AI charges AI credits, not phone (smoke)"
    },
    {
      "id": "FE-AI-020",
      "description": "cleanup-old-prompts endpoint exists at both legacy and /v1 paths",
      "status": "PASS",
      "duration_ms": 190.03237799999624,
      "file_path": "/app/runner/tests/ai/fe-ai.test.ts",
      "test_path": "tests/ai/fe-ai.test.ts > AI personalization (FE-AI) > FE-AI-020 — cleanup-old-prompts endpoint exists at both legacy and /v1 paths"
    },
    {
      "id": "FE-ADM-001",
      "description": "/admin/dashboard renders without crashing",
      "status": "FAIL",
      "duration_ms": 60529.713929,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-001 — /admin/dashboard renders without crashing",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 5m21s\",\"retry_after_seconds\":321,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ADM-003",
      "description": "/admin/billing renders without crashing",
      "status": "FAIL",
      "duration_ms": 60172.268572,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-003 — /admin/billing renders without crashing",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 4m21s\",\"retry_after_seconds\":261,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ADM-004",
      "description": "/admin/billing/clients renders without crashing",
      "status": "FAIL",
      "duration_ms": 60350.32642900001,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-004 — /admin/billing/clients renders without crashing",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 3m20s\",\"retry_after_seconds\":200,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ADM-005",
      "description": "/admin/billing/payments renders without crashing",
      "status": "FAIL",
      "duration_ms": 60342.292663,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-005 — /admin/billing/payments renders without crashing",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 2m20s\",\"retry_after_seconds\":140,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ADM-006",
      "description": "/admin/campaigns renders without crashing",
      "status": "FAIL",
      "duration_ms": 60484.32613599999,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-006 — /admin/campaigns renders without crashing",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 1m20s\",\"retry_after_seconds\":80,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ADM-007",
      "description": "/admin/campaigns/analytics renders without crashing",
      "status": "FAIL",
      "duration_ms": 60284.20704300003,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-007 — /admin/campaigns/analytics renders without crashing",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 19s\",\"retry_after_seconds\":19,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ADM-008",
      "description": "/admin/campaigns/templates renders without crashing",
      "status": "FAIL",
      "duration_ms": 51554.28228099999,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-008 — /admin/campaigns/templates renders without crashing",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-ADM-012",
      "description": "/admin/pricing/plans renders without crashing",
      "status": "FAIL",
      "duration_ms": 30461.262641999987,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-012 — /admin/pricing/plans renders without crashing",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-ADM-013",
      "description": "/admin/pricing/plans/create renders without crashing",
      "status": "FAIL",
      "duration_ms": 60142.03666500002,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-013 — /admin/pricing/plans/create renders without crashing",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m59s\",\"retry_after_seconds\":779,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ADM-014",
      "description": "/admin/pricing/promo-codes renders without crashing",
      "status": "FAIL",
      "duration_ms": 60156.51987099997,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-014 — /admin/pricing/promo-codes renders without crashing",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m59s\",\"retry_after_seconds\":719,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ADM-015",
      "description": "/admin/pricing/addons renders without crashing",
      "status": "FAIL",
      "duration_ms": 60217.34429000004,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-015 — /admin/pricing/addons renders without crashing",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m58s\",\"retry_after_seconds\":658,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ADM-016",
      "description": "/admin/user-settings renders without crashing",
      "status": "FAIL",
      "duration_ms": 60163.41761500004,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-016 — /admin/user-settings renders without crashing",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m58s\",\"retry_after_seconds\":598,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ADM-002",
      "description": "Sidebar shows Billing/Dashboard/Pricing/Campaigns (smoke)",
      "status": "PASS",
      "duration_ms": 1.9422059999778867,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-002 — Sidebar shows Billing/Dashboard/Pricing/Campaigns (smoke)"
    },
    {
      "id": "FE-ADM-017",
      "description": "MEMBER role hits /admin/dashboard → 403 or redirect",
      "status": "FAIL",
      "duration_ms": 30213.846449000062,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-017 — MEMBER role hits /admin/dashboard → 403 or redirect",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-ADM-018",
      "description": "/admin/* on prod hostname → redirected (skip on staging)",
      "status": "PASS",
      "duration_ms": 1.1759980000788346,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin (FE-ADM) > FE-ADM-018 — /admin/* on prod hostname → redirected (skip on staging)"
    },
    {
      "id": "FE-ADM-PLAN-001",
      "description": "Plans list renders",
      "status": "FAIL",
      "duration_ms": 60467.50603600009,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Plans CRUD (FE-ADM-PLAN) > FE-ADM-PLAN-001 — Plans list renders",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m27s\",\"retry_after_seconds\":507,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ADM-PLAN-002",
      "description": "Create form validates required fields (smoke)",
      "status": "PASS",
      "duration_ms": 1.0658340000081807,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Plans CRUD (FE-ADM-PLAN) > FE-ADM-PLAN-002 — Create form validates required fields (smoke)"
    },
    {
      "id": "FE-ADM-PLAN-003",
      "description": "POST /v1/admin/plans creates plan (smoke)",
      "status": "PASS",
      "duration_ms": 0.7631710000569001,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Plans CRUD (FE-ADM-PLAN) > FE-ADM-PLAN-003 — POST /v1/admin/plans creates plan (smoke)"
    },
    {
      "id": "FE-ADM-PLAN-004",
      "description": "PUT updates plan, public endpoint reflects (smoke)",
      "status": "PASS",
      "duration_ms": 0.40902199991978705,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Plans CRUD (FE-ADM-PLAN) > FE-ADM-PLAN-004 — PUT updates plan, public endpoint reflects (smoke)"
    },
    {
      "id": "FE-ADM-PLAN-005",
      "description": "Delete with active subs → friendly block (smoke)",
      "status": "PASS",
      "duration_ms": 0.5078949999297038,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Plans CRUD (FE-ADM-PLAN) > FE-ADM-PLAN-005 — Delete with active subs → friendly block (smoke)"
    },
    {
      "id": "FE-ADM-PLAN-006",
      "description": "Delete unused plan succeeds (smoke)",
      "status": "PASS",
      "duration_ms": 0.31233099999371916,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Plans CRUD (FE-ADM-PLAN) > FE-ADM-PLAN-006 — Delete unused plan succeeds (smoke)"
    },
    {
      "id": "FE-ADM-ADDON-001",
      "description": "Add-ons list renders",
      "status": "FAIL",
      "duration_ms": 60147.57846499991,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Add-ons CRUD (FE-ADM-ADDON) > FE-ADM-ADDON-001 — Add-ons list renders",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7m27s\",\"retry_after_seconds\":447,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ADM-ADDON-002",
      "description": "Create requires name/price/scope (smoke)",
      "status": "PASS",
      "duration_ms": 0.43079200002830476,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Add-ons CRUD (FE-ADM-ADDON) > FE-ADM-ADDON-002 — Create requires name/price/scope (smoke)"
    },
    {
      "id": "FE-ADM-ADDON-003",
      "description": "Created add-on appears in public list (smoke)",
      "status": "PASS",
      "duration_ms": 0.2728589999023825,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Add-ons CRUD (FE-ADM-ADDON) > FE-ADM-ADDON-003 — Created add-on appears in public list (smoke)"
    },
    {
      "id": "FE-ADM-ADDON-004",
      "description": "Update price reflects on /settings/manage-plans (smoke)",
      "status": "PASS",
      "duration_ms": 0.40818000002764165,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Add-ons CRUD (FE-ADM-ADDON) > FE-ADM-ADDON-004 — Update price reflects on /settings/manage-plans (smoke)"
    },
    {
      "id": "FE-ADM-ADDON-005",
      "description": "Delete blocked when subs active (smoke)",
      "status": "PASS",
      "duration_ms": 0.21616199996788055,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Add-ons CRUD (FE-ADM-ADDON) > FE-ADM-ADDON-005 — Delete blocked when subs active (smoke)"
    },
    {
      "id": "FE-ADM-PROMO-001",
      "description": "Promo list shows discount/expiry/usage",
      "status": "FAIL",
      "duration_ms": 60172.71811699995,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Promo codes CRUD (FE-ADM-PROMO) > FE-ADM-PROMO-001 — Promo list shows discount/expiry/usage",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 6m27s\",\"retry_after_seconds\":387,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ADM-PROMO-002",
      "description": "Create 100% code applies on signup (smoke)",
      "status": "PASS",
      "duration_ms": 0.44794400001410395,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Promo codes CRUD (FE-ADM-PROMO) > FE-ADM-PROMO-002 — Create 100% code applies on signup (smoke)"
    },
    {
      "id": "FE-ADM-PROMO-003",
      "description": "Past-expiry code returns expired (smoke)",
      "status": "PASS",
      "duration_ms": 0.23681100003886968,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Promo codes CRUD (FE-ADM-PROMO) > FE-ADM-PROMO-003 — Past-expiry code returns expired (smoke)"
    },
    {
      "id": "FE-ADM-PROMO-004",
      "description": "Usage cap enforced (smoke)",
      "status": "PASS",
      "duration_ms": 0.2828479999443516,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Promo codes CRUD (FE-ADM-PROMO) > FE-ADM-PROMO-004 — Usage cap enforced (smoke)"
    },
    {
      "id": "FE-ADM-PROMO-005",
      "description": "Delete cleanly removes (smoke)",
      "status": "PASS",
      "duration_ms": 0.19366099999751896,
      "file_path": "/app/runner/tests/admin/fe-admin.test.ts",
      "test_path": "tests/admin/fe-admin.test.ts > Admin — Promo codes CRUD (FE-ADM-PROMO) > FE-ADM-PROMO-005 — Delete cleanly removes (smoke)"
    },
    {
      "id": "FE-CAMP-021",
      "description": "Deals search page renders with filter components",
      "status": "FAIL",
      "duration_ms": 80032.062316,
      "file_path": "/app/runner/tests/campaign/fe-camp-deals-search.test.ts",
      "test_path": "tests/campaign/fe-camp-deals-search.test.ts > Campaign Deals Search filters (FE-CAMP) > FE-CAMP-021 — Deals search page renders with filter components",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-CAMP-022",
      "description": "Search filter updates URL params when typed + submitted",
      "status": "FAIL",
      "duration_ms": 30440.10334799999,
      "file_path": "/app/runner/tests/campaign/fe-camp-deals-search.test.ts",
      "test_path": "tests/campaign/fe-camp-deals-search.test.ts > Campaign Deals Search filters (FE-CAMP) > FE-CAMP-022 — Search filter updates URL params when typed + submitted",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-CAMP-023",
      "description": "Status filter (when present) updates URL state",
      "status": "FAIL",
      "duration_ms": 60185.37942699999,
      "file_path": "/app/runner/tests/campaign/fe-camp-deals-search.test.ts",
      "test_path": "tests/campaign/fe-camp-deals-search.test.ts > Campaign Deals Search filters (FE-CAMP) > FE-CAMP-023 — Status filter (when present) updates URL state",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m59s\",\"retry_after_seconds\":779,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-CAMP-024",
      "description": "Pagination controls (when present) navigate without crash",
      "status": "FAIL",
      "duration_ms": 60123.518509000016,
      "file_path": "/app/runner/tests/campaign/fe-camp-deals-search.test.ts",
      "test_path": "tests/campaign/fe-camp-deals-search.test.ts > Campaign Deals Search filters (FE-CAMP) > FE-CAMP-024 — Pagination controls (when present) navigate without crash",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m59s\",\"retry_after_seconds\":719,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-CAMP-001",
      "description": "/automation-campaign lists campaigns or shows empty state",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-001 — /automation-campaign lists campaigns or shows empty state"
    },
    {
      "id": "FE-CAMP-002",
      "description": "Tabs Active / Inactive / All switch correctly",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-002 — Tabs Active / Inactive / All switch correctly"
    },
    {
      "id": "FE-CAMP-003",
      "description": "Search Campaigns input filters list",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-003 — Search Campaigns input filters list"
    },
    {
      "id": "FE-CAMP-004",
      "description": "Pagination Next/Prev (where present) is sane",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-004 — Pagination Next/Prev (where present) is sane"
    },
    {
      "id": "FE-CAMP-005",
      "description": "PULSE / SWARM tabs at top (SWARM dev-only on staging)",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-005 — PULSE / SWARM tabs at top (SWARM dev-only on staging)"
    },
    {
      "id": "FE-CAMP-006",
      "description": "/automation-campaign/create renders builder",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-006 — /automation-campaign/create renders builder"
    },
    {
      "id": "FE-CAMP-007",
      "description": "Builder header shows 'Untitled' (FE-BUG-08 fix — not literal 'undefined')",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-007 — Builder header shows 'Untitled' (FE-BUG-08 fix — not literal 'undefined')"
    },
    {
      "id": "FE-CAMP-008",
      "description": "Builder canvas shows 'Add Stage +' button",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-008 — Builder canvas shows 'Add Stage +' button"
    },
    {
      "id": "FE-CAMP-009",
      "description": "Click Add Stage opens stage type modal",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-009 — Click Add Stage opens stage type modal"
    },
    {
      "id": "FE-CAMP-010",
      "description": "Stage settings modal validates required fields (sanity check)",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-010 — Stage settings modal validates required fields (sanity check)"
    },
    {
      "id": "FE-CAMP-011",
      "description": "Builder name area exists (route smoke)",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-011 — Builder name area exists (route smoke)"
    },
    {
      "id": "FE-CAMP-012",
      "description": "Save Campaign with no stages → friendly error or warning",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-012 — Save Campaign with no stages → friendly error or warning"
    },
    {
      "id": "FE-CAMP-013",
      "description": "Active toggle persists after save (visual presence)",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-013 — Active toggle persists after save (visual presence)"
    },
    {
      "id": "FE-CAMP-014",
      "description": "Click 'Import campaign from CRM' opens import modal",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-014 — Click 'Import campaign from CRM' opens import modal"
    },
    {
      "id": "FE-CAMP-015",
      "description": "Import campaign validates CRM connection state (smoke)",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-015 — Import campaign validates CRM connection state (smoke)"
    },
    {
      "id": "FE-CAMP-016",
      "description": "/automation-campaign/[id] for non-existent ID → 404 or friendly error",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-016 — /automation-campaign/[id] for non-existent ID → 404 or friendly error"
    },
    {
      "id": "FE-CAMP-017",
      "description": "/automation-campaign/[id]/deals lists campaign deals",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-017 — /automation-campaign/[id]/deals lists campaign deals"
    },
    {
      "id": "FE-CAMP-018",
      "description": "Deals table renders without crashing (smoke)",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-018 — Deals table renders without crashing (smoke)"
    },
    {
      "id": "FE-CAMP-019",
      "description": "Pull CRM State button triggers sync (button present)",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-019 — Pull CRM State button triggers sync (button present)"
    },
    {
      "id": "FE-CAMP-020",
      "description": "Stage drag-and-drop reorders without crashes (page renders)",
      "status": "SKIP",
      "duration_ms": 0,
      "file_path": "/app/runner/tests/campaign/fe-camp.test.ts",
      "test_path": "tests/campaign/fe-camp.test.ts > Campaign Builder (FE-CAMP) > FE-CAMP-020 — Stage drag-and-drop reorders without crashes (page renders)"
    },
    {
      "id": "FE-DEAL-SEARCH-001",
      "description": "Type email into Search Deals input → table filters by email",
      "status": "FAIL",
      "duration_ms": 47788.113399,
      "file_path": "/app/runner/tests/campaign/fe-deal-search.test.ts",
      "test_path": "tests/campaign/fe-deal-search.test.ts > Deal Search regression (FE-DEAL-SEARCH) > FE-DEAL-SEARCH-001 — Type email into Search Deals input → table filters by email",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-DEAL-SEARCH-002",
      "description": "Type partial first name → filter applies",
      "status": "FAIL",
      "duration_ms": 30471.535127999996,
      "file_path": "/app/runner/tests/campaign/fe-deal-search.test.ts",
      "test_path": "tests/campaign/fe-deal-search.test.ts > Deal Search regression (FE-DEAL-SEARCH) > FE-DEAL-SEARCH-002 — Type partial first name → filter applies",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-DEAL-SEARCH-003",
      "description": "Press Enter in search submits without page reload",
      "status": "FAIL",
      "duration_ms": 60173.43680200001,
      "file_path": "/app/runner/tests/campaign/fe-deal-search.test.ts",
      "test_path": "tests/campaign/fe-deal-search.test.ts > Deal Search regression (FE-DEAL-SEARCH) > FE-DEAL-SEARCH-003 — Press Enter in search submits without page reload",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m58s\",\"retry_after_seconds\":778,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-DEAL-SEARCH-004",
      "description": "Clear input → full deal list returns",
      "status": "FAIL",
      "duration_ms": 60106.923731999996,
      "file_path": "/app/runner/tests/campaign/fe-deal-search.test.ts",
      "test_path": "tests/campaign/fe-deal-search.test.ts > Deal Search regression (FE-DEAL-SEARCH) > FE-DEAL-SEARCH-004 — Clear input → full deal list returns",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m58s\",\"retry_after_seconds\":718,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-DEAL-SEARCH-005",
      "description": "Search persists across pagination",
      "status": "PASS",
      "duration_ms": 1.976196000003256,
      "file_path": "/app/runner/tests/campaign/fe-deal-search.test.ts",
      "test_path": "tests/campaign/fe-deal-search.test.ts > Deal Search regression (FE-DEAL-SEARCH) > FE-DEAL-SEARCH-005 — Search persists across pagination"
    },
    {
      "id": "FE-DEAL-SEARCH-006",
      "description": "Include lost deals toggle ON/OFF persists",
      "status": "FAIL",
      "duration_ms": 60124.88019699999,
      "file_path": "/app/runner/tests/campaign/fe-deal-search.test.ts",
      "test_path": "tests/campaign/fe-deal-search.test.ts > Deal Search regression (FE-DEAL-SEARCH) > FE-DEAL-SEARCH-006 — Include lost deals toggle ON/OFF persists",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m58s\",\"retry_after_seconds\":658,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-CRED-001",
      "description": "Header credit balance widget reflects /v1/credit",
      "status": "FAIL",
      "duration_ms": 60473.41446,
      "file_path": "/app/runner/tests/credits/fe-credits.test.ts",
      "test_path": "tests/credits/fe-credits.test.ts > Credits + billing (FE-CRED) > FE-CRED-001 — Header credit balance widget reflects /v1/credit",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m53s\",\"retry_after_seconds\":533,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-CRED-002",
      "description": "Top-up via card increases balance (smoke @paid)",
      "status": "PASS",
      "duration_ms": 2.8269319999963045,
      "file_path": "/app/runner/tests/credits/fe-credits.test.ts",
      "test_path": "tests/credits/fe-credits.test.ts > Credits + billing (FE-CRED) > FE-CRED-002 — Top-up via card increases balance (smoke @paid)"
    },
    {
      "id": "FE-CRED-003",
      "description": "Twilio SMS decrements balance by 1 (smoke)",
      "status": "PASS",
      "duration_ms": 0.5105899999980466,
      "file_path": "/app/runner/tests/credits/fe-credits.test.ts",
      "test_path": "tests/credits/fe-credits.test.ts > Credits + billing (FE-CRED) > FE-CRED-003 — Twilio SMS decrements balance by 1 (smoke)"
    },
    {
      "id": "FE-CRED-004",
      "description": "Twilio failure releases reserved credits (smoke)",
      "status": "PASS",
      "duration_ms": 0.6198330000042915,
      "file_path": "/app/runner/tests/credits/fe-credits.test.ts",
      "test_path": "tests/credits/fe-credits.test.ts > Credits + billing (FE-CRED) > FE-CRED-004 — Twilio failure releases reserved credits (smoke)"
    },
    {
      "id": "FE-CRED-005",
      "description": "Toky SMS leaves balance unchanged (smoke)",
      "status": "PASS",
      "duration_ms": 0.3792360000006738,
      "file_path": "/app/runner/tests/credits/fe-credits.test.ts",
      "test_path": "tests/credits/fe-credits.test.ts > Credits + billing (FE-CRED) > FE-CRED-005 — Toky SMS leaves balance unchanged (smoke)"
    },
    {
      "id": "FE-CRED-006",
      "description": "Personalised stage send charges AI unit not phone (smoke)",
      "status": "PASS",
      "duration_ms": 0.43526099999871803,
      "file_path": "/app/runner/tests/credits/fe-credits.test.ts",
      "test_path": "tests/credits/fe-credits.test.ts > Credits + billing (FE-CRED) > FE-CRED-006 — Personalised stage send charges AI unit not phone (smoke)"
    },
    {
      "id": "FE-CRED-007",
      "description": "Failed AI personalization → AI credit not committed (smoke)",
      "status": "PASS",
      "duration_ms": 0.35382899999967776,
      "file_path": "/app/runner/tests/credits/fe-credits.test.ts",
      "test_path": "tests/credits/fe-credits.test.ts > Credits + billing (FE-CRED) > FE-CRED-007 — Failed AI personalization → AI credit not committed (smoke)"
    },
    {
      "id": "FE-CRED-008",
      "description": "Hit balance=0 → friendly out-of-credits modal (smoke)",
      "status": "PASS",
      "duration_ms": 0.346255000004021,
      "file_path": "/app/runner/tests/credits/fe-credits.test.ts",
      "test_path": "tests/credits/fe-credits.test.ts > Credits + billing (FE-CRED) > FE-CRED-008 — Hit balance=0 → friendly out-of-credits modal (smoke)"
    },
    {
      "id": "FE-CRED-009",
      "description": "Add-on activation increases credit allowance (smoke)",
      "status": "PASS",
      "duration_ms": 0.5028859999947599,
      "file_path": "/app/runner/tests/credits/fe-credits.test.ts",
      "test_path": "tests/credits/fe-credits.test.ts > Credits + billing (FE-CRED) > FE-CRED-009 — Add-on activation increases credit allowance (smoke)"
    },
    {
      "id": "FE-CRED-010",
      "description": "Cancel add-on at end of period → next month reverts (smoke)",
      "status": "PASS",
      "duration_ms": 3.127152000000933,
      "file_path": "/app/runner/tests/credits/fe-credits.test.ts",
      "test_path": "tests/credits/fe-credits.test.ts > Credits + billing (FE-CRED) > FE-CRED-010 — Cancel add-on at end of period → next month reverts (smoke)"
    },
    {
      "id": "FE-CRM-001",
      "description": "Pipedrive verify-api-key endpoint exists",
      "status": "FAIL",
      "duration_ms": 60552.577805,
      "file_path": "/app/runner/tests/crm/fe-crm.test.ts",
      "test_path": "tests/crm/fe-crm.test.ts > CRM sync (FE-CRM) > FE-CRM-001 — Pipedrive verify-api-key endpoint exists",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m53s\",\"retry_after_seconds\":653,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-CRM-002",
      "description": "Invalid Pipedrive API key → friendly error (smoke)",
      "status": "PASS",
      "duration_ms": 2.2195300000021234,
      "file_path": "/app/runner/tests/crm/fe-crm.test.ts",
      "test_path": "tests/crm/fe-crm.test.ts > CRM sync (FE-CRM) > FE-CRM-002 — Invalid Pipedrive API key → friendly error (smoke)"
    },
    {
      "id": "FE-CRM-003",
      "description": "Map Pipedrive user to RevHero account (smoke)",
      "status": "PASS",
      "duration_ms": 0.5296759999982896,
      "file_path": "/app/runner/tests/crm/fe-crm.test.ts",
      "test_path": "tests/crm/fe-crm.test.ts > CRM sync (FE-CRM) > FE-CRM-003 — Map Pipedrive user to RevHero account (smoke)"
    },
    {
      "id": "FE-CRM-004",
      "description": "Enable CRM sync on campaign pulls existing deals (smoke)",
      "status": "PASS",
      "duration_ms": 0.33242800000152783,
      "file_path": "/app/runner/tests/crm/fe-crm.test.ts",
      "test_path": "tests/crm/fe-crm.test.ts > CRM sync (FE-CRM) > FE-CRM-004 — Enable CRM sync on campaign pulls existing deals (smoke)"
    },
    {
      "id": "FE-CRM-005",
      "description": "Force-pull from CRM enqueues sweeper candidates (smoke)",
      "status": "PASS",
      "duration_ms": 0.589417000002868,
      "file_path": "/app/runner/tests/crm/fe-crm.test.ts",
      "test_path": "tests/crm/fe-crm.test.ts > CRM sync (FE-CRM) > FE-CRM-005 — Force-pull from CRM enqueues sweeper candidates (smoke)"
    },
    {
      "id": "FE-CRM-006",
      "description": "Disable CRM sync stops auto-pulls (smoke)",
      "status": "PASS",
      "duration_ms": 0.7608560000007856,
      "file_path": "/app/runner/tests/crm/fe-crm.test.ts",
      "test_path": "tests/crm/fe-crm.test.ts > CRM sync (FE-CRM) > FE-CRM-006 — Disable CRM sync stops auto-pulls (smoke)"
    },
    {
      "id": "FE-CRM-007",
      "description": "Stage move with CRM connected → Pipedrive note + stage update (smoke)",
      "status": "PASS",
      "duration_ms": 0.3099159999983385,
      "file_path": "/app/runner/tests/crm/fe-crm.test.ts",
      "test_path": "tests/crm/fe-crm.test.ts > CRM sync (FE-CRM) > FE-CRM-007 — Stage move with CRM connected → Pipedrive note + stage update (smoke)"
    },
    {
      "id": "FE-CRM-008",
      "description": "Pipedrive webhook updates RevHero deal record (smoke)",
      "status": "PASS",
      "duration_ms": 0.2509370000043418,
      "file_path": "/app/runner/tests/crm/fe-crm.test.ts",
      "test_path": "tests/crm/fe-crm.test.ts > CRM sync (FE-CRM) > FE-CRM-008 — Pipedrive webhook updates RevHero deal record (smoke)"
    },
    {
      "id": "FE-CRM-009",
      "description": "Pipedrive outage → CRM goroutine fails silently, move proceeds (smoke)",
      "status": "PASS",
      "duration_ms": 1.3592700000008335,
      "file_path": "/app/runner/tests/crm/fe-crm.test.ts",
      "test_path": "tests/crm/fe-crm.test.ts > CRM sync (FE-CRM) > FE-CRM-009 — Pipedrive outage → CRM goroutine fails silently, move proceeds (smoke)"
    },
    {
      "id": "FE-CRM-010",
      "description": "HubSpot verify-api-key endpoint exists",
      "status": "FAIL",
      "duration_ms": 60169.515994999994,
      "file_path": "/app/runner/tests/crm/fe-crm.test.ts",
      "test_path": "tests/crm/fe-crm.test.ts > CRM sync (FE-CRM) > FE-CRM-010 — HubSpot verify-api-key endpoint exists",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m53s\",\"retry_after_seconds\":593,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "UNKNOWN-h6354a",
      "description": "FE-E2E-001 — Signup → Onboarding → First campaign → First deal email sent (smoke)",
      "status": "PASS",
      "duration_ms": 2.4647869999998875,
      "file_path": "/app/runner/tests/e2e/fe-e2e.test.ts",
      "test_path": "tests/e2e/fe-e2e.test.ts > Cross-service E2E (FE-E2E) > FE-E2E-001 — Signup → Onboarding → First campaign → First deal email sent (smoke)"
    },
    {
      "id": "UNKNOWN-g31dv8",
      "description": "FE-E2E-002 — Inbound reply NEGATIVE → deal auto-Lost (smoke)",
      "status": "PASS",
      "duration_ms": 0.4006859999999506,
      "file_path": "/app/runner/tests/e2e/fe-e2e.test.ts",
      "test_path": "tests/e2e/fe-e2e.test.ts > Cross-service E2E (FE-E2E) > FE-E2E-002 — Inbound reply NEGATIVE → deal auto-Lost (smoke)"
    },
    {
      "id": "UNKNOWN-xoz90z",
      "description": "FE-E2E-003 — Toky BYOC end-to-end SMS round-trip (smoke)",
      "status": "PASS",
      "duration_ms": 0.36343699999997625,
      "file_path": "/app/runner/tests/e2e/fe-e2e.test.ts",
      "test_path": "tests/e2e/fe-e2e.test.ts > Cross-service E2E (FE-E2E) > FE-E2E-003 — Toky BYOC end-to-end SMS round-trip (smoke)"
    },
    {
      "id": "UNKNOWN-6f5fm8",
      "description": "FE-E2E-004 — Multi-stage campaign with wait + actions (smoke)",
      "status": "PASS",
      "duration_ms": 0.3148759999999129,
      "file_path": "/app/runner/tests/e2e/fe-e2e.test.ts",
      "test_path": "tests/e2e/fe-e2e.test.ts > Cross-service E2E (FE-E2E) > FE-E2E-004 — Multi-stage campaign with wait + actions (smoke)"
    },
    {
      "id": "UNKNOWN-ep4ad0",
      "description": "FE-E2E-005 — Quota cap respected (smoke)",
      "status": "PASS",
      "duration_ms": 0.24920399999996334,
      "file_path": "/app/runner/tests/e2e/fe-e2e.test.ts",
      "test_path": "tests/e2e/fe-e2e.test.ts > Cross-service E2E (FE-E2E) > FE-E2E-005 — Quota cap respected (smoke)"
    },
    {
      "id": "UNKNOWN-4y9q28",
      "description": "FE-E2E-006 — Inactive user pause-billing edge case (smoke)",
      "status": "PASS",
      "duration_ms": 0.2947180000001026,
      "file_path": "/app/runner/tests/e2e/fe-e2e.test.ts",
      "test_path": "tests/e2e/fe-e2e.test.ts > Cross-service E2E (FE-E2E) > FE-E2E-006 — Inactive user pause-billing edge case (smoke)"
    },
    {
      "id": "UNKNOWN-tiu9ay",
      "description": "FE-E2E-007 — Free-plan SMS via Toky succeeds, via Twilio rejected (smoke)",
      "status": "PASS",
      "duration_ms": 0.17660899999987123,
      "file_path": "/app/runner/tests/e2e/fe-e2e.test.ts",
      "test_path": "tests/e2e/fe-e2e.test.ts > Cross-service E2E (FE-E2E) > FE-E2E-007 — Free-plan SMS via Toky succeeds, via Twilio rejected (smoke)"
    },
    {
      "id": "UNKNOWN-4bg104",
      "description": "FE-E2E-008 — JWT expiry mid-flow auto-refreshes (smoke)",
      "status": "PASS",
      "duration_ms": 0.2611260000001039,
      "file_path": "/app/runner/tests/e2e/fe-e2e.test.ts",
      "test_path": "tests/e2e/fe-e2e.test.ts > Cross-service E2E (FE-E2E) > FE-E2E-008 — JWT expiry mid-flow auto-refreshes (smoke)"
    },
    {
      "id": "UNKNOWN-v3ylhr",
      "description": "FE-E2E-009 — Multi-tenant isolation across mailboxes/Toky/deals (smoke)",
      "status": "PASS",
      "duration_ms": 0.622099000000162,
      "file_path": "/app/runner/tests/e2e/fe-e2e.test.ts",
      "test_path": "tests/e2e/fe-e2e.test.ts > Cross-service E2E (FE-E2E) > FE-E2E-009 — Multi-tenant isolation across mailboxes/Toky/deals (smoke)"
    },
    {
      "id": "UNKNOWN-28nx9p",
      "description": "FE-E2E-010 — Webhook-only services not exposed (smoke — covered by WEBHOOK-AUTH)",
      "status": "PASS",
      "duration_ms": 0.2556959999999435,
      "file_path": "/app/runner/tests/e2e/fe-e2e.test.ts",
      "test_path": "tests/e2e/fe-e2e.test.ts > Cross-service E2E (FE-E2E) > FE-E2E-010 — Webhook-only services not exposed (smoke — covered by WEBHOOK-AUTH)"
    },
    {
      "id": "FE-CSV-011",
      "description": "lead_ingestion_analytics table exists in deals-actions DB",
      "status": "PASS",
      "duration_ms": 49.22862399999997,
      "file_path": "/app/runner/tests/csv/fe-csv-leadingestion.test.ts",
      "test_path": "tests/csv/fe-csv-leadingestion.test.ts > Lead Ingestion Executor (FE-CSV) > FE-CSV-011 — lead_ingestion_analytics table exists in deals-actions DB"
    },
    {
      "id": "FE-CSV-012",
      "description": "lead-ingestion event contract has v1 (smoke)",
      "status": "PASS",
      "duration_ms": 0.41359799999997904,
      "file_path": "/app/runner/tests/csv/fe-csv-leadingestion.test.ts",
      "test_path": "tests/csv/fe-csv-leadingestion.test.ts > Lead Ingestion Executor (FE-CSV) > FE-CSV-012 — lead-ingestion event contract has v1 (smoke)"
    },
    {
      "id": "FE-CSV-013",
      "description": "OAuth2 token acquisition + refresh via leadingestion/auth.go (smoke)",
      "status": "PASS",
      "duration_ms": 0.35414000000002943,
      "file_path": "/app/runner/tests/csv/fe-csv-leadingestion.test.ts",
      "test_path": "tests/csv/fe-csv-leadingestion.test.ts > Lead Ingestion Executor (FE-CSV) > FE-CSV-013 — OAuth2 token acquisition + refresh via leadingestion/auth.go (smoke)"
    },
    {
      "id": "FE-CSV-014",
      "description": "analytics record carries success / partial / failed status (smoke)",
      "status": "PASS",
      "duration_ms": 0.43855599999994865,
      "file_path": "/app/runner/tests/csv/fe-csv-leadingestion.test.ts",
      "test_path": "tests/csv/fe-csv-leadingestion.test.ts > Lead Ingestion Executor (FE-CSV) > FE-CSV-014 — analytics record carries success / partial / failed status (smoke)"
    },
    {
      "id": "FE-CSV-001",
      "description": "GET /v1/csv-imports/template returns CSV template",
      "status": "FAIL",
      "duration_ms": 60415.122004,
      "file_path": "/app/runner/tests/csv/fe-csv.test.ts",
      "test_path": "tests/csv/fe-csv.test.ts > CSV imports (FE-CSV) > FE-CSV-001 — GET /v1/csv-imports/template returns CSV template",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m54s\",\"retry_after_seconds\":534,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-CSV-002",
      "description": "POST /v1/stages/:id/csv-imports creates pending job (smoke)",
      "status": "PASS",
      "duration_ms": 2.7745250000007218,
      "file_path": "/app/runner/tests/csv/fe-csv.test.ts",
      "test_path": "tests/csv/fe-csv.test.ts > CSV imports (FE-CSV) > FE-CSV-002 — POST /v1/stages/:id/csv-imports creates pending job (smoke)"
    },
    {
      "id": "FE-CSV-003",
      "description": "Job advances pending → processing → completed (smoke)",
      "status": "PASS",
      "duration_ms": 0.4054360000009183,
      "file_path": "/app/runner/tests/csv/fe-csv.test.ts",
      "test_path": "tests/csv/fe-csv.test.ts > CSV imports (FE-CSV) > FE-CSV-003 — Job advances pending → processing → completed (smoke)"
    },
    {
      "id": "FE-CSV-004",
      "description": "Missing required columns → per-row error report (smoke)",
      "status": "PASS",
      "duration_ms": 1.6812090000021271,
      "file_path": "/app/runner/tests/csv/fe-csv.test.ts",
      "test_path": "tests/csv/fe-csv.test.ts > CSV imports (FE-CSV) > FE-CSV-004 — Missing required columns → per-row error report (smoke)"
    },
    {
      "id": "FE-CSV-005",
      "description": "Malformed phones skipped, valid rows ingested (smoke)",
      "status": "PASS",
      "duration_ms": 0.7470600000015111,
      "file_path": "/app/runner/tests/csv/fe-csv.test.ts",
      "test_path": "tests/csv/fe-csv.test.ts > CSV imports (FE-CSV) > FE-CSV-005 — Malformed phones skipped, valid rows ingested (smoke)"
    },
    {
      "id": "FE-CSV-006",
      "description": "Duplicate emails skipped or merged (smoke)",
      "status": "PASS",
      "duration_ms": 0.41553299999941373,
      "file_path": "/app/runner/tests/csv/fe-csv.test.ts",
      "test_path": "tests/csv/fe-csv.test.ts > CSV imports (FE-CSV) > FE-CSV-006 — Duplicate emails skipped or merged (smoke)"
    },
    {
      "id": "FE-CSV-007",
      "description": "Reprocess endpoint idempotent (smoke)",
      "status": "PASS",
      "duration_ms": 0.48022400000627385,
      "file_path": "/app/runner/tests/csv/fe-csv.test.ts",
      "test_path": "tests/csv/fe-csv.test.ts > CSV imports (FE-CSV) > FE-CSV-007 — Reprocess endpoint idempotent (smoke)"
    },
    {
      "id": "FE-CSV-008",
      "description": "GET /v1/stages/:id/csv-imports lists jobs (smoke)",
      "status": "PASS",
      "duration_ms": 0.515198999994027,
      "file_path": "/app/runner/tests/csv/fe-csv.test.ts",
      "test_path": "tests/csv/fe-csv.test.ts > CSV imports (FE-CSV) > FE-CSV-008 — GET /v1/stages/:id/csv-imports lists jobs (smoke)"
    },
    {
      "id": "FE-CSV-009",
      "description": "suppress-import-actions flag toggles trigger behavior (smoke)",
      "status": "PASS",
      "duration_ms": 0.3869009999980335,
      "file_path": "/app/runner/tests/csv/fe-csv.test.ts",
      "test_path": "tests/csv/fe-csv.test.ts > CSV imports (FE-CSV) > FE-CSV-009 — suppress-import-actions flag toggles trigger behavior (smoke)"
    },
    {
      "id": "FE-CSV-010",
      "description": "Oversized CSV handled gracefully (smoke)",
      "status": "PASS",
      "duration_ms": 0.3817699999999604,
      "file_path": "/app/runner/tests/csv/fe-csv.test.ts",
      "test_path": "tests/csv/fe-csv.test.ts > CSV imports (FE-CSV) > FE-CSV-010 — Oversized CSV handled gracefully (smoke)"
    },
    {
      "id": "FE-DEAL-001",
      "description": "Sweep endpoint returns jobs_scheduled count",
      "status": "PASS",
      "duration_ms": 107.96714099999986,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-001 — Sweep endpoint returns jobs_scheduled count"
    },
    {
      "id": "FE-DEAL-002",
      "description": "Sweep moves a deal forward (smoke — needs seeded campaign)",
      "status": "PASS",
      "duration_ms": 0.9944590000000062,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-002 — Sweep moves a deal forward (smoke — needs seeded campaign)"
    },
    {
      "id": "FE-DEAL-003",
      "description": "Inactive campaign skips sweep (smoke)",
      "status": "PASS",
      "duration_ms": 0.6132900000000063,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-003 — Inactive campaign skips sweep (smoke)"
    },
    {
      "id": "FE-DEAL-004",
      "description": "Inactive user's stages skipped (smoke)",
      "status": "PASS",
      "duration_ms": 0.34365900000011607,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-004 — Inactive user's stages skipped (smoke)"
    },
    {
      "id": "FE-DEAL-005",
      "description": "max_deals_to_move quota respected (smoke)",
      "status": "PASS",
      "duration_ms": 0.36027899999999136,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-005 — max_deals_to_move quota respected (smoke)"
    },
    {
      "id": "FE-DEAL-006",
      "description": "Worker pops job within 5s (smoke)",
      "status": "PASS",
      "duration_ms": 0.24883199999999306,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-006 — Worker pops job within 5s (smoke)"
    },
    {
      "id": "FE-DEAL-007",
      "description": "Worker triggers email/SMS action (smoke)",
      "status": "PASS",
      "duration_ms": 0.28146300000003066,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-007 — Worker triggers email/SMS action (smoke)"
    },
    {
      "id": "FE-DEAL-008",
      "description": "Action returns 425 → deal rolled back (smoke)",
      "status": "PASS",
      "duration_ms": 0.28158399999983885,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-008 — Action returns 425 → deal rolled back (smoke)"
    },
    {
      "id": "FE-DEAL-009",
      "description": "Action 5xx → exponential backoff retry (smoke)",
      "status": "PASS",
      "duration_ms": 0.2947480000000269,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-009 — Action 5xx → exponential backoff retry (smoke)"
    },
    {
      "id": "FE-DEAL-010",
      "description": "Successful move appears in BFF /v1/deals/filter (smoke)",
      "status": "PASS",
      "duration_ms": 0.3306039999999939,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-010 — Successful move appears in BFF /v1/deals/filter (smoke)"
    },
    {
      "id": "FE-DEAL-011",
      "description": "Successful move does NOT create activity row (smoke)",
      "status": "PASS",
      "duration_ms": 0.23922399999992194,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-011 — Successful move does NOT create activity row (smoke)"
    },
    {
      "id": "FE-DEAL-012",
      "description": "CRM sync goroutine fires after move (smoke)",
      "status": "PASS",
      "duration_ms": 0.13979999999992287,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-012 — CRM sync goroutine fires after move (smoke)"
    },
    {
      "id": "FE-DEAL-013",
      "description": "/v1/stages/scheduled endpoint reachable",
      "status": "PASS",
      "duration_ms": 60.31841599999984,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-013 — /v1/stages/scheduled endpoint reachable"
    },
    {
      "id": "FE-DEAL-014",
      "description": "/v1/stages/moved endpoint reachable",
      "status": "PASS",
      "duration_ms": 20.840022999999974,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-014 — /v1/stages/moved endpoint reachable"
    },
    {
      "id": "FE-DEAL-015",
      "description": "Redis isolation between staging and prod (smoke)",
      "status": "PASS",
      "duration_ms": 0.384715000000142,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-015 — Redis isolation between staging and prod (smoke)"
    },
    {
      "id": "FE-DEAL-016",
      "description": "Super-admin sweeper button (smoke)",
      "status": "PASS",
      "duration_ms": 0.229336000000103,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-016 — Super-admin sweeper button (smoke)"
    },
    {
      "id": "FE-DEAL-017",
      "description": "next_move_date NULL → deal NOT picked up (smoke)",
      "status": "PASS",
      "duration_ms": 0.23816199999987475,
      "file_path": "/app/runner/tests/deal-mover/fe-deal.test.ts",
      "test_path": "tests/deal-mover/fe-deal.test.ts > Deal Mover (FE-DEAL) > FE-DEAL-017 — next_move_date NULL → deal NOT picked up (smoke)"
    },
    {
      "id": "FE-LAY-001",
      "description": "Sidebar visible on every authenticated dashboard page",
      "status": "FAIL",
      "duration_ms": 60461.897105,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Layout / Shell (FE-LAY) > FE-LAY-001 — Sidebar visible on every authenticated dashboard page",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m25s\",\"retry_after_seconds\":625,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-LAY-002",
      "description": "Sidebar shows Dashboard / Campaign / Phone / Email / Settings (smoke)",
      "status": "FAIL",
      "duration_ms": 60205.149163,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Layout / Shell (FE-LAY) > FE-LAY-002 — Sidebar shows Dashboard / Campaign / Phone / Email / Settings (smoke)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m25s\",\"retry_after_seconds\":565,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-LAY-003",
      "description": "Header shows credit balance, notification bell, sign out",
      "status": "FAIL",
      "duration_ms": 60180.902199000004,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Layout / Shell (FE-LAY) > FE-LAY-003 — Header shows credit balance, notification bell, sign out",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m25s\",\"retry_after_seconds\":505,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-LAY-004",
      "description": "Active sidebar item highlighted in primary color (smoke)",
      "status": "PASS",
      "duration_ms": 4.114882999972906,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Layout / Shell (FE-LAY) > FE-LAY-004 — Active sidebar item highlighted in primary color (smoke)"
    },
    {
      "id": "FE-LAY-005",
      "description": "Click sidebar item navigates without full page reload (smoke)",
      "status": "PASS",
      "duration_ms": 0.6789980000176001,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Layout / Shell (FE-LAY) > FE-LAY-005 — Click sidebar item navigates without full page reload (smoke)"
    },
    {
      "id": "FE-LAY-006",
      "description": "Mobile nav (<768px) collapses sidebar to hamburger (smoke)",
      "status": "PASS",
      "duration_ms": 0.5944210000161547,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Layout / Shell (FE-LAY) > FE-LAY-006 — Mobile nav (<768px) collapses sidebar to hamburger (smoke)"
    },
    {
      "id": "FE-LAY-007",
      "description": "Layout no CLS when notifications appear/dismiss (smoke)",
      "status": "PASS",
      "duration_ms": 0.4983409999986179,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Layout / Shell (FE-LAY) > FE-LAY-007 — Layout no CLS when notifications appear/dismiss (smoke)"
    },
    {
      "id": "FE-LAY-008",
      "description": "Layout no CLS when modals open/close (smoke)",
      "status": "PASS",
      "duration_ms": 0.3577780000050552,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Layout / Shell (FE-LAY) > FE-LAY-008 — Layout no CLS when modals open/close (smoke)"
    },
    {
      "id": "FE-CROSS-001",
      "description": "All staging API calls go to *.test.revhero.io (FE-BUG-002 regression)",
      "status": "FAIL",
      "duration_ms": 60346.382732,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Cross-cutting (FE-CROSS) > FE-CROSS-001 — All staging API calls go to *.test.revhero.io (FE-BUG-002 regression)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7m24s\",\"retry_after_seconds\":444,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-CROSS-002",
      "description": "Cloud-document uploads go to staging cloud-documents (smoke)",
      "status": "PASS",
      "duration_ms": 0.7088840000214987,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Cross-cutting (FE-CROSS) > FE-CROSS-002 — Cloud-document uploads go to staging cloud-documents (smoke)"
    },
    {
      "id": "FE-CROSS-003",
      "description": "Dev-only routes accessible on staging (proxy.ts hostname check)",
      "status": "FAIL",
      "duration_ms": 60154.51907300003,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Cross-cutting (FE-CROSS) > FE-CROSS-003 — Dev-only routes accessible on staging (proxy.ts hostname check)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 6m24s\",\"retry_after_seconds\":384,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-CROSS-004",
      "description": "Same routes redirect to /automation-campaign on prod (skip on staging)",
      "status": "PASS",
      "duration_ms": 0.4560209999908693,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Cross-cutting (FE-CROSS) > FE-CROSS-004 — Same routes redirect to /automation-campaign on prod (skip on staging)"
    },
    {
      "id": "FE-CROSS-005",
      "description": "Free Plan signup completes without payment form (FE-BUG-001 regression)",
      "status": "PASS",
      "duration_ms": 0.24258200003532693,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Cross-cutting (FE-CROSS) > FE-CROSS-005 — Free Plan signup completes without payment form (FE-BUG-001 regression)"
    },
    {
      "id": "FE-CROSS-006",
      "description": "Plan-feature labels render numbers with thousands separators (smoke)",
      "status": "PASS",
      "duration_ms": 0.35265900002559647,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Cross-cutting (FE-CROSS) > FE-CROSS-006 — Plan-feature labels render numbers with thousands separators (smoke)"
    },
    {
      "id": "FE-CROSS-007",
      "description": "Settings right-rail items don't truncate (smoke)",
      "status": "PASS",
      "duration_ms": 0.280203000002075,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Cross-cutting (FE-CROSS) > FE-CROSS-007 — Settings right-rail items don't truncate (smoke)"
    },
    {
      "id": "FE-CROSS-008",
      "description": "Currency values show 2 decimals consistently (smoke)",
      "status": "PASS",
      "duration_ms": 0.2505179999861866,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Cross-cutting (FE-CROSS) > FE-CROSS-008 — Currency values show 2 decimals consistently (smoke)"
    },
    {
      "id": "FE-CROSS-009",
      "description": "Campaign create header shows 'Untitled campaign' (FE-BUG-08 regression)",
      "status": "PASS",
      "duration_ms": 0.2765870000002906,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Cross-cutting (FE-CROSS) > FE-CROSS-009 — Campaign create header shows 'Untitled campaign' (FE-BUG-08 regression)"
    },
    {
      "id": "FE-CROSS-010",
      "description": "Phone /sms doesn't get stuck on skeleton (FE-BUG-04 regression)",
      "status": "PASS",
      "duration_ms": 0.3160090000019409,
      "file_path": "/app/runner/tests/layout/fe-layout-cross.test.ts",
      "test_path": "tests/layout/fe-layout-cross.test.ts > Cross-cutting (FE-CROSS) > FE-CROSS-010 — Phone /sms doesn't get stuck on skeleton (FE-BUG-04 regression)"
    },
    {
      "id": "FE-PERF-001",
      "description": "/automation-campaign reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "status": "FAIL",
      "duration_ms": 60473.208696,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-001 — /automation-campaign reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m26s\",\"retry_after_seconds\":566,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PERF-002",
      "description": "/dashboard reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "status": "FAIL",
      "duration_ms": 60187.95601000001,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-002 — /dashboard reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m26s\",\"retry_after_seconds\":506,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PERF-003",
      "description": "/email-system/email reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "status": "FAIL",
      "duration_ms": 60147.61386400001,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-003 — /email-system/email reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7m26s\",\"retry_after_seconds\":446,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PERF-004",
      "description": "/phone-system/sms reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "status": "FAIL",
      "duration_ms": 60221.61660900002,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-004 — /phone-system/sms reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 6m25s\",\"retry_after_seconds\":385,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PERF-005",
      "description": "/notifications reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "status": "FAIL",
      "duration_ms": 60150.27298000001,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-005 — /notifications reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 5m25s\",\"retry_after_seconds\":325,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PERF-006",
      "description": "/settings/general reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "status": "FAIL",
      "duration_ms": 60189.86102100002,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-006 — /settings/general reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 4m25s\",\"retry_after_seconds\":265,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PERF-007",
      "description": "/admin/dashboard reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "status": "FAIL",
      "duration_ms": 60136.16379999998,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-007 — /admin/dashboard reaches DOMContentLoaded under 15000ms (warn >5000ms)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 3m25s\",\"retry_after_seconds\":205,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PERF-008",
      "description": "axe-core /automation-campaign zero serious violations",
      "status": "FAIL",
      "duration_ms": 60257.02394799999,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-008 — axe-core /automation-campaign zero serious violations",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 2m25s\",\"retry_after_seconds\":145,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PERF-009",
      "description": "axe-core /settings/general zero serious violations",
      "status": "FAIL",
      "duration_ms": 60383.107629000035,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-009 — axe-core /settings/general zero serious violations",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 1m24s\",\"retry_after_seconds\":84,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PERF-010",
      "description": "Form inputs have associated labels (axe label rule)",
      "status": "FAIL",
      "duration_ms": 60148.996566000045,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-010 — Form inputs have associated labels (axe label rule)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 24s\",\"retry_after_seconds\":24,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PERF-011",
      "description": "Color contrast meets WCAG AA (axe color-contrast rule)",
      "status": "FAIL",
      "duration_ms": 56603.53459699999,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-011 — Color contrast meets WCAG AA (axe color-contrast rule)",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-PERF-012",
      "description": "Tab order through forms is logical (smoke)",
      "status": "PASS",
      "duration_ms": 1.42646099999547,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-012 — Tab order through forms is logical (smoke)"
    },
    {
      "id": "FE-PERF-013",
      "description": "Images have alt text (axe image-alt rule)",
      "status": "FAIL",
      "duration_ms": 30486.567865999998,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-013 — Images have alt text (axe image-alt rule)",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-PERF-014",
      "description": "Page titles match content (smoke)",
      "status": "PASS",
      "duration_ms": 0.602911000023596,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-014 — Page titles match content (smoke)"
    },
    {
      "id": "FE-PERF-015",
      "description": "No 404s on static assets (smoke — checked via network observer)",
      "status": "FAIL",
      "duration_ms": 60154.37574399996,
      "file_path": "/app/runner/tests/perf/fe-perf.test.ts",
      "test_path": "tests/perf/fe-perf.test.ts > Performance (FE-PERF) > FE-PERF-015 — No 404s on static assets (smoke — checked via network observer)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m58s\",\"retry_after_seconds\":778,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-NOTIF-001",
      "description": "/notifications renders list with All / Read / Unread tabs",
      "status": "FAIL",
      "duration_ms": 60455.940524,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-NOTIF-001 — /notifications renders list with All / Read / Unread tabs",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m55s\",\"retry_after_seconds\":715,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-NOTIF-002",
      "description": "Tabs filter notifications",
      "status": "PASS",
      "duration_ms": 1.3911080000034417,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-NOTIF-002 — Tabs filter notifications"
    },
    {
      "id": "FE-NOTIF-003",
      "description": "Sub-tabs Email/SMS/LinkedIn/System filter by type",
      "status": "PASS",
      "duration_ms": 0.29864500000257976,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-NOTIF-003 — Sub-tabs Email/SMS/LinkedIn/System filter by type"
    },
    {
      "id": "FE-NOTIF-004",
      "description": "Mark all as read clears unread",
      "status": "PASS",
      "duration_ms": 0.23788400000194088,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-NOTIF-004 — Mark all as read clears unread"
    },
    {
      "id": "FE-NOTIF-005",
      "description": "Per-row 'Mark as Read' updates row (smoke)",
      "status": "PASS",
      "duration_ms": 0.31237099999998463,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-NOTIF-005 — Per-row 'Mark as Read' updates row (smoke)"
    },
    {
      "id": "FE-NOTIF-006",
      "description": "Notifications scoped to current account_id (smoke)",
      "status": "PASS",
      "duration_ms": 0.4108239999986836,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-NOTIF-006 — Notifications scoped to current account_id (smoke)"
    },
    {
      "id": "FE-NOTIF-007",
      "description": "Bell icon shows unread badge (smoke)",
      "status": "PASS",
      "duration_ms": 0.21275600000080885,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-NOTIF-007 — Bell icon shows unread badge (smoke)"
    },
    {
      "id": "FE-NOTIF-008",
      "description": "Relative timestamps update (smoke)",
      "status": "PASS",
      "duration_ms": 0.1870679999992717,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-NOTIF-008 — Relative timestamps update (smoke)"
    },
    {
      "id": "FE-HELP-001",
      "description": "/help renders FAQ section (dev-only on staging)",
      "status": "FAIL",
      "duration_ms": 60328.15953600001,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-HELP-001 — /help renders FAQ section (dev-only on staging)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m55s\",\"retry_after_seconds\":655,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-HELP-002",
      "description": "Search articles input filters FAQ",
      "status": "PASS",
      "duration_ms": 0.8006610000011278,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-HELP-002 — Search articles input filters FAQ"
    },
    {
      "id": "FE-HELP-003",
      "description": "Help category cards render",
      "status": "PASS",
      "duration_ms": 0.4247990000003483,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-HELP-003 — Help category cards render"
    },
    {
      "id": "FE-HELP-004",
      "description": "Contact Support button opens email/chat",
      "status": "PASS",
      "duration_ms": 0.41796800000884105,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-HELP-004 — Contact Support button opens email/chat"
    },
    {
      "id": "FE-HELP-005",
      "description": "/getting-started checklist progress bar updates",
      "status": "FAIL",
      "duration_ms": 60149.85827900001,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-HELP-005 — /getting-started checklist progress bar updates",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m55s\",\"retry_after_seconds\":595,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-HELP-006",
      "description": "Watch Video opens modal",
      "status": "PASS",
      "duration_ms": 0.5800599999784026,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-HELP-006 — Watch Video opens modal"
    },
    {
      "id": "FE-HELP-007",
      "description": "Add Signature redirects to email signature settings",
      "status": "PASS",
      "duration_ms": 0.26582599998801015,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-HELP-007 — Add Signature redirects to email signature settings"
    },
    {
      "id": "FE-HELP-008",
      "description": "Start Guided Walkthrough triggers tour",
      "status": "PASS",
      "duration_ms": 0.37087099999189377,
      "file_path": "/app/runner/tests/notifications/fe-notifications.test.ts",
      "test_path": "tests/notifications/fe-notifications.test.ts > Notifications + Help (FE-NOTIF / FE-HELP) > FE-HELP-008 — Start Guided Walkthrough triggers tour"
    },
    {
      "id": "FE-EMAIL-IN-012",
      "description": "bounce-webhook endpoint requires internal-services auth",
      "status": "PASS",
      "duration_ms": 104.75931000000014,
      "file_path": "/app/runner/tests/email/fe-email-in-bounce.test.ts",
      "test_path": "tests/email/fe-email-in-bounce.test.ts > Email bounce debounce (FE-EMAIL-IN) > FE-EMAIL-IN-012 — bounce-webhook endpoint requires internal-services auth"
    },
    {
      "id": "FE-EMAIL-IN-013",
      "description": "duplicate bounces within debounce window are absorbed (smoke)",
      "status": "PASS",
      "duration_ms": 22.563331999999946,
      "file_path": "/app/runner/tests/email/fe-email-in-bounce.test.ts",
      "test_path": "tests/email/fe-email-in-bounce.test.ts > Email bounce debounce (FE-EMAIL-IN) > FE-EMAIL-IN-013 — duplicate bounces within debounce window are absorbed (smoke)"
    },
    {
      "id": "FE-EMAIL-IN-014",
      "description": "bounced address propagates to the blocklist (smoke)",
      "status": "PASS",
      "duration_ms": 0.2960010000001603,
      "file_path": "/app/runner/tests/email/fe-email-in-bounce.test.ts",
      "test_path": "tests/email/fe-email-in-bounce.test.ts > Email bounce debounce (FE-EMAIL-IN) > FE-EMAIL-IN-014 — bounced address propagates to the blocklist (smoke)"
    },
    {
      "id": "FE-EMAIL-IN-001",
      "description": "Reply appears in FE thread within ~30s (smoke)",
      "status": "PASS",
      "duration_ms": 2.279019000000062,
      "file_path": "/app/runner/tests/email/fe-email-in.test.ts",
      "test_path": "tests/email/fe-email-in.test.ts > Inbound Email + Sentiment (FE-EMAIL-IN) > FE-EMAIL-IN-001 — Reply appears in FE thread within ~30s (smoke)"
    },
    {
      "id": "FE-EMAIL-IN-002",
      "description": "email row has sentiment after scoring (smoke)",
      "status": "PASS",
      "duration_ms": 0.49348799999984294,
      "file_path": "/app/runner/tests/email/fe-email-in.test.ts",
      "test_path": "tests/email/fe-email-in.test.ts > Inbound Email + Sentiment (FE-EMAIL-IN) > FE-EMAIL-IN-002 — email row has sentiment after scoring (smoke)"
    },
    {
      "id": "FE-EMAIL-IN-003",
      "description": "'unsubscribe' triggers NEGATIVE heuristic + deal-loss (smoke)",
      "status": "PASS",
      "duration_ms": 0.42952900000000227,
      "file_path": "/app/runner/tests/email/fe-email-in.test.ts",
      "test_path": "tests/email/fe-email-in.test.ts > Inbound Email + Sentiment (FE-EMAIL-IN) > FE-EMAIL-IN-003 — 'unsubscribe' triggers NEGATIVE heuristic + deal-loss (smoke)"
    },
    {
      "id": "FE-EMAIL-IN-004",
      "description": "OOO autoresponder → NEUTRAL + date extraction (smoke)",
      "status": "PASS",
      "duration_ms": 0.4036909999999807,
      "file_path": "/app/runner/tests/email/fe-email-in.test.ts",
      "test_path": "tests/email/fe-email-in.test.ts > Inbound Email + Sentiment (FE-EMAIL-IN) > FE-EMAIL-IN-004 — OOO autoresponder → NEUTRAL + date extraction (smoke)"
    },
    {
      "id": "FE-EMAIL-IN-005",
      "description": "Self-reply skips sentiment (smoke)",
      "status": "PASS",
      "duration_ms": 0.3500099999998838,
      "file_path": "/app/runner/tests/email/fe-email-in.test.ts",
      "test_path": "tests/email/fe-email-in.test.ts > Inbound Email + Sentiment (FE-EMAIL-IN) > FE-EMAIL-IN-005 — Self-reply skips sentiment (smoke)"
    },
    {
      "id": "FE-EMAIL-IN-006",
      "description": "Inbound XSS subject escapes on render (smoke)",
      "status": "PASS",
      "duration_ms": 0.4008360000000266,
      "file_path": "/app/runner/tests/email/fe-email-in.test.ts",
      "test_path": "tests/email/fe-email-in.test.ts > Inbound Email + Sentiment (FE-EMAIL-IN) > FE-EMAIL-IN-006 — Inbound XSS subject escapes on render (smoke)"
    },
    {
      "id": "FE-EMAIL-IN-007",
      "description": "Bounce notification flags original send (smoke)",
      "status": "PASS",
      "duration_ms": 0.48748700000010103,
      "file_path": "/app/runner/tests/email/fe-email-in.test.ts",
      "test_path": "tests/email/fe-email-in.test.ts > Inbound Email + Sentiment (FE-EMAIL-IN) > FE-EMAIL-IN-007 — Bounce notification flags original send (smoke)"
    },
    {
      "id": "FE-EMAIL-IN-008",
      "description": "POST /v1/emails/sentiment-webhook from public internet — must return 401/403/404",
      "status": "PASS",
      "duration_ms": 81.66220699999985,
      "file_path": "/app/runner/tests/email/fe-email-in.test.ts",
      "test_path": "tests/email/fe-email-in.test.ts > Inbound Email + Sentiment (FE-EMAIL-IN) > FE-EMAIL-IN-008 — POST /v1/emails/sentiment-webhook from public internet — must return 401/403/404"
    },
    {
      "id": "FE-EMAIL-IN-009",
      "description": "Mark inbound email Read/Unread/Favourite/Archive (smoke)",
      "status": "PASS",
      "duration_ms": 0.38555700000006254,
      "file_path": "/app/runner/tests/email/fe-email-in.test.ts",
      "test_path": "tests/email/fe-email-in.test.ts > Inbound Email + Sentiment (FE-EMAIL-IN) > FE-EMAIL-IN-009 — Mark inbound email Read/Unread/Favourite/Archive (smoke)"
    },
    {
      "id": "FE-EMAIL-IN-010",
      "description": "Conversation history merges sent + received chronologically (smoke)",
      "status": "PASS",
      "duration_ms": 0.34859800000003816,
      "file_path": "/app/runner/tests/email/fe-email-in.test.ts",
      "test_path": "tests/email/fe-email-in.test.ts > Inbound Email + Sentiment (FE-EMAIL-IN) > FE-EMAIL-IN-010 — Conversation history merges sent + received chronologically (smoke)"
    },
    {
      "id": "FE-EMAIL-IN-011",
      "description": "Cross-tenant email isolation (smoke)",
      "status": "PASS",
      "duration_ms": 0.33078599999998914,
      "file_path": "/app/runner/tests/email/fe-email-in.test.ts",
      "test_path": "tests/email/fe-email-in.test.ts > Inbound Email + Sentiment (FE-EMAIL-IN) > FE-EMAIL-IN-011 — Cross-tenant email isolation (smoke)"
    },
    {
      "id": "FE-EMAIL-OUT-013",
      "description": "POST /v1/templates/render endpoint exists on email-ingress",
      "status": "PASS",
      "duration_ms": 224.11579700000016,
      "file_path": "/app/runner/tests/email/fe-email-out-render.test.ts",
      "test_path": "tests/email/fe-email-out-render.test.ts > Email template render preview (FE-EMAIL-OUT) > FE-EMAIL-OUT-013 — POST /v1/templates/render endpoint exists on email-ingress"
    },
    {
      "id": "FE-EMAIL-OUT-014",
      "description": "invalid deal_id is rejected (no panic)",
      "status": "PASS",
      "duration_ms": 47.362288000000035,
      "file_path": "/app/runner/tests/email/fe-email-out-render.test.ts",
      "test_path": "tests/email/fe-email-out-render.test.ts > Email template render preview (FE-EMAIL-OUT) > FE-EMAIL-OUT-014 — invalid deal_id is rejected (no panic)"
    },
    {
      "id": "FE-EMAIL-OUT-015",
      "description": "missing required field returns 400",
      "status": "PASS",
      "duration_ms": 16.34056799999985,
      "file_path": "/app/runner/tests/email/fe-email-out-render.test.ts",
      "test_path": "tests/email/fe-email-out-render.test.ts > Email template render preview (FE-EMAIL-OUT) > FE-EMAIL-OUT-015 — missing required field returns 400"
    },
    {
      "id": "FE-EMAIL-OUT-001",
      "description": "Connect Gmail mailbox via OAuth (external-blocked) — assert URL request returns redirect URL",
      "status": "FAIL",
      "duration_ms": 60592.129112,
      "file_path": "/app/runner/tests/email/fe-email-out.test.ts",
      "test_path": "tests/email/fe-email-out.test.ts > Outbound Email (FE-EMAIL-OUT) > FE-EMAIL-OUT-001 — Connect Gmail mailbox via OAuth (external-blocked) — assert URL request returns redirect URL",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 1m7s\",\"retry_after_seconds\":67,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-EMAIL-OUT-002",
      "description": "Connect Microsoft mailbox same flow (external-blocked)",
      "status": "FAIL",
      "duration_ms": 60205.54221000001,
      "file_path": "/app/runner/tests/email/fe-email-out.test.ts",
      "test_path": "tests/email/fe-email-out.test.ts > Outbound Email (FE-EMAIL-OUT) > FE-EMAIL-OUT-002 — Connect Microsoft mailbox same flow (external-blocked)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7s\",\"retry_after_seconds\":7,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-EMAIL-OUT-003",
      "description": "Disconnect mailbox via POST /v1/user-mailboxes/:id/disconnect (smoke)",
      "status": "PASS",
      "duration_ms": 2.8871429999999236,
      "file_path": "/app/runner/tests/email/fe-email-out.test.ts",
      "test_path": "tests/email/fe-email-out.test.ts > Outbound Email (FE-EMAIL-OUT) > FE-EMAIL-OUT-003 — Disconnect mailbox via POST /v1/user-mailboxes/:id/disconnect (smoke)"
    },
    {
      "id": "FE-EMAIL-OUT-004",
      "description": "Test Email (rate-limited 5/hr) endpoint exists",
      "status": "FAIL",
      "duration_ms": 39516.863651999985,
      "file_path": "/app/runner/tests/email/fe-email-out.test.ts",
      "test_path": "tests/email/fe-email-out.test.ts > Outbound Email (FE-EMAIL-OUT) > FE-EMAIL-OUT-004 — Test Email (rate-limited 5/hr) endpoint exists",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-EMAIL-OUT-005",
      "description": "Test-Email button disabled when ai_personalization_enabled=false (FE check)",
      "status": "PASS",
      "duration_ms": 0.5346039999858476,
      "file_path": "/app/runner/tests/email/fe-email-out.test.ts",
      "test_path": "tests/email/fe-email-out.test.ts > Outbound Email (FE-EMAIL-OUT) > FE-EMAIL-OUT-005 — Test-Email button disabled when ai_personalization_enabled=false (FE check)"
    },
    {
      "id": "FE-EMAIL-OUT-006",
      "description": "6 test emails in 1 hour → 429",
      "status": "PASS",
      "duration_ms": 0.35130300000309944,
      "file_path": "/app/runner/tests/email/fe-email-out.test.ts",
      "test_path": "tests/email/fe-email-out.test.ts > Outbound Email (FE-EMAIL-OUT) > FE-EMAIL-OUT-006 — 6 test emails in 1 hour → 429"
    },
    {
      "id": "FE-EMAIL-OUT-007",
      "description": "Send manual email with merge tags (composer renders)",
      "status": "FAIL",
      "duration_ms": 30513.675977000006,
      "file_path": "/app/runner/tests/email/fe-email-out.test.ts",
      "test_path": "tests/email/fe-email-out.test.ts > Outbound Email (FE-EMAIL-OUT) > FE-EMAIL-OUT-007 — Send manual email with merge tags (composer renders)",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-EMAIL-OUT-008",
      "description": "Manual email to deal contact creates sent_email row (smoke)",
      "status": "PASS",
      "duration_ms": 0.669724999985192,
      "file_path": "/app/runner/tests/email/fe-email-out.test.ts",
      "test_path": "tests/email/fe-email-out.test.ts > Outbound Email (FE-EMAIL-OUT) > FE-EMAIL-OUT-008 — Manual email to deal contact creates sent_email row (smoke)"
    },
    {
      "id": "FE-EMAIL-OUT-009",
      "description": "Email signature appended to outbound (smoke)",
      "status": "PASS",
      "duration_ms": 0.5867009999928996,
      "file_path": "/app/runner/tests/email/fe-email-out.test.ts",
      "test_path": "tests/email/fe-email-out.test.ts > Outbound Email (FE-EMAIL-OUT) > FE-EMAIL-OUT-009 — Email signature appended to outbound (smoke)"
    },
    {
      "id": "FE-EMAIL-OUT-010",
      "description": "Empty subject → form validation rejects",
      "status": "FAIL",
      "duration_ms": 60159.36471600001,
      "file_path": "/app/runner/tests/email/fe-email-out.test.ts",
      "test_path": "tests/email/fe-email-out.test.ts > Outbound Email (FE-EMAIL-OUT) > FE-EMAIL-OUT-010 — Empty subject → form validation rejects",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m58s\",\"retry_after_seconds\":778,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-EMAIL-OUT-011",
      "description": "Long body (>50 KB) handled (smoke — no 500)",
      "status": "PASS",
      "duration_ms": 0.9842200000130106,
      "file_path": "/app/runner/tests/email/fe-email-out.test.ts",
      "test_path": "tests/email/fe-email-out.test.ts > Outbound Email (FE-EMAIL-OUT) > FE-EMAIL-OUT-011 — Long body (>50 KB) handled (smoke — no 500)"
    },
    {
      "id": "FE-EMAIL-OUT-012",
      "description": "XSS in subject + body sanitised (smoke — no script execution)",
      "status": "PASS",
      "duration_ms": 0.43723299997509457,
      "file_path": "/app/runner/tests/email/fe-email-out.test.ts",
      "test_path": "tests/email/fe-email-out.test.ts > Outbound Email (FE-EMAIL-OUT) > FE-EMAIL-OUT-012 — XSS in subject + body sanitised (smoke — no script execution)"
    },
    {
      "id": "FE-EMAIL-001",
      "description": "/email-system/email lists messages or empty state",
      "status": "FAIL",
      "duration_ms": 60577.548705,
      "file_path": "/app/runner/tests/email/fe-email.test.ts",
      "test_path": "tests/email/fe-email.test.ts > Email System (FE-EMAIL) > FE-EMAIL-001 — /email-system/email lists messages or empty state",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m25s\",\"retry_after_seconds\":565,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-EMAIL-002",
      "description": "'Mailbox not connected' empty state with Connect Mailbox CTA",
      "status": "FAIL",
      "duration_ms": 60228.757472000005,
      "file_path": "/app/runner/tests/email/fe-email.test.ts",
      "test_path": "tests/email/fe-email.test.ts > Email System (FE-EMAIL) > FE-EMAIL-002 — 'Mailbox not connected' empty state with Connect Mailbox CTA",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m24s\",\"retry_after_seconds\":504,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-EMAIL-003",
      "description": "Connect Mailbox button opens OAuth flow (button presence)",
      "status": "FAIL",
      "duration_ms": 60149.70712600001,
      "file_path": "/app/runner/tests/email/fe-email.test.ts",
      "test_path": "tests/email/fe-email.test.ts > Email System (FE-EMAIL) > FE-EMAIL-003 — Connect Mailbox button opens OAuth flow (button presence)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 7m24s\",\"retry_after_seconds\":444,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-EMAIL-004",
      "description": "Email filters work (filter UI exists)",
      "status": "FAIL",
      "duration_ms": 60175.373077999975,
      "file_path": "/app/runner/tests/email/fe-email.test.ts",
      "test_path": "tests/email/fe-email.test.ts > Email System (FE-EMAIL) > FE-EMAIL-004 — Email filters work (filter UI exists)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 6m24s\",\"retry_after_seconds\":384,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-EMAIL-005",
      "description": "Search Emails input filters list",
      "status": "FAIL",
      "duration_ms": 60221.191974999994,
      "file_path": "/app/runner/tests/email/fe-email.test.ts",
      "test_path": "tests/email/fe-email.test.ts > Email System (FE-EMAIL) > FE-EMAIL-005 — Search Emails input filters list",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 5m24s\",\"retry_after_seconds\":324,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-EMAIL-006",
      "description": "'+' button opens compose / add modal",
      "status": "FAIL",
      "duration_ms": 60193.07373800001,
      "file_path": "/app/runner/tests/email/fe-email.test.ts",
      "test_path": "tests/email/fe-email.test.ts > Email System (FE-EMAIL) > FE-EMAIL-006 — '+' button opens compose / add modal",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 4m24s\",\"retry_after_seconds\":264,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-EMAIL-007",
      "description": "/email-system/email/add page renders without crashing",
      "status": "FAIL",
      "duration_ms": 60138.20608500001,
      "file_path": "/app/runner/tests/email/fe-email.test.ts",
      "test_path": "tests/email/fe-email.test.ts > Email System (FE-EMAIL) > FE-EMAIL-007 — /email-system/email/add page renders without crashing",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 3m24s\",\"retry_after_seconds\":204,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-EMAIL-008",
      "description": "Compose form requires recipient + subject + body",
      "status": "FAIL",
      "duration_ms": 60157.866183999984,
      "file_path": "/app/runner/tests/email/fe-email.test.ts",
      "test_path": "tests/email/fe-email.test.ts > Email System (FE-EMAIL) > FE-EMAIL-008 — Compose form requires recipient + subject + body",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 2m23s\",\"retry_after_seconds\":143,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-EMAIL-009",
      "description": "Send email triggers BFF call (network observation)",
      "status": "PASS",
      "duration_ms": 5.447680000041146,
      "file_path": "/app/runner/tests/email/fe-email.test.ts",
      "test_path": "tests/email/fe-email.test.ts > Email System (FE-EMAIL) > FE-EMAIL-009 — Send email triggers BFF call (network observation)"
    },
    {
      "id": "FE-EMAIL-010",
      "description": "/email-system/email/[id] shows email detail (route accessible)",
      "status": "FAIL",
      "duration_ms": 61224.08322599996,
      "file_path": "/app/runner/tests/email/fe-email.test.ts",
      "test_path": "tests/email/fe-email.test.ts > Email System (FE-EMAIL) > FE-EMAIL-010 — /email-system/email/[id] shows email detail (route accessible)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 1m23s\",\"retry_after_seconds\":83,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-EMAIL-011",
      "description": "Email categories sidebar navigates",
      "status": "FAIL",
      "duration_ms": 60288.16415999993,
      "file_path": "/app/runner/tests/email/fe-email.test.ts",
      "test_path": "tests/email/fe-email.test.ts > Email System (FE-EMAIL) > FE-EMAIL-011 — Email categories sidebar navigates",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 22s\",\"retry_after_seconds\":22,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-EMAIL-012",
      "description": "Pagination at top right (X of Y) updates with results",
      "status": "PASS",
      "duration_ms": 1.4110510000027716,
      "file_path": "/app/runner/tests/email/fe-email.test.ts",
      "test_path": "tests/email/fe-email.test.ts > Email System (FE-EMAIL) > FE-EMAIL-012 — Pagination at top right (X of Y) updates with results"
    },
    {
      "id": "FE-SEC-001",
      "description": "Direct API call to BFF without token → 401",
      "status": "PASS",
      "duration_ms": 127.223434,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-001 — Direct API call to BFF without token → 401"
    },
    {
      "id": "FE-SEC-002",
      "description": "Manipulated JWT → 401, FE redirects to login",
      "status": "PASS",
      "duration_ms": 9.523049000000128,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-002 — Manipulated JWT → 401, FE redirects to login"
    },
    {
      "id": "FE-SEC-003",
      "description": "XSS via campaign name escaped on render (smoke)",
      "status": "PASS",
      "duration_ms": 0.7263560000001235,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-003 — XSS via campaign name escaped on render (smoke)"
    },
    {
      "id": "FE-SEC-004",
      "description": "XSS via email signature escaped (smoke)",
      "status": "PASS",
      "duration_ms": 0.38525799999979427,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-004 — XSS via email signature escaped (smoke)"
    },
    {
      "id": "FE-SEC-005",
      "description": "XSS via business profile description escaped (smoke)",
      "status": "PASS",
      "duration_ms": 0.3533899999999903,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-005 — XSS via business profile description escaped (smoke)"
    },
    {
      "id": "FE-SEC-006",
      "description": "SQL injection via search inputs safe (smoke — Prisma parameterised)",
      "status": "PASS",
      "duration_ms": 0.6146779999999126,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-006 — SQL injection via search inputs safe (smoke — Prisma parameterised)"
    },
    {
      "id": "FE-SEC-007",
      "description": "Direct nav to /admin/* as non-admin blocked",
      "status": "FAIL",
      "duration_ms": 30425.912129,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-007 — Direct nav to /admin/* as non-admin blocked",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-SEC-008",
      "description": "IDOR /automation-campaign/[id] foreign id → 403/404 (smoke)",
      "status": "PASS",
      "duration_ms": 0.7006280000023253,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-008 — IDOR /automation-campaign/[id] foreign id → 403/404 (smoke)"
    },
    {
      "id": "FE-SEC-009",
      "description": "IDOR /admin/billing/clients/[id] foreign id → 403/404 (smoke)",
      "status": "PASS",
      "duration_ms": 0.4180999999989581,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-009 — IDOR /admin/billing/clients/[id] foreign id → 403/404 (smoke)"
    },
    {
      "id": "FE-SEC-010",
      "description": "File upload wrong type rejected (smoke)",
      "status": "PASS",
      "duration_ms": 1.6544390000017302,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-010 — File upload wrong type rejected (smoke)"
    },
    {
      "id": "FE-SEC-011",
      "description": "File upload oversized rejected (smoke)",
      "status": "PASS",
      "duration_ms": 1.3325569999979052,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-011 — File upload oversized rejected (smoke)"
    },
    {
      "id": "FE-SEC-012",
      "description": "File upload uses staging cloud-documents URL (regression)",
      "status": "PASS",
      "duration_ms": 0.4641059999994468,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-012 — File upload uses staging cloud-documents URL (regression)"
    },
    {
      "id": "FE-SEC-013",
      "description": "CSP blocks third-party scripts not in allowlist (smoke)",
      "status": "PASS",
      "duration_ms": 0.34263999999893713,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-013 — CSP blocks third-party scripts not in allowlist (smoke)"
    },
    {
      "id": "FE-SEC-014",
      "description": "Frames-ancestors blocks iframe embedding (smoke)",
      "status": "FAIL",
      "duration_ms": 30141.644894999998,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-014 — Frames-ancestors blocks iframe embedding (smoke)",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/login\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-SEC-015",
      "description": "Logout invalidates session token (smoke)",
      "status": "PASS",
      "duration_ms": 0.23972800000046846,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Security (FE-SEC) > FE-SEC-015 — Logout invalidates session token (smoke)"
    },
    {
      "id": "FE-ROLE-001",
      "description": "MEMBER login lands on dashboard",
      "status": "FAIL",
      "duration_ms": 30557.582557999995,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Multi-role enforcement (FE-ROLE) > FE-ROLE-001 — MEMBER login lands on dashboard",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-ROLE-002",
      "description": "MEMBER /admin/dashboard redirected or 403",
      "status": "FAIL",
      "duration_ms": 30329.216512,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Multi-role enforcement (FE-ROLE) > FE-ROLE-002 — MEMBER /admin/dashboard redirected or 403",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-ROLE-003",
      "description": "MEMBER PUT /v1/admin/plans/:id → 403 (smoke)",
      "status": "PASS",
      "duration_ms": 2.7876150000083726,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Multi-role enforcement (FE-ROLE) > FE-ROLE-003 — MEMBER PUT /v1/admin/plans/:id → 403 (smoke)"
    },
    {
      "id": "FE-ROLE-004",
      "description": "MEMBER scoped to own account_id (smoke)",
      "status": "PASS",
      "duration_ms": 0.23162199999205768,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Multi-role enforcement (FE-ROLE) > FE-ROLE-004 — MEMBER scoped to own account_id (smoke)"
    },
    {
      "id": "FE-ROLE-005",
      "description": "MEMBER admin-only actions hidden from UI (smoke)",
      "status": "PASS",
      "duration_ms": 1.1566290000046138,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Multi-role enforcement (FE-ROLE) > FE-ROLE-005 — MEMBER admin-only actions hidden from UI (smoke)"
    },
    {
      "id": "FE-ROLE-006",
      "description": "MEMBER edits own profile, can't delete account (smoke)",
      "status": "PASS",
      "duration_ms": 0.2084690000046976,
      "file_path": "/app/runner/tests/security/fe-sec-role.test.ts",
      "test_path": "tests/security/fe-sec-role.test.ts > Multi-role enforcement (FE-ROLE) > FE-ROLE-006 — MEMBER edits own profile, can't delete account (smoke)"
    },
    {
      "id": "UNKNOWN-y51ljy",
      "description": "WEBHOOK-AUTH-001 — email-ingress sentiment-webhook rejects without auth",
      "status": "PASS",
      "duration_ms": 127.97908700000005,
      "file_path": "/app/runner/tests/security/fe-webhook-auth.test.ts",
      "test_path": "tests/security/fe-webhook-auth.test.ts > Internal-services webhook auth (cross-service) > WEBHOOK-AUTH-001 — email-ingress sentiment-webhook rejects without auth"
    },
    {
      "id": "UNKNOWN-zw91bl",
      "description": "WEBHOOK-AUTH-002 — sms-service sentiment-webhook rejects without auth",
      "status": "PASS",
      "duration_ms": 56.44483600000001,
      "file_path": "/app/runner/tests/security/fe-webhook-auth.test.ts",
      "test_path": "tests/security/fe-webhook-auth.test.ts > Internal-services webhook auth (cross-service) > WEBHOOK-AUTH-002 — sms-service sentiment-webhook rejects without auth"
    },
    {
      "id": "UNKNOWN-928i4o",
      "description": "WEBHOOK-AUTH-003 — deal-mover sweeper rejects without auth",
      "status": "PASS",
      "duration_ms": 45.924375000000055,
      "file_path": "/app/runner/tests/security/fe-webhook-auth.test.ts",
      "test_path": "tests/security/fe-webhook-auth.test.ts > Internal-services webhook auth (cross-service) > WEBHOOK-AUTH-003 — deal-mover sweeper rejects without auth"
    },
    {
      "id": "FE-SEAT-001",
      "description": "Sub-User Invite form requires valid email + role",
      "status": "FAIL",
      "duration_ms": 32118.422174,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Sub-user invite (FE-SEAT) > FE-SEAT-001 — Sub-User Invite form requires valid email + role",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-SEAT-002",
      "description": "Invite creates pending seat row (smoke)",
      "status": "PASS",
      "duration_ms": 1.404090999996697,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Sub-user invite (FE-SEAT) > FE-SEAT-002 — Invite creates pending seat row (smoke)"
    },
    {
      "id": "FE-SEAT-003",
      "description": "Recipient receives /invite/[id] email (smoke)",
      "status": "PASS",
      "duration_ms": 0.4765399999960209,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Sub-user invite (FE-SEAT) > FE-SEAT-003 — Recipient receives /invite/[id] email (smoke)"
    },
    {
      "id": "FE-SEAT-004",
      "description": "/invite/[id] shows account + inviter + Accept",
      "status": "FAIL",
      "duration_ms": 30654.825228,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Sub-user invite (FE-SEAT) > FE-SEAT-004 — /invite/[id] shows account + inviter + Accept",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-SEAT-005",
      "description": "Accept invite from new email creates account (smoke)",
      "status": "PASS",
      "duration_ms": 0.5927870000014082,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Sub-user invite (FE-SEAT) > FE-SEAT-005 — Accept invite from new email creates account (smoke)"
    },
    {
      "id": "FE-SEAT-006",
      "description": "Reuse accepted invite shows already-accepted (smoke)",
      "status": "PASS",
      "duration_ms": 0.34083600000303704,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Sub-user invite (FE-SEAT) > FE-SEAT-006 — Reuse accepted invite shows already-accepted (smoke)"
    },
    {
      "id": "FE-SEAT-007",
      "description": "Expired invite shows expired-link (smoke)",
      "status": "PASS",
      "duration_ms": 0.4402330000011716,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Sub-user invite (FE-SEAT) > FE-SEAT-007 — Expired invite shows expired-link (smoke)"
    },
    {
      "id": "FE-SEAT-008",
      "description": "Admin revokes seat → MEMBER session invalidated (smoke)",
      "status": "PASS",
      "duration_ms": 0.36722500000178115,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Sub-user invite (FE-SEAT) > FE-SEAT-008 — Admin revokes seat → MEMBER session invalidated (smoke)"
    },
    {
      "id": "FE-SEAT-009",
      "description": "GET /v1/user/seats returns seat count",
      "status": "FAIL",
      "duration_ms": 30480.201694000003,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Sub-user invite (FE-SEAT) > FE-SEAT-009 — GET /v1/user/seats returns seat count",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-AH-001",
      "description": "PUT /v1/active-hours/:id saves schedule (smoke)",
      "status": "PASS",
      "duration_ms": 0.7829029999993509,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Active hours (FE-AH) > FE-AH-001 — PUT /v1/active-hours/:id saves schedule (smoke)"
    },
    {
      "id": "FE-AH-002",
      "description": "Stage actions defer outside active window (smoke)",
      "status": "PASS",
      "duration_ms": 0.3264789999957429,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Active hours (FE-AH) > FE-AH-002 — Stage actions defer outside active window (smoke)"
    },
    {
      "id": "FE-AH-003",
      "description": "Saturday outside window → defer to Monday (smoke)",
      "status": "PASS",
      "duration_ms": 0.5175370000069961,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Active hours (FE-AH) > FE-AH-003 — Saturday outside window → defer to Monday (smoke)"
    },
    {
      "id": "FE-AH-004",
      "description": "PUT /v1/active-hours-preferences globally disables (smoke)",
      "status": "PASS",
      "duration_ms": 0.34352099998795893,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Active hours (FE-AH) > FE-AH-004 — PUT /v1/active-hours-preferences globally disables (smoke)"
    },
    {
      "id": "FE-SIG-001",
      "description": "Save email signature persists across reload (smoke)",
      "status": "PASS",
      "duration_ms": 0.2507179999956861,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Signature + booking link (FE-SIG) > FE-SIG-001 — Save email signature persists across reload (smoke)"
    },
    {
      "id": "FE-SIG-002",
      "description": "Outbound email shows signature appended (smoke)",
      "status": "PASS",
      "duration_ms": 0.18137900000147056,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Signature + booking link (FE-SIG) > FE-SIG-002 — Outbound email shows signature appended (smoke)"
    },
    {
      "id": "FE-SIG-003",
      "description": "Save booking link persists (smoke)",
      "status": "PASS",
      "duration_ms": 0.24623999999312218,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Signature + booking link (FE-SIG) > FE-SIG-003 — Save booking link persists (smoke)"
    },
    {
      "id": "FE-SIG-004",
      "description": "{{sender_booking_link}} merge tag rendered (smoke)",
      "status": "PASS",
      "duration_ms": 0.18796200001088437,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Signature + booking link (FE-SIG) > FE-SIG-004 — {{sender_booking_link}} merge tag rendered (smoke)"
    },
    {
      "id": "FE-SIG-005",
      "description": "Empty signature → no trailing artifact (smoke)",
      "status": "PASS",
      "duration_ms": 3.170910000000731,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Signature + booking link (FE-SIG) > FE-SIG-005 — Empty signature → no trailing artifact (smoke)"
    },
    {
      "id": "FE-MISC-001",
      "description": "Wrong current password → friendly error not 500 (smoke)",
      "status": "PASS",
      "duration_ms": 0.8110639999940759,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Misc settings (FE-MISC) > FE-MISC-001 — Wrong current password → friendly error not 500 (smoke)"
    },
    {
      "id": "FE-MISC-002",
      "description": "Same-as-old password blocked (smoke)",
      "status": "PASS",
      "duration_ms": 1.0107459999999264,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Misc settings (FE-MISC) > FE-MISC-002 — Same-as-old password blocked (smoke)"
    },
    {
      "id": "FE-MISC-003",
      "description": "Password change success → next login uses new (smoke)",
      "status": "PASS",
      "duration_ms": 0.27501399999891873,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Misc settings (FE-MISC) > FE-MISC-003 — Password change success → next login uses new (smoke)"
    },
    {
      "id": "FE-MISC-004",
      "description": "Driver License upload accepts JPG/PNG/PDF (smoke)",
      "status": "PASS",
      "duration_ms": 0.28655499999877065,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Misc settings (FE-MISC) > FE-MISC-004 — Driver License upload accepts JPG/PNG/PDF (smoke)"
    },
    {
      "id": "FE-MISC-005",
      "description": "Driver License rejects >5 MB (smoke)",
      "status": "PASS",
      "duration_ms": 0.35261799998988863,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Misc settings (FE-MISC) > FE-MISC-005 — Driver License rejects >5 MB (smoke)"
    },
    {
      "id": "FE-MISC-006",
      "description": "GET /v1/user/driver-license returns previously uploaded",
      "status": "FAIL",
      "duration_ms": 30575.703728000008,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Misc settings (FE-MISC) > FE-MISC-006 — GET /v1/user/driver-license returns previously uploaded",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-MISC-007",
      "description": "Add invalid card → friendly inline error (smoke)",
      "status": "PASS",
      "duration_ms": 0.5237480000068899,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Misc settings (FE-MISC) > FE-MISC-007 — Add invalid card → friendly inline error (smoke)"
    },
    {
      "id": "FE-MISC-008",
      "description": "Delete only payment method blocked (smoke)",
      "status": "PASS",
      "duration_ms": 0.2727199999935692,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Misc settings (FE-MISC) > FE-MISC-008 — Delete only payment method blocked (smoke)"
    },
    {
      "id": "FE-MISC-009",
      "description": "Set default payment method updates (smoke)",
      "status": "PASS",
      "duration_ms": 0.2018160000006901,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Misc settings (FE-MISC) > FE-MISC-009 — Set default payment method updates (smoke)"
    },
    {
      "id": "FE-MISC-010",
      "description": "AI Customized Templates editor saves + renders (smoke)",
      "status": "PASS",
      "duration_ms": 0.26545599999371916,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Misc settings (FE-MISC) > FE-MISC-010 — AI Customized Templates editor saves + renders (smoke)"
    },
    {
      "id": "FE-PUR-001",
      "description": "/purchase-lists renders (dev-only on staging)",
      "status": "FAIL",
      "duration_ms": 60265.978745000015,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Purchase Lists (FE-PUR) > FE-PUR-001 — /purchase-lists renders (dev-only on staging)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m28s\",\"retry_after_seconds\":748,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PUR-002",
      "description": "Search by Name filters list (smoke)",
      "status": "PASS",
      "duration_ms": 0.805724999983795,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Purchase Lists (FE-PUR) > FE-PUR-002 — Search by Name filters list (smoke)"
    },
    {
      "id": "FE-PUR-003",
      "description": "Status badges In Progress / Success render correct colors (smoke)",
      "status": "PASS",
      "duration_ms": 0.24098999999114312,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Purchase Lists (FE-PUR) > FE-PUR-003 — Status badges In Progress / Success render correct colors (smoke)"
    },
    {
      "id": "FE-PUR-004",
      "description": "Download Leads icon enabled only on Success (smoke)",
      "status": "PASS",
      "duration_ms": 0.19853099997271784,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Purchase Lists (FE-PUR) > FE-PUR-004 — Download Leads icon enabled only on Success (smoke)"
    },
    {
      "id": "FE-PUR-005",
      "description": "/purchase-lists/create renders form",
      "status": "FAIL",
      "duration_ms": 60198.826436,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Purchase Lists (FE-PUR) > FE-PUR-005 — /purchase-lists/create renders form",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m28s\",\"retry_after_seconds\":688,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PUR-006",
      "description": "Create requires name + filters (smoke)",
      "status": "PASS",
      "duration_ms": 0.4497400000109337,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Purchase Lists (FE-PUR) > FE-PUR-006 — Create requires name + filters (smoke)"
    },
    {
      "id": "FE-PUR-007",
      "description": "Pagination Rows-per-page selector (smoke)",
      "status": "PASS",
      "duration_ms": 0.34669900001608767,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Purchase Lists (FE-PUR) > FE-PUR-007 — Pagination Rows-per-page selector (smoke)"
    },
    {
      "id": "FE-PUR-008",
      "description": "Targeting eye-icon opens detail modal (smoke)",
      "status": "PASS",
      "duration_ms": 0.19037600001320243,
      "file_path": "/app/runner/tests/seats/fe-seat-ah-sig-misc.test.ts",
      "test_path": "tests/seats/fe-seat-ah-sig-misc.test.ts > Purchase Lists (FE-PUR) > FE-PUR-008 — Targeting eye-icon opens detail modal (smoke)"
    },
    {
      "id": "FE-PHONE-001",
      "description": "/phone-system redirects to /phone-system/sms",
      "status": "FAIL",
      "duration_ms": 60483.02128,
      "file_path": "/app/runner/tests/sms/fe-phone.test.ts",
      "test_path": "tests/sms/fe-phone.test.ts > Phone System (FE-PHONE) > FE-PHONE-001 — /phone-system redirects to /phone-system/sms",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m56s\",\"retry_after_seconds\":716,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PHONE-002",
      "description": "/phone-system/sms renders empty state (FE-BUG-04 fix — no permanent skeleton)",
      "status": "FAIL",
      "duration_ms": 60192.840198,
      "file_path": "/app/runner/tests/sms/fe-phone.test.ts",
      "test_path": "tests/sms/fe-phone.test.ts > Phone System (FE-PHONE) > FE-PHONE-002 — /phone-system/sms renders empty state (FE-BUG-04 fix — no permanent skeleton)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m56s\",\"retry_after_seconds\":656,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PHONE-003",
      "description": "Empty state shows 'Go to Phone System Settings' CTA (best-effort)",
      "status": "FAIL",
      "duration_ms": 60110.33511,
      "file_path": "/app/runner/tests/sms/fe-phone.test.ts",
      "test_path": "tests/sms/fe-phone.test.ts > Phone System (FE-PHONE) > FE-PHONE-003 — Empty state shows 'Go to Phone System Settings' CTA (best-effort)",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 9m55s\",\"retry_after_seconds\":595,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PHONE-004",
      "description": "/phone-system/voicemails lists voicemails or empty state",
      "status": "FAIL",
      "duration_ms": 60256.78245100001,
      "file_path": "/app/runner/tests/sms/fe-phone.test.ts",
      "test_path": "tests/sms/fe-phone.test.ts > Phone System (FE-PHONE) > FE-PHONE-004 — /phone-system/voicemails lists voicemails or empty state",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m55s\",\"retry_after_seconds\":535,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-PHONE-005",
      "description": "Brand registration flow accessible from phone system",
      "status": "PASS",
      "duration_ms": 10.74635600001784,
      "file_path": "/app/runner/tests/sms/fe-phone.test.ts",
      "test_path": "tests/sms/fe-phone.test.ts > Phone System (FE-PHONE) > FE-PHONE-005 — Brand registration flow accessible from phone system"
    },
    {
      "id": "FE-PHONE-006",
      "description": "A2P status badge displays correct color/text (smoke)",
      "status": "PASS",
      "duration_ms": 6.602750999998534,
      "file_path": "/app/runner/tests/sms/fe-phone.test.ts",
      "test_path": "tests/sms/fe-phone.test.ts > Phone System (FE-PHONE) > FE-PHONE-006 — A2P status badge displays correct color/text (smoke)"
    },
    {
      "id": "FE-PHONE-007",
      "description": "Phone Number purchase flow renders available numbers (smoke)",
      "status": "PASS",
      "duration_ms": 3.505436000006739,
      "file_path": "/app/runner/tests/sms/fe-phone.test.ts",
      "test_path": "tests/sms/fe-phone.test.ts > Phone System (FE-PHONE) > FE-PHONE-007 — Phone Number purchase flow renders available numbers (smoke)"
    },
    {
      "id": "FE-PHONE-008",
      "description": "Buy phone number button triggers purchase API call (smoke)",
      "status": "PASS",
      "duration_ms": 0.7388849999988452,
      "file_path": "/app/runner/tests/sms/fe-phone.test.ts",
      "test_path": "tests/sms/fe-phone.test.ts > Phone System (FE-PHONE) > FE-PHONE-008 — Buy phone number button triggers purchase API call (smoke)"
    },
    {
      "id": "FE-PHONE-009",
      "description": "Send SMS modal validates recipient + body (smoke)",
      "status": "PASS",
      "duration_ms": 0.42544200000702403,
      "file_path": "/app/runner/tests/sms/fe-phone.test.ts",
      "test_path": "tests/sms/fe-phone.test.ts > Phone System (FE-PHONE) > FE-PHONE-009 — Send SMS modal validates recipient + body (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-001",
      "description": "BYOC card lists Toky in /settings/system (smoke)",
      "status": "PASS",
      "duration_ms": 6.00304200000005,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-001 — BYOC card lists Toky in /settings/system (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-002",
      "description": "Save bogus Toky API key → red error (smoke)",
      "status": "PASS",
      "duration_ms": 0.6680409999999029,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-002 — Save bogus Toky API key → red error (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-003",
      "description": "Save real test API key creates carrier_credentials row (smoke)",
      "status": "PASS",
      "duration_ms": 0.9469300000000658,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-003 — Save real test API key creates carrier_credentials row (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-004",
      "description": "Save handshake registers webhook on Toky side (smoke)",
      "status": "PASS",
      "duration_ms": 0.5610619999999926,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-004 — Save handshake registers webhook on Toky side (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-005",
      "description": "Re-save credential clears existing webhook auth (smoke)",
      "status": "PASS",
      "duration_ms": 0.46449200000006385,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-005 — Re-save credential clears existing webhook auth (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-006",
      "description": "Add Toky Number lists user inventory (smoke)",
      "status": "PASS",
      "duration_ms": 0.4990580000001046,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-006 — Add Toky Number lists user inventory (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-007",
      "description": "Import test number creates phonenumbers row (smoke)",
      "status": "PASS",
      "duration_ms": 0.40571300000010524,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-007 — Import test number creates phonenumbers row (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-008",
      "description": "Send SMS via Toky doesn't decrement credits (smoke)",
      "status": "PASS",
      "duration_ms": 0.369275000000016,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-008 — Send SMS via Toky doesn't decrement credits (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-009",
      "description": "Reply lands inbound within 10s (smoke)",
      "status": "PASS",
      "duration_ms": 0.5343130000001111,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-009 — Reply lands inbound within 10s (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-010",
      "description": "Toky inbound webhook validates HTTP Basic auth",
      "status": "PASS",
      "duration_ms": 232.14563700000008,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-010 — Toky inbound webhook validates HTTP Basic auth"
    },
    {
      "id": "FE-SMS-TOKY-011",
      "description": "Toky payload is JSON array (smoke)",
      "status": "PASS",
      "duration_ms": 0.6247200000000248,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-011 — Toky payload is JSON array (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-012",
      "description": "Toky inbound NEGATIVE sentiment marks deal LOST (smoke)",
      "status": "PASS",
      "duration_ms": 0.26180599999997867,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-012 — Toky inbound NEGATIVE sentiment marks deal LOST (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-013",
      "description": "Replay same payload twice → idempotent (smoke)",
      "status": "PASS",
      "duration_ms": 0.42471900000009555,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-013 — Replay same payload twice → idempotent (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-014",
      "description": "Disconnect Toky credential revokes webhook (smoke)",
      "status": "PASS",
      "duration_ms": 0.4064849999999751,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-014 — Disconnect Toky credential revokes webhook (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-015",
      "description": "Twilio + Toky number coexistence (smoke)",
      "status": "PASS",
      "duration_ms": 0.14157199999999648,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-015 — Twilio + Toky number coexistence (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-016",
      "description": "AI personalization charges AI credits but not phone (smoke)",
      "status": "PASS",
      "duration_ms": 0.34659400000009555,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-016 — AI personalization charges AI credits but not phone (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-017",
      "description": "Twilio regression after Toky enabled (smoke)",
      "status": "PASS",
      "duration_ms": 0.3584359999999833,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-017 — Twilio regression after Toky enabled (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-018",
      "description": "Legacy provider=NULL treated as 'twilio' (smoke)",
      "status": "PASS",
      "duration_ms": 0.38308200000005854,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-018 — Legacy provider=NULL treated as 'twilio' (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-019",
      "description": "Toky API key with zero numbers → empty inventory (smoke)",
      "status": "PASS",
      "duration_ms": 0.502875000000131,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-019 — Toky API key with zero numbers → empty inventory (smoke)"
    },
    {
      "id": "FE-SMS-TOKY-020",
      "description": "Webhook dedup respects DRF pagination shape (smoke)",
      "status": "PASS",
      "duration_ms": 0.5623140000000149,
      "file_path": "/app/runner/tests/sms/fe-sms-toky.test.ts",
      "test_path": "tests/sms/fe-sms-toky.test.ts > Toky BYOC path (FE-SMS-TOKY) > FE-SMS-TOKY-020 — Webhook dedup respects DRF pagination shape (smoke)"
    },
    {
      "id": "FE-SMS-TW-001",
      "description": "A2P brand registration starts from /settings/system (smoke)",
      "status": "PASS",
      "duration_ms": 2.1581350000001294,
      "file_path": "/app/runner/tests/sms/fe-sms-tw.test.ts",
      "test_path": "tests/sms/fe-sms-tw.test.ts > Twilio SMS path (FE-SMS-TW) > FE-SMS-TW-001 — A2P brand registration starts from /settings/system (smoke)"
    },
    {
      "id": "FE-SMS-TW-002",
      "description": "Phone-number purchase blocked when A2P != brand_approved",
      "status": "PASS",
      "duration_ms": 0.5567160000000513,
      "file_path": "/app/runner/tests/sms/fe-sms-tw.test.ts",
      "test_path": "tests/sms/fe-sms-tw.test.ts > Twilio SMS path (FE-SMS-TW) > FE-SMS-TW-002 — Phone-number purchase blocked when A2P != brand_approved"
    },
    {
      "id": "FE-SMS-TW-003",
      "description": "Phone-number purchase succeeds when approved",
      "status": "PASS",
      "duration_ms": 0.35083300000019335,
      "file_path": "/app/runner/tests/sms/fe-sms-tw.test.ts",
      "test_path": "tests/sms/fe-sms-tw.test.ts > Twilio SMS path (FE-SMS-TW) > FE-SMS-TW-003 — Phone-number purchase succeeds when approved"
    },
    {
      "id": "FE-SMS-TW-004",
      "description": "Send SMS from /phone-system/sms (smoke)",
      "status": "PASS",
      "duration_ms": 0.32763900000009016,
      "file_path": "/app/runner/tests/sms/fe-sms-tw.test.ts",
      "test_path": "tests/sms/fe-sms-tw.test.ts > Twilio SMS path (FE-SMS-TW) > FE-SMS-TW-004 — Send SMS from /phone-system/sms (smoke)"
    },
    {
      "id": "FE-SMS-TW-005",
      "description": "Send SMS with merge tag rendered correctly",
      "status": "PASS",
      "duration_ms": 0.28522099999986494,
      "file_path": "/app/runner/tests/sms/fe-sms-tw.test.ts",
      "test_path": "tests/sms/fe-sms-tw.test.ts > Twilio SMS path (FE-SMS-TW) > FE-SMS-TW-005 — Send SMS with merge tag rendered correctly"
    },
    {
      "id": "FE-SMS-TW-006",
      "description": "Send SMS with no credits → 402 / out-of-credits",
      "status": "PASS",
      "duration_ms": 0.33008399999994253,
      "file_path": "/app/runner/tests/sms/fe-sms-tw.test.ts",
      "test_path": "tests/sms/fe-sms-tw.test.ts > Twilio SMS path (FE-SMS-TW) > FE-SMS-TW-006 — Send SMS with no credits → 402 / out-of-credits"
    },
    {
      "id": "FE-SMS-TW-007",
      "description": "Twilio API failure releases reserved credits",
      "status": "PASS",
      "duration_ms": 0.3971590000001015,
      "file_path": "/app/runner/tests/sms/fe-sms-tw.test.ts",
      "test_path": "tests/sms/fe-sms-tw.test.ts > Twilio SMS path (FE-SMS-TW) > FE-SMS-TW-007 — Twilio API failure releases reserved credits"
    },
    {
      "id": "FE-SMS-TW-008",
      "description": "Send SMS exceeds rate limit → 429",
      "status": "PASS",
      "duration_ms": 0.31063799999992625,
      "file_path": "/app/runner/tests/sms/fe-sms-tw.test.ts",
      "test_path": "tests/sms/fe-sms-tw.test.ts > Twilio SMS path (FE-SMS-TW) > FE-SMS-TW-008 — Send SMS exceeds rate limit → 429"
    },
    {
      "id": "FE-SMS-TW-009",
      "description": "Inbound SMS appears in FE thread (smoke)",
      "status": "PASS",
      "duration_ms": 0.2955489999999372,
      "file_path": "/app/runner/tests/sms/fe-sms-tw.test.ts",
      "test_path": "tests/sms/fe-sms-tw.test.ts > Twilio SMS path (FE-SMS-TW) > FE-SMS-TW-009 — Inbound SMS appears in FE thread (smoke)"
    },
    {
      "id": "FE-SMS-TW-010",
      "description": "Inbound negative sentiment marks deal LOST (smoke)",
      "status": "PASS",
      "duration_ms": 0.517612999999983,
      "file_path": "/app/runner/tests/sms/fe-sms-tw.test.ts",
      "test_path": "tests/sms/fe-sms-tw.test.ts > Twilio SMS path (FE-SMS-TW) > FE-SMS-TW-010 — Inbound negative sentiment marks deal LOST (smoke)"
    },
    {
      "id": "FE-SMS-TW-011",
      "description": "Twilio webhook with wrong bears_key → 401",
      "status": "PASS",
      "duration_ms": 230.9367040000002,
      "file_path": "/app/runner/tests/sms/fe-sms-tw.test.ts",
      "test_path": "tests/sms/fe-sms-tw.test.ts > Twilio SMS path (FE-SMS-TW) > FE-SMS-TW-011 — Twilio webhook with wrong bears_key → 401"
    },
    {
      "id": "FE-SMS-TW-012",
      "description": "Twilio status callback updates messages.status (smoke)",
      "status": "PASS",
      "duration_ms": 0.29465800000002673,
      "file_path": "/app/runner/tests/sms/fe-sms-tw.test.ts",
      "test_path": "tests/sms/fe-sms-tw.test.ts > Twilio SMS path (FE-SMS-TW) > FE-SMS-TW-012 — Twilio status callback updates messages.status (smoke)"
    },
    {
      "id": "FE-SET-G-016",
      "description": "/settings/general AI Chat Response tab renders",
      "status": "FAIL",
      "duration_ms": 60379.953631000004,
      "file_path": "/app/runner/tests/settings/fe-set-g-aichat.test.ts",
      "test_path": "tests/settings/fe-set-g-aichat.test.ts > AI Chat Response settings (FE-SET-G) > FE-SET-G-016 — /settings/general AI Chat Response tab renders",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 2m50s\",\"retry_after_seconds\":170,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-SET-G-017",
      "description": "Selecting a campaign reveals channel configuration toggles",
      "status": "FAIL",
      "duration_ms": 60212.403169,
      "file_path": "/app/runner/tests/settings/fe-set-g-aichat.test.ts",
      "test_path": "tests/settings/fe-set-g-aichat.test.ts > AI Chat Response settings (FE-SET-G) > FE-SET-G-017 — Selecting a campaign reveals channel configuration toggles",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 1m50s\",\"retry_after_seconds\":110,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-SET-G-018",
      "description": "AI chat config persists in LocalStorage across reload",
      "status": "FAIL",
      "duration_ms": 60192.028525,
      "file_path": "/app/runner/tests/settings/fe-set-g-aichat.test.ts",
      "test_path": "tests/settings/fe-set-g-aichat.test.ts > AI Chat Response settings (FE-SET-G) > FE-SET-G-018 — AI chat config persists in LocalStorage across reload",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 49s\",\"retry_after_seconds\":49,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-SET-G-001",
      "description": "/settings/general renders Billing section by default",
      "status": "FAIL",
      "duration_ms": 32431.032973999998,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-001 — /settings/general renders Billing section by default",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-SET-G-002",
      "description": "Right sidebar nav items show full text (fe-ui-01 regression)",
      "status": "FAIL",
      "duration_ms": 30625.652338,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-002 — Right sidebar nav items show full text (fe-ui-01 regression)",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-SET-G-003",
      "description": "Right sidebar nav items list (smoke)",
      "status": "PASS",
      "duration_ms": 1.9221989999932703,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-003 — Right sidebar nav items list (smoke)"
    },
    {
      "id": "FE-SET-G-004",
      "description": "Switching nav items updates panel without reload (smoke)",
      "status": "PASS",
      "duration_ms": 0.4842549999957555,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-004 — Switching nav items updates panel without reload (smoke)"
    },
    {
      "id": "FE-SET-G-005",
      "description": "Current Plan card shows plan name + price (smoke)",
      "status": "PASS",
      "duration_ms": 0.4440390000017942,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-005 — Current Plan card shows plan name + price (smoke)"
    },
    {
      "id": "FE-SET-G-006",
      "description": "Plan features show numbers with thousands separators (fe-ui-02 regression)",
      "status": "FAIL",
      "duration_ms": 30481.345001,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-006 — Plan features show numbers with thousands separators (fe-ui-02 regression)",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-SET-G-007",
      "description": "Promo code card shows discount + expiry + COPY (smoke)",
      "status": "PASS",
      "duration_ms": 1.275101999999606,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-007 — Promo code card shows discount + expiry + COPY (smoke)"
    },
    {
      "id": "FE-SET-G-008",
      "description": "Manage Add-ons button opens manage-plans page (smoke)",
      "status": "PASS",
      "duration_ms": 0.31090100000437815,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-008 — Manage Add-ons button opens manage-plans page (smoke)"
    },
    {
      "id": "FE-SET-G-009",
      "description": "CRM API tab shows connected CRM with masked key (smoke)",
      "status": "PASS",
      "duration_ms": 0.3430999999982305,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-009 — CRM API tab shows connected CRM with masked key (smoke)"
    },
    {
      "id": "FE-SET-G-010",
      "description": "Sub-User Management lists invited users (smoke)",
      "status": "PASS",
      "duration_ms": 0.3333320000092499,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-010 — Sub-User Management lists invited users (smoke)"
    },
    {
      "id": "FE-SET-G-011",
      "description": "Sub-User Invite form validates email (smoke)",
      "status": "PASS",
      "duration_ms": 0.26744999999937136,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-011 — Sub-User Invite form validates email (smoke)"
    },
    {
      "id": "FE-SET-G-012",
      "description": "Active Hours tab allows setting weekly schedule (smoke)",
      "status": "PASS",
      "duration_ms": 0.28393900000082795,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-012 — Active Hours tab allows setting weekly schedule (smoke)"
    },
    {
      "id": "FE-SET-G-013",
      "description": "Email Signatures tab renders editor + preview (smoke)",
      "status": "PASS",
      "duration_ms": 0.3563549999962561,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-013 — Email Signatures tab renders editor + preview (smoke)"
    },
    {
      "id": "FE-SET-G-014",
      "description": "Book Link tab persists URL (smoke)",
      "status": "PASS",
      "duration_ms": 0.332550999999512,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-014 — Book Link tab persists URL (smoke)"
    },
    {
      "id": "FE-SET-G-015",
      "description": "AI Customized Templates tab lists templates (smoke)",
      "status": "PASS",
      "duration_ms": 0.37562099999922793,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — General (FE-SET-G) > FE-SET-G-015 — AI Customized Templates tab lists templates (smoke)"
    },
    {
      "id": "FE-SET-S-001",
      "description": "/settings/system renders Brand Status + Phone Settings",
      "status": "FAIL",
      "duration_ms": 30654.653716,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — System (FE-SET-S) > FE-SET-S-001 — /settings/system renders Brand Status + Phone Settings",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-SET-S-002",
      "description": "Right sidebar Phone / Email Settings (smoke)",
      "status": "PASS",
      "duration_ms": 0.5069660000008298,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — System (FE-SET-S) > FE-SET-S-002 — Right sidebar Phone / Email Settings (smoke)"
    },
    {
      "id": "FE-SET-S-003",
      "description": "Brand Status badge color matches status (smoke)",
      "status": "PASS",
      "duration_ms": 0.28038400001241826,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — System (FE-SET-S) > FE-SET-S-003 — Brand Status badge color matches status (smoke)"
    },
    {
      "id": "FE-SET-S-004",
      "description": "Register Brand button opens modal (smoke)",
      "status": "PASS",
      "duration_ms": 0.36372900000424124,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — System (FE-SET-S) > FE-SET-S-004 — Register Brand button opens modal (smoke)"
    },
    {
      "id": "FE-SET-S-005",
      "description": "Phone Number Settings shows empty state (smoke)",
      "status": "PASS",
      "duration_ms": 0.30120200000237674,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — System (FE-SET-S) > FE-SET-S-005 — Phone Number Settings shows empty state (smoke)"
    },
    {
      "id": "FE-SET-S-006",
      "description": "Email Settings shows OAuth connection state (smoke)",
      "status": "PASS",
      "duration_ms": 0.34302100000786595,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — System (FE-SET-S) > FE-SET-S-006 — Email Settings shows OAuth connection state (smoke)"
    },
    {
      "id": "FE-SET-S-007",
      "description": "Save Route button persists route preferences (smoke)",
      "status": "PASS",
      "duration_ms": 0.2709560000075726,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — System (FE-SET-S) > FE-SET-S-007 — Save Route button persists route preferences (smoke)"
    },
    {
      "id": "FE-SET-M-001",
      "description": "/settings/manage-plans renders manage add-ons section",
      "status": "FAIL",
      "duration_ms": 60236.75935900002,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — Manage Plans (FE-SET-M) > FE-SET-M-001 — /settings/manage-plans renders manage add-ons section",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m28s\",\"retry_after_seconds\":748,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-SET-M-002",
      "description": "Existing add-ons list (smoke)",
      "status": "PASS",
      "duration_ms": 0.39438699997845106,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — Manage Plans (FE-SET-M) > FE-SET-M-002 — Existing add-ons list (smoke)"
    },
    {
      "id": "FE-SET-M-003",
      "description": "Empty state friendly message (smoke)",
      "status": "PASS",
      "duration_ms": 0.24632000000565313,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — Manage Plans (FE-SET-M) > FE-SET-M-003 — Empty state friendly message (smoke)"
    },
    {
      "id": "FE-SET-M-004",
      "description": "Available add-ons list (smoke)",
      "status": "PASS",
      "duration_ms": 0.24768199998652562,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — Manage Plans (FE-SET-M) > FE-SET-M-004 — Available add-ons list (smoke)"
    },
    {
      "id": "FE-SET-M-005",
      "description": "Add new add-on triggers checkout flow (smoke)",
      "status": "PASS",
      "duration_ms": 0.2818459999980405,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — Manage Plans (FE-SET-M) > FE-SET-M-005 — Add new add-on triggers checkout flow (smoke)"
    },
    {
      "id": "FE-SET-M-006",
      "description": "Cancel add-on triggers confirmation modal (smoke)",
      "status": "PASS",
      "duration_ms": 0.2631110000074841,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > Settings — Manage Plans (FE-SET-M) > FE-SET-M-006 — Cancel add-on triggers confirmation modal (smoke)"
    },
    {
      "id": "FE-USER-001",
      "description": "/user renders profile fields",
      "status": "FAIL",
      "duration_ms": 60215.44611600001,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > User Settings (FE-USER) > FE-USER-001 — /user renders profile fields",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m28s\",\"retry_after_seconds\":688,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-USER-002",
      "description": "Created date renders correctly (NOT 'Invalid Date')",
      "status": "FAIL",
      "duration_ms": 60190.12771900001,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > User Settings (FE-USER) > FE-USER-002 — Created date renders correctly (NOT 'Invalid Date')",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m27s\",\"retry_after_seconds\":627,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-USER-003",
      "description": "Change Password button opens modal (smoke)",
      "status": "PASS",
      "duration_ms": 1.5357180000282824,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > User Settings (FE-USER) > FE-USER-003 — Change Password button opens modal (smoke)"
    },
    {
      "id": "FE-USER-004",
      "description": "Password modal validates fields (smoke)",
      "status": "PASS",
      "duration_ms": 1.6784130000160076,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > User Settings (FE-USER) > FE-USER-004 — Password modal validates fields (smoke)"
    },
    {
      "id": "FE-USER-005",
      "description": "Wrong current password → friendly error (smoke)",
      "status": "PASS",
      "duration_ms": 0.6790780000155792,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > User Settings (FE-USER) > FE-USER-005 — Wrong current password → friendly error (smoke)"
    },
    {
      "id": "FE-USER-006",
      "description": "Password change success closes modal + toast (smoke)",
      "status": "PASS",
      "duration_ms": 0.31643000000622123,
      "file_path": "/app/runner/tests/settings/fe-settings.test.ts",
      "test_path": "tests/settings/fe-settings.test.ts > User Settings (FE-USER) > FE-USER-006 — Password change success closes modal + toast (smoke)"
    },
    {
      "id": "FE-VM-001",
      "description": "/phone-system/voicemails lists records or empty state",
      "status": "FAIL",
      "duration_ms": 60503.268832,
      "file_path": "/app/runner/tests/voicemails/fe-vm.test.ts",
      "test_path": "tests/voicemails/fe-vm.test.ts > Voicemails page (FE-VM) > FE-VM-001 — /phone-system/voicemails lists records or empty state",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 8m50s\",\"retry_after_seconds\":530,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-VM-002",
      "description": "Each row shows recipient/duration/status/timestamp (smoke)",
      "status": "PASS",
      "duration_ms": 2.8957609999997658,
      "file_path": "/app/runner/tests/voicemails/fe-vm.test.ts",
      "test_path": "tests/voicemails/fe-vm.test.ts > Voicemails page (FE-VM) > FE-VM-002 — Each row shows recipient/duration/status/timestamp (smoke)"
    },
    {
      "id": "FE-VM-003",
      "description": "Play affordance plays audio inline (smoke)",
      "status": "PASS",
      "duration_ms": 0.8998240000000806,
      "file_path": "/app/runner/tests/voicemails/fe-vm.test.ts",
      "test_path": "tests/voicemails/fe-vm.test.ts > Voicemails page (FE-VM) > FE-VM-003 — Play affordance plays audio inline (smoke)"
    },
    {
      "id": "FE-VM-004",
      "description": "Filter by status works (smoke)",
      "status": "PASS",
      "duration_ms": 0.4702760000000126,
      "file_path": "/app/runner/tests/voicemails/fe-vm.test.ts",
      "test_path": "tests/voicemails/fe-vm.test.ts > Voicemails page (FE-VM) > FE-VM-004 — Filter by status works (smoke)"
    },
    {
      "id": "FE-VM-005",
      "description": "Pagination works at boundaries (smoke)",
      "status": "PASS",
      "duration_ms": 0.38118000000395114,
      "file_path": "/app/runner/tests/voicemails/fe-vm.test.ts",
      "test_path": "tests/voicemails/fe-vm.test.ts > Voicemails page (FE-VM) > FE-VM-005 — Pagination works at boundaries (smoke)"
    },
    {
      "id": "FE-VM-006",
      "description": "Voicemail audio URL is signed/scoped (smoke)",
      "status": "PASS",
      "duration_ms": 0.4995589999962249,
      "file_path": "/app/runner/tests/voicemails/fe-vm.test.ts",
      "test_path": "tests/voicemails/fe-vm.test.ts > Voicemails page (FE-VM) > FE-VM-006 — Voicemail audio URL is signed/scoped (smoke)"
    },
    {
      "id": "FE-ACT-VM-001",
      "description": "POST /v1/stages/:id/actions/voicemail endpoint exists",
      "status": "FAIL",
      "duration_ms": 30420.345407,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Voicemail (FE-ACT-VM) > FE-ACT-VM-001 — POST /v1/stages/:id/actions/voicemail endpoint exists",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-ACT-VM-002",
      "description": "Voicemail editor accepts audio upload (smoke)",
      "status": "PASS",
      "duration_ms": 1.8637090000011085,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Voicemail (FE-ACT-VM) > FE-ACT-VM-002 — Voicemail editor accepts audio upload (smoke)"
    },
    {
      "id": "FE-ACT-VM-003",
      "description": "PUT updates voicemail action (smoke)",
      "status": "PASS",
      "duration_ms": 0.4619430000020657,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Voicemail (FE-ACT-VM) > FE-ACT-VM-003 — PUT updates voicemail action (smoke)"
    },
    {
      "id": "FE-ACT-VM-004",
      "description": "DELETE removes action (smoke)",
      "status": "PASS",
      "duration_ms": 0.36772600000040256,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Voicemail (FE-ACT-VM) > FE-ACT-VM-004 — DELETE removes action (smoke)"
    },
    {
      "id": "FE-ACT-VM-005",
      "description": "Trigger dispatches voicemail (smoke)",
      "status": "PASS",
      "duration_ms": 0.5205519999981334,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Voicemail (FE-ACT-VM) > FE-ACT-VM-005 — Trigger dispatches voicemail (smoke)"
    },
    {
      "id": "FE-ACT-VM-006",
      "description": "Reject wrong file type with friendly error (smoke)",
      "status": "PASS",
      "duration_ms": 0.44419899999775225,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Voicemail (FE-ACT-VM) > FE-ACT-VM-006 — Reject wrong file type with friendly error (smoke)"
    },
    {
      "id": "FE-ACT-VM-007",
      "description": "Reject oversized audio with friendly error (smoke)",
      "status": "PASS",
      "duration_ms": 0.36981099999684375,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Voicemail (FE-ACT-VM) > FE-ACT-VM-007 — Reject oversized audio with friendly error (smoke)"
    },
    {
      "id": "FE-ACT-AIC-001",
      "description": "POST /v1/stages/:id/actions/ai-call endpoint exists",
      "status": "FAIL",
      "duration_ms": 30706.7031,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — AI Call (FE-ACT-AIC) > FE-ACT-AIC-001 — POST /v1/stages/:id/actions/ai-call endpoint exists",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-ACT-AIC-002",
      "description": "PUT updates AI-call action (smoke)",
      "status": "PASS",
      "duration_ms": 0.7613209999981336,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — AI Call (FE-ACT-AIC) > FE-ACT-AIC-002 — PUT updates AI-call action (smoke)"
    },
    {
      "id": "FE-ACT-AIC-003",
      "description": "DELETE removes action (smoke)",
      "status": "PASS",
      "duration_ms": 0.8684510000020964,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — AI Call (FE-ACT-AIC) > FE-ACT-AIC-003 — DELETE removes action (smoke)"
    },
    {
      "id": "FE-ACT-AIC-004",
      "description": "Trigger requests AI call (smoke)",
      "status": "PASS",
      "duration_ms": 0.634053000001586,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — AI Call (FE-ACT-AIC) > FE-ACT-AIC-004 — Trigger requests AI call (smoke)"
    },
    {
      "id": "FE-ACT-AIC-005",
      "description": "Empty prompt_template → validation error (smoke)",
      "status": "PASS",
      "duration_ms": 0.9710629999972298,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — AI Call (FE-ACT-AIC) > FE-ACT-AIC-005 — Empty prompt_template → validation error (smoke)"
    },
    {
      "id": "FE-ACT-BBS-001",
      "description": "Endpoint exists",
      "status": "FAIL",
      "duration_ms": 30469.074651000003,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — BizBuySell (FE-ACT-BBS) > FE-ACT-BBS-001 — Endpoint exists",
      "error": "page.goto: Timeout 30000ms exceeded.\nCall log:\n  - navigating to \"https://staging.revhero.ai/automation-campaign\", waiting until \"domcontentloaded\"\n"
    },
    {
      "id": "FE-ACT-BBS-002",
      "description": "CRUD verified (smoke)",
      "status": "PASS",
      "duration_ms": 0.4140929999994114,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — BizBuySell (FE-ACT-BBS) > FE-ACT-BBS-002 — CRUD verified (smoke)"
    },
    {
      "id": "FE-ACT-BBS-003",
      "description": "Trigger dispatches request (smoke)",
      "status": "PASS",
      "duration_ms": 0.3057110000081593,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — BizBuySell (FE-ACT-BBS) > FE-ACT-BBS-003 — Trigger dispatches request (smoke)"
    },
    {
      "id": "FE-ACT-PD-001",
      "description": "Endpoint exists",
      "status": "FAIL",
      "duration_ms": 60156.630273999996,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — PandaDoc (FE-ACT-PD) > FE-ACT-PD-001 — Endpoint exists",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 12m29s\",\"retry_after_seconds\":749,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ACT-PD-002",
      "description": "Editor lists folders/templates (smoke)",
      "status": "PASS",
      "duration_ms": 0.39513700001407415,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — PandaDoc (FE-ACT-PD) > FE-ACT-PD-002 — Editor lists folders/templates (smoke)"
    },
    {
      "id": "FE-ACT-PD-003",
      "description": "CRUD verified (smoke)",
      "status": "PASS",
      "duration_ms": 0.2342169999901671,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — PandaDoc (FE-ACT-PD) > FE-ACT-PD-003 — CRUD verified (smoke)"
    },
    {
      "id": "FE-ACT-PD-004",
      "description": "Trigger creates + emails doc (smoke)",
      "status": "PASS",
      "duration_ms": 0.1545990000013262,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — PandaDoc (FE-ACT-PD) > FE-ACT-PD-004 — Trigger creates + emails doc (smoke)"
    },
    {
      "id": "FE-ACT-PD-005",
      "description": "Invalid template_id → graceful failure (smoke)",
      "status": "PASS",
      "duration_ms": 0.22012099999119528,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — PandaDoc (FE-ACT-PD) > FE-ACT-PD-005 — Invalid template_id → graceful failure (smoke)"
    },
    {
      "id": "UNKNOWN-049p6v",
      "description": "FE-ACT-S2C-001 — Endpoint exists",
      "status": "FAIL",
      "duration_ms": 60167.50401800001,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Send-to-Campaign (FE-ACT-S2C) > FE-ACT-S2C-001 — Endpoint exists",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 11m29s\",\"retry_after_seconds\":689,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "UNKNOWN-0z1wox",
      "description": "FE-ACT-S2C-002 — Editor lists user's campaigns + stages (smoke)",
      "status": "PASS",
      "duration_ms": 2.1693110000051092,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Send-to-Campaign (FE-ACT-S2C) > FE-ACT-S2C-002 — Editor lists user's campaigns + stages (smoke)"
    },
    {
      "id": "UNKNOWN-upi1ii",
      "description": "FE-ACT-S2C-003 — Trigger moves deal across campaigns (smoke)",
      "status": "PASS",
      "duration_ms": 0.27390199998626485,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Send-to-Campaign (FE-ACT-S2C) > FE-ACT-S2C-003 — Trigger moves deal across campaigns (smoke)"
    },
    {
      "id": "UNKNOWN-rut21w",
      "description": "FE-ACT-S2C-004 — Cycle prevention at save time (smoke)",
      "status": "PASS",
      "duration_ms": 0.23722300000372343,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Send-to-Campaign (FE-ACT-S2C) > FE-ACT-S2C-004 — Cycle prevention at save time (smoke)"
    },
    {
      "id": "FE-ACT-SF-001",
      "description": "Endpoint exists",
      "status": "FAIL",
      "duration_ms": 60251.57429300001,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Siteforge (FE-ACT-SF) > FE-ACT-SF-001 — Endpoint exists",
      "error": "BFF /v1/auth/login returned 429: {\"data\":{\"error\":\"too many login attempts; try again in 10m29s\",\"retry_after_seconds\":629,\"scope\":\"email\"},\"message\":\"Too many login attempts. Please wait and try again.\"}"
    },
    {
      "id": "FE-ACT-SF-002",
      "description": "CRUD verified (smoke)",
      "status": "PASS",
      "duration_ms": 0.7655690000392497,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Siteforge (FE-ACT-SF) > FE-ACT-SF-002 — CRUD verified (smoke)"
    },
    {
      "id": "FE-ACT-SF-003",
      "description": "Invalid API key at save → friendly error (smoke)",
      "status": "PASS",
      "duration_ms": 0.18154000001959503,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Siteforge (FE-ACT-SF) > FE-ACT-SF-003 — Invalid API key at save → friendly error (smoke)"
    },
    {
      "id": "FE-ACT-SF-004",
      "description": "Trigger logs activity (smoke)",
      "status": "PASS",
      "duration_ms": 0.3130339999916032,
      "file_path": "/app/runner/tests/stage-actions/fe-stage-actions.test.ts",
      "test_path": "tests/stage-actions/fe-stage-actions.test.ts > Stage action — Siteforge (FE-ACT-SF) > FE-ACT-SF-004 — Trigger logs activity (smoke)"
    }
  ]
}