{
  "revision": "6fe4838e0500e37328dbe0f554da93b7a0c7c967",
  "stats": {
    "startTime": "2026-09-11T05:47:46.024Z",
    "duration": 374272.798,
    "expected": 18,
    "skipped": 0,
    "unexpected": 3,
    "flaky": 0
  },
  "total": 21,
  "statusCounts": {
    "passed": 18,
    "failed": 3
  },
  "passRatePercent": 85.71428571428571,
  "rows": [
    {
      "caseId": "CASE-001",
      "title": "CASE-001 mobile custom exercise completes the intended persisted round trip",
      "file": "CASE-001-mobile-custom-exercise-reps-render-crash/regression.spec.mjs",
      "status": "passed",
      "durationMs": 9998,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-002",
      "title": "CASE-002 desktop rename closes the editor and persists the exact aggregate",
      "file": "CASE-002-desktop-session-rename-save-deadlock/regression.spec.mjs",
      "status": "failed",
      "durationMs": 7675,
      "retries": 0,
      "errors": [
        "Error: expect(received).toEqual(expected) // deep equality\n\n- Expected  - 1\n+ Received  + 1\n\n@@ -3,11 +3,11 @@\n    \"brid\": \"brid:session:barbelic:693c4974-2da6-4376-b669-16fd143c8578:49acec04-1675-4afc-8639-082d3e866d8e\",\n    \"condition\": \"\",\n    \"create_request_hash\": \"540450f37547f14ff9918c7992849f171e64fd719ec37d891a6bfd28380133d7\",\n    \"created_at\": \"2026-09-11T05:48:54.967086+00:00\",\n    \"date\": \"2026-09-11\",\n-   \"duration_label\": \"\",\n+   \"duration_label\": \"45분\",\n    \"end_time\": \"09:15\",\n    \"group_id\": null,\n    \"id\": \"49acec04-1675-4afc-8639-082d3e866d8e\",\n    \"imported_at\": null,\n    \"kudos\": 0,\n\n  134 |         expect(Number(afterRevision)).toBe(2);\n  135 |         expect(Date.parse(afterUpdatedAt)).toBeGreaterThanOrEqual(Date.parse(beforeUpdatedAt));\n> 136 |         expect(stableAfterSession).toEqual(stableBeforeSession);\n      |                                    ^\n  137 |         expect(after.exercises).toEqual(before.exercises);\n  138 |         expect(after.sets).toEqual(before.sets);\n  139 |       });\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-002-desktop-session-rename-save-deadlock\\regression.spec.mjs:136:36\n    at Object.prove (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\support\\fixture.mjs:222:24)\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-002-desktop-session-rename-save-deadlock\\regression.spec.mjs:117:7\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-002-desktop-session-rename-save-deadlock\\regression.spec.mjs:99:5",
        "Error: CASE-002 returned without the fail-closed full-round-trip completion gate.\n\n   at support\\fixture.mjs:552\n\n  550 |       await use(state);\n  551 |       if (!journeyCompleted) {\n> 552 |         throw new Error(\n      |               ^\n  553 |           `${caseId} returned without the fail-closed full-round-trip completion gate.`,\n  554 |         );\n  555 |       }\n    at Object.caseContext (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\support\\fixture.mjs:552:15)"
      ]
    },
    {
      "caseId": "CASE-010",
      "title": "CASE-010 stale Feed chunk preserves the document until the user explicitly reopens the app",
      "file": "CASE-010-stale-lazy-chunk-auto-recovery/regression.spec.mjs",
      "status": "failed",
      "durationMs": 11727,
      "retries": 0,
      "errors": [
        "Error: expect(locator).toHaveText(expected) failed\n\nLocator:  getByRole('alert')\nExpected: \"화면을 불러오지 못했어요. 다른 화면으로 이동할 수 있어요. 연결을 확인하고 다른 화면의 입력을 저장한 뒤 앱을 다시 열어 주세요. 작성 중인 운동은 기기에 보관한 뒤 다시 엽니다. 앱 다시 열기\"\nReceived: \"화면을 불러오지 못했어요.다른 화면으로 이동할 수 있어요. 연결을 확인하고 다른 화면의 입력을 저장한 뒤 앱을 다시 열어 주세요.작성 중인 운동은 기기에 보관한 뒤 다시 엽니다.앱 다시 열기\"\nTimeout:  10000ms\n\nCall log:\n  - Expect \"toHaveText\" with timeout 10000ms\n  - waiting for getByRole('alert')\n    23 × locator resolved to <section role=\"alert\" class=\"card\">…</section>\n       - unexpected value \"화면을 불러오지 못했어요.다른 화면으로 이동할 수 있어요. 연결을 확인하고 다른 화면의 입력을 저장한 뒤 앱을 다시 열어 주세요.작성 중인 운동은 기기에 보관한 뒤 다시 엽니다.앱 다시 열기\"\n\n\n  35 |    await c.clickVisibleDashboardNav(page,'feed');\n  36 |    const recovery=page.getByRole('alert');\n> 37 |    await expect(recovery).toHaveText(\"화면을 불러오지 못했어요. 다른 화면으로 이동할 수 있어요. 연결을 확인하고 다른 화면의 입력을 저장한 뒤 앱을 다시 열어 주세요. 작성 중인 운동은 기기에 보관한 뒤 다시 엽니다. 앱 다시 열기\");\n     |                           ^\n  38 |    await page.waitForLoadState('networkidle');\n  39 |    expect(chunkRequests).toBe(1);expect(documentRequests).toBe(baseline);\n  40 |    await c.prove('frontend-state',async()=>{\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-010-stale-lazy-chunk-auto-recovery\\regression.spec.mjs:37:27\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-010-stale-lazy-chunk-auto-recovery\\regression.spec.mjs:31:3",
        "Error: CASE-010 returned without the fail-closed full-round-trip completion gate.\n\n   at support\\fixture.mjs:552\n\n  550 |       await use(state);\n  551 |       if (!journeyCompleted) {\n> 552 |         throw new Error(\n      |               ^\n  553 |           `${caseId} returned without the fail-closed full-round-trip completion gate.`,\n  554 |         );\n  555 |       }\n    at Object.caseContext (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\support\\fixture.mjs:552:15)"
      ]
    },
    {
      "caseId": "CASE-011",
      "title": "CASE-011 empty drafts stay discarded and an authored workout resumes after page close through completed storage",
      "file": "CASE-011-mobile-empty-start-resume-ghost/regression.spec.mjs",
      "status": "passed",
      "durationMs": 13382,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-015",
      "title": "CASE-015 initial create and first recovery flush preserve one exact pending mutation",
      "file": "CASE-015-degraded-create-recovery-flush/regression.spec.mjs",
      "status": "passed",
      "durationMs": 17021,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-028",
      "title": "CASE-028 a live workout saved on the finish screen can go back for one more set and resave with the added set without a single user-facing error",
      "file": "CASE-028-finish-back-one-more-set-resave-round-trip/regression.spec.mjs",
      "status": "failed",
      "durationMs": 16552,
      "retries": 0,
      "errors": [
        "TimeoutError: locator.click: Timeout 10000ms exceeded.\nCall log:\n  - waiting for locator('[data-lg-action=\"workout.exercise.finish\"]')\n\n\n   96 |     // 종목 완료 → 운동 종료 → 확인 카드 \"운동 종료\". 첫 번째는 카드가 \"저장 중 → 저장 완료\"를 거쳐 닫히고, 두 번째는 즉시 닫힌다.\n   97 |     const finishWorkout = async (label) => {\n>  98 |       await page.locator('[data-lg-action=\"workout.exercise.finish\"]').click();\n      |                                                                        ^\n   99 |       await expect(page.locator('[data-lg-hook=\"exerciseReviewBar\"]')).toBeVisible();\n  100 |       await page.locator('[data-lg-action=\"workout.finishStep\"]').last().click();\n  101 |       await page.locator('[data-lg-action=\"workout.finishStep.confirm\"]').click();\n    at finishWorkout (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-028-finish-back-one-more-set-resave-round-trip\\regression.spec.mjs:98:72)\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-028-finish-back-one-more-set-resave-round-trip\\regression.spec.mjs:182:15\n    at Object.prove (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\support\\fixture.mjs:222:24)\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-028-finish-back-one-more-set-resave-round-trip\\regression.spec.mjs:165:7\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-028-finish-back-one-more-set-resave-round-trip\\regression.spec.mjs:164:5",
        "Error: CASE-028 returned without the fail-closed full-round-trip completion gate.\n\n   at support\\fixture.mjs:552\n\n  550 |       await use(state);\n  551 |       if (!journeyCompleted) {\n> 552 |         throw new Error(\n      |               ^\n  553 |           `${caseId} returned without the fail-closed full-round-trip completion gate.`,\n  554 |         );\n  555 |       }\n    at Object.caseContext (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\support\\fixture.mjs:552:15)"
      ]
    },
    {
      "caseId": "CASE-029",
      "title": "CASE-029 a completed record edited and deleted while the write RPC answers 503 is closed at once, kept on the device, and uploaded after connectivity recovers without a single user-facing error",
      "file": "CASE-029-offline-edit-delete-queue-flush-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 30282,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-030",
      "title": "CASE-030 an assisted pull-up set recorded with 20kg of assistance is saved as a 60kg effective load and renders as 보조 20kg × 8회 without a single user-facing error",
      "file": "CASE-030-assisted-exercise-effective-load-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 5930,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-032",
      "title": "CASE-032 the finish-screen 기록 삭제 closes the workout before the delete response and the queued delete reaches the server exactly once without a detail re-fetch",
      "file": "CASE-032-finish-screen-delete-immediate-close-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 10474,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-033",
      "title": "CASE-033 a two-movement composite is saved as one exercise with two parts, grows to three set rows through 수정, counts 3 sets on the day, drops to 2 after a set delete, and never shows a user-facing error",
      "file": "CASE-033-composite-edit-set-delete-day-set-count-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 20441,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-034",
      "title": "CASE-034 a two-set plan saved in the mobile editor shows set_count 2 on the home card, and completing only one set through the live workout turns the same row into a completed session with one set row, removes the card, and never shows a user-facing error",
      "file": "CASE-034-plan-partial-completion-same-row-transition-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 11192,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-035",
      "title": "CASE-035 a group board published by the owner is a planned group session, a member starting from it saves a completed session with the board origin that appears in the group day list, and neither actor sees a user-facing error",
      "file": "CASE-035-group-board-member-start-origin-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 9179,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-036",
      "title": "CASE-036 the live v5 record survives retired RPC rejection and the browser displays the LG426 update requirement with retained input",
      "file": "CASE-036-retired-write-contract-update-notice-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 9563,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-041",
      "title": "CASE-041 committed create edit and delete retry the identical mutation without applying twice",
      "file": "CASE-041-committed-write-lost-ack/regression.spec.mjs",
      "status": "passed",
      "durationMs": 20115,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-043",
      "title": "CASE-043 the real server rejects an expired signed JWT and the same owner reauthenticates to resume the held mutation",
      "file": "CASE-043-expired-jwt-held-recovery/regression.spec.mjs",
      "status": "passed",
      "durationMs": 9567,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-044",
      "title": "CASE-044 A pending data stays private while B saves and only A reentry uploads A request",
      "file": "CASE-044-pending-owner-switch-isolation/regression.spec.mjs",
      "status": "passed",
      "durationMs": 15698,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-045",
      "title": "CASE-045 a later tab edit resolves a real revision conflict and an older late ACK cannot restore old values",
      "file": "CASE-045-concurrent-tab-latest-intent/regression.spec.mjs",
      "status": "passed",
      "durationMs": 23203,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-047",
      "title": "CASE-047 an old detail response cannot replace the newer selected workout and a failed read can be retried",
      "file": "CASE-047-read-model-late-response/regression.spec.mjs",
      "status": "passed",
      "durationMs": 13504,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-048",
      "title": "CASE-048 cached HTTPS reentry and a real service worker update preserve one pending workout",
      "file": "CASE-048-https-sw-offline-pending-update/regression.spec.mjs",
      "status": "passed",
      "durationMs": 16250,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-053",
      "title": "CASE-053 UI group creation and invitation acceptance survive reload and revoked membership leaves the open group",
      "file": "CASE-053-group-invite-ui-membership-revocation/regression.spec.mjs",
      "status": "passed",
      "durationMs": 4718,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-058",
      "title": "CASE-058 aborted IndexedDB enqueue preserves the input and a user retry saves once after recovery",
      "file": "CASE-058-indexeddb-enqueue-failure/regression.spec.mjs",
      "status": "passed",
      "durationMs": 7738,
      "retries": 0,
      "errors": []
    }
  ]
}