{
  "revision": "5970a1a56a04a4566a0549981e3f9cdf47e10262",
  "stats": {
    "startTime": "2026-09-11T05:19:29.360Z",
    "duration": 760339.0009999999,
    "expected": 32,
    "skipped": 0,
    "unexpected": 21,
    "flaky": 0
  },
  "total": 53,
  "statusCounts": {
    "failed": 21,
    "passed": 32
  },
  "passRatePercent": 60.37735849056604,
  "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": "failed",
      "durationMs": 3255,
      "retries": 0,
      "errors": [
        "Error: expect(received).toMatchObject(expected)\n\n- Expected  - 1\n+ Received  + 1\n\n  Object {\n-   \"reps\": \"3\",\n+   \"reps\": 3,\n    \"strengthProjectionPending\": true,\n  }\n\n  72 |           reps: \"3\",\n  73 |         });\n> 74 |         expect(persistedDraftSet).toMatchObject({\n     |                                   ^\n  75 |           reps: \"3\",\n  76 |           strengthProjectionPending: true,\n  77 |         });\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-001-mobile-custom-exercise-reps-render-crash\\regression.spec.mjs:74:35\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-001-mobile-custom-exercise-reps-render-crash\\regression.spec.mjs:62:7\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-001-mobile-custom-exercise-reps-render-crash\\regression.spec.mjs:34:5",
        "Error: CASE-001 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-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": 6942,
      "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:58e84ec4-05c5-46a7-8678-8d3d60141e13:ac1d1fef-3967-48fb-960b-ca8a3f3969ee\",\n    \"condition\": \"\",\n    \"create_request_hash\": \"3a3ab835f0b5983b726cddf138681ac248c0de218aaa9eb14612ea14a8e32cc3\",\n    \"created_at\": \"2026-09-11T05:20:09.516282+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\": \"ac1d1fef-3967-48fb-960b-ca8a3f3969ee\",\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-004",
      "title": "CASE-004 mobile post-save owner feed and Calendar summary complete the intended persisted round trip",
      "file": "CASE-004-mobile-post-save-home-day-summary-stale/regression.spec.mjs",
      "status": "passed",
      "durationMs": 10902,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-005",
      "title": "CASE-005 started-set outcomes survive the complete desktop PR detail round trip",
      "file": "CASE-005-set-outcomes-pr-detail-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 6319,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-006",
      "title": "CASE-006 PR growth chart drains paged measured records",
      "file": "CASE-006-desktop-pr-growth-pagination/regression.spec.mjs",
      "status": "passed",
      "durationMs": 7482,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-008",
      "title": "CASE-008 annual workout days equal persisted and rendered grass dates",
      "file": "CASE-008-mobile-report-workout-days-grass-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 5174,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-009",
      "title": "CASE-009 mobile onboarding persists the complete profile contract",
      "file": "CASE-009-onboarding-profile-data-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 2671,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-010",
      "title": "CASE-010 stale Feed chunk reloads once and completes the authenticated route",
      "file": "CASE-010-stale-lazy-chunk-auto-recovery/regression.spec.mjs",
      "status": "failed",
      "durationMs": 12815,
      "retries": 0,
      "errors": [
        "Error: the boot idle warmup attempts the Feed chunk before navigation\n\nthe boot idle warmup attempts the Feed chunk before navigation\n\nexpect(received).toBeGreaterThanOrEqual(expected)\n\nExpected: >= 1\nReceived:    0\n\nCall Log:\n- Timeout 10000ms exceeded while waiting on the predicate\n\n  86 |         () => feedChunkRequests,\n  87 |         { message: \"the boot idle warmup attempts the Feed chunk before navigation\", timeout: 10_000 },\n> 88 |       ).toBeGreaterThanOrEqual(1);\n     |         ^\n  89 |       expect(topLevelDocumentRequests - bootBaseline).toBe(0);\n  90 |       const bootRecovery = await page.evaluate(\n  91 |         (storageKey) => window.sessionStorage.getItem(storageKey),\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:88:9\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:81:5",
        "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": "failed",
      "durationMs": 13125,
      "retries": 0,
      "errors": [
        "Error: expect(received).toBe(expected) // Object.is equality\n\nExpected: 1\nReceived: 2\n\n   at ..\\e2e\\support\\durabilityJourney.mjs:138\n\n  136 |   const aggregate = await c.rawCompletedAggregate(id);\n  137 |   expect(aggregate.session).toMatchObject({ id, user_id: c.userId, status: \"completed\" });\n> 138 |   expect(Number(aggregate.session.server_revision)).toBe(revision);\n      |                                                     ^\n  139 |   expect(aggregate.exercises.map((row) => row.exercise_id)).toEqual([c.systemExercise.id]);\n  140 |   expect(aggregate.sets.map((row) => [Number(row.load), Number(row.reps)])).toEqual([[load, 5]]);\n  141 |   return aggregate;\n    at assertAggregate (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\e2e\\support\\durabilityJourney.mjs:138:53)\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-011-mobile-empty-start-resume-ghost\\regression.spec.mjs:237:9\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-011-mobile-empty-start-resume-ghost\\regression.spec.mjs:226:7\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-011-mobile-empty-start-resume-ghost\\regression.spec.mjs:181:5",
        "Error: CASE-011 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-012",
      "title": "CASE-012 two bootstrap 503s preserve minimized snapshot access and recover without auth demotion",
      "file": "CASE-012-boot-auth-outage-non-demotion/regression.spec.mjs",
      "status": "passed",
      "durationMs": 6224,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-013",
      "title": "CASE-013 TOKEN_REFRESHED and two JWT 401s preserve the owner session until recovery",
      "file": "CASE-013-token-refreshed-jwt-storm-session-preservation/regression.spec.mjs",
      "status": "passed",
      "durationMs": 7514,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-014",
      "title": "CASE-014 cold app document reads the exact owner snapshot and recovers live",
      "file": "CASE-014-cold-start-snapshot-reading/regression.spec.mjs",
      "status": "passed",
      "durationMs": 6117,
      "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": "failed",
      "durationMs": 14419,
      "retries": 0,
      "errors": [
        "Error: expect(locator).toBeVisible() failed\n\nLocator: locator('[data-lg-hook=\"finishSyncPending\"]')\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n  - Expect \"toBeVisible\" with timeout 10000ms\n  - waiting for locator('[data-lg-hook=\"finishSyncPending\"]')\n\n\n  87 |     // 답이 늦은 자동 저장(#1199 결정 1-b): 오류 배너·저장 버튼이 아니라 \"동기화 후 점수 반영\" 안내가 뜨고, 기록은 이미\n  88 |     // 기기 대기열에 남아 있다. \"메인으로\"는 변경분이 없어 요청 없이 닫힌다.\n> 89 |     await expect(page.locator('[data-lg-hook=\"finishSyncPending\"]')).toBeVisible();\n     |                                                                      ^\n  90 |     await expect(page.locator('[data-lg-hook=\"finishSyncPending\"]')).toContainText(\"동기화 후 점수 반영\");\n  91 |     await expect(page.locator('[data-lg-view=\"workout.finish\"] .banner.error')).toHaveCount(0);\n  92 |     await page.locator('[data-lg-action=\"workout.finish.home\"]').click();\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-015-degraded-create-recovery-flush\\regression.spec.mjs:89:70",
        "Error: CASE-015 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-016",
      "title": "CASE-016 desktop plan create save keeps the journal alive and Home reloads with the plan",
      "file": "CASE-016-desktop-plan-create-save-crash-home-lockout/regression.spec.mjs",
      "status": "passed",
      "durationMs": 7832,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-017",
      "title": "CASE-017 the in-app account deletion erases the caller and only the caller",
      "file": "CASE-017-account-deletion-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 6060,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-019",
      "title": "CASE-019 percent input survives the board round trip as % and the session prefill converts it with the starter's own 1RM",
      "file": "CASE-019-group-board-percent-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 8004,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-020",
      "title": "CASE-020 a composite exercise survives the board round trip with its per-movement parts and prefills the live session",
      "file": "CASE-020-group-board-composite-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 6265,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-021",
      "title": "CASE-021 a live composite set demands an explicit load before save and a mistaken fail tap leaves no failure once the set is redone",
      "file": "CASE-021-live-composite-load-gate-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 6552,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-022",
      "title": "CASE-022 a mixed composite records each movement with its own atoms and persists them to separate movement rows",
      "file": "CASE-022-live-mixed-composite-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 5936,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-023",
      "title": "CASE-023 a live workout saved on the finish screen accepts the note follow-up and two consecutive set edits without a single user-facing error",
      "file": "CASE-023-completed-session-follow-up-edit-write-source/regression.spec.mjs",
      "status": "passed",
      "durationMs": 10350,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-024",
      "title": "CASE-024 a completed record accepts a set-value edit, a time-only edit, and a note-only edit without a single user-facing error",
      "file": "CASE-024-completed-record-two-way-edit-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 8088,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-025",
      "title": "CASE-025 a plan written in the mobile editor starts a live workout whose finish-screen save completes the plan and accepts the note follow-up without a single user-facing error",
      "file": "CASE-025-plan-to-live-session-completion-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 7719,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-026",
      "title": "CASE-026 a workout started from the group whiteboard auto-saves under a group-board source_ref and accepts the note follow-up without a single user-facing error",
      "file": "CASE-026-group-board-workout-follow-up-edit-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 7384,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-027",
      "title": "CASE-027 a group whiteboard composed, reopened, edited, and republished keeps the changed snapshot without a single user-facing error",
      "file": "CASE-027-group-board-edit-resave-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 6557,
      "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": 15678,
      "retries": 0,
      "errors": [
        "TimeoutError: locator.click: Timeout 10000ms exceeded.\nCall log:\n  - waiting for locator('[data-lg-view=\"workout.record\"]').locator('[role=\"checkbox\"][data-lg-action=\"workout.set.complete\"]').nth(2)\n    - locator resolved to <span role=\"checkbox\" aria-label=\"세트 완료\" aria-checked=\"true\" class=\"setcheck on locked\" data-lg-action=\"workout.set.complete\">…</span>\n  - attempting click action\n    2 × waiting for element to be visible, enabled and stable\n      - element is visible, enabled and stable\n      - scrolling into view if needed\n      - done scrolling\n      - <div class=\"setrow-view done\" data-lg-status=\"completed\" data-lg-slot=\"workout.set.entryLabel\">…</div> intercepts pointer events\n    - retrying click action\n    - waiting 20ms\n    2 × waiting for element to be visible, enabled and stable\n      - element is visible, enabled and stable\n      - scrolling into view if needed\n      - done scrolling\n      - <div class=\"setrow-view done\" data-lg-status=\"completed\" data-lg-slot=\"workout.set.entryLabel\">…</div> intercepts pointer events\n    - retrying click action\n      - waiting 100ms\n    19 × waiting for element to be visible, enabled and stable\n       - element is visible, enabled and stable\n       - scrolling into view if needed\n       - done scrolling\n       - <div class=\"setrow-view done\" data-lg-status=\"completed\" data-lg-slot=\"workout.set.entryLabel\">…</div> intercepts pointer events\n     - retrying click action\n       - waiting 500ms\n\n\n  177 |         await editDone.click();\n  178 |         await expect(editSheet).toBeHidden();\n> 179 |         await setCheckbox.nth(extraIndex).click();\n      |                                           ^\n  180 |         await expect(setCheckbox.nth(extraIndex)).toHaveAttribute(\"aria-checked\", \"true\");\n  181 |         await finishWorkout(\"CASE-028 second finish after the extra set\");\n  182 |         await expect(finishHome).toContainText(\"메인으로\");\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:179:43\n    at Object.prove (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases",
        "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": "failed",
      "durationMs": 5380,
      "retries": 0,
      "errors": [
        "Error: expect(received).toEqual(expected) // deep equality\n\n- Expected  -   1\n+ Received  + 105\n\n- Array []\n+ Array [\n+   Object {\n+     \"announced\": true,\n+     \"claim\": Object {\n+       \"expiresAt\": \"2026-09-11T05:24:11.081Z\",\n+       \"fence\": 1,\n+       \"tabId\": \"7f63ac6a-447b-4ae5-94b7-e0625545786a\",\n+     },\n+     \"clientMutationId\": \"4d5cc76f-fbac-5874-9bc9-76bcff33bb68\",\n+     \"dates\": Array [\n+       \"2026-09-11\",\n+     ],\n+     \"evidence\": Object {\n+       \"attemptCount\": 1,\n+       \"lastAttemptAt\": \"2026-09-11T05:24:01.081Z\",\n+       \"lastErrorCode\": null,\n+     },\n+     \"kind\": \"update_completed_session\",\n+     \"request\": Object {\n+       \"clientMutationId\": \"4d5cc76f-fbac-5874-9bc9-76bcff33bb68\",\n+       \"expectedRevision\": 1,\n+       \"requestHash\": \"4d5cc76ffbac38741bc976bcff33bb68453bb772051585f32942f786884705b0\",\n+       \"session\": Object {\n+         \"bodyWeight\": 75,\n+         \"condition\": \"\",\n+         \"date\": \"2026-09-11\",\n+         \"duration\": \"0분\",\n+         \"endTime\": \"14:23\",\n+         \"exercises\": Array [\n+           Object {\n+             \"bwFactor\": 0,\n+             \"details\": Array [],\n+             \"exerciseId\": \"eece5e29-a057-5804-873d-2c7b862a987e\",\n+             \"existingSessionExerciseId\": \"f6d42c87-88b8-496b-9477-0716d720a719\",\n+             \"fields\": Array [\n+               \"load\",\n+               \"reps\",\n+             ],\n+             \"id\": \"167f1c0f-ad3c-41e0-8349-ec486dfc3c44\",\n+             \"kind\": \"exercise\",\n+             \"name\": \"백스쿼트\",\n+             \"note\": \"\",\n+             \"review\": \"\",\n+             \"sets\": Array [\n+               Object {\n+                 \"done\": true,\n+                 \"existingExerciseSetId\": \"2f95a36d-77f7-456b-b52a-8603bb92c872\",\n+                 \"freeRest\": true,\n+                 \"id\": \"b7fddf93-56ef-4a69-9c07-c67c4ebb127e\",\n+                 \"load\": 60,\n+                 \"loadLb\": null,\n+                 \"note\": \"\",\n+                 \"perceivedRpe\": null,\n+                 \"reps\": 5,\n+                 \"restSeconds\": 0,\n+                 \"setResult\": \"completed\",\n+                 \"targetReps\": 5,\n+                 \"type\": \"main\",\n+                 \"userLoadOverrideUnit\": \"kg\",\n+              ",
        "Error: CASE-029 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-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": "failed",
      "durationMs": 12233,
      "retries": 0,
      "errors": [
        "TimeoutError: locator.click: Timeout 10000ms exceeded.\nCall log:\n  - waiting for locator('[data-lg-action=\"workout.picker.select\"][data-lg-option-value=\"7bc3b8e5-5bef-505e-8616-ec357c902c90\"]')\n\n\n   96 |         await page.locator(\n   97 |           `[data-lg-action=\"workout.picker.select\"][data-lg-option-value=\"${exercise.id}\"]`,\n>  98 |         ).click();\n      |           ^\n   99 |         await expect(editSheet).toBeVisible();\n  100 |         // 보조 종목의 세트 줄: 무게 칸 대신 보조 kg 칸.\n  101 |         const assistField = editSheet.locator('[data-lg-field=\"workout.set.assist\"]').first();\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-030-assisted-exercise-effective-load-round-trip\\regression.spec.mjs:98:11\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-030-assisted-exercise-effective-load-round-trip\\regression.spec.mjs:91:7\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-030-assisted-exercise-effective-load-round-trip\\regression.spec.mjs:90:5",
        "Error: CASE-030 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-031",
      "title": "CASE-031 a custom exercise registered as two dumbbells stores load_multiplier 2, doubles the effective load of a 20kg × 10 set and still renders as 20kg × 10회 without a single user-facing error",
      "file": "CASE-031-custom-dumbbell-load-multiplier-round-trip/regression.spec.mjs",
      "status": "passed",
      "durationMs": 6059,
      "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": "failed",
      "durationMs": 20409,
      "retries": 0,
      "errors": [
        "TimeoutError: locator.click: Timeout 10000ms exceeded.\nCall log:\n  - waiting for locator('[data-lg-action=\"dashboard.nav\"][data-lg-option-value=\"calendar\"]').first()\n    - locator resolved to <button class=\"tab\" data-lg-action=\"dashboard.nav\" data-lg-option-value=\"calendar\">…</button>\n  - attempting click action\n    2 × waiting for element to be visible, enabled and stable\n      - element is visible, enabled and stable\n      - scrolling into view if needed\n      - done scrolling\n      - <div class=\"confirm-scrim\" data-lg-hook=\"workoutRestorePromptDialog\">…</div> intercepts pointer events\n    - retrying click action\n    - waiting 20ms\n    2 × waiting for element to be visible, enabled and stable\n      - element is visible, enabled and stable\n      - scrolling into view if needed\n      - done scrolling\n      - <div class=\"confirm-scrim\" data-lg-hook=\"workoutRestorePromptDialog\">…</div> intercepts pointer events\n    - retrying click action\n      - waiting 100ms\n    19 × waiting for element to be visible, enabled and stable\n       - element is visible, enabled and stable\n       - scrolling into view if needed\n       - done scrolling\n       - <div class=\"confirm-scrim\" data-lg-hook=\"workoutRestorePromptDialog\">…</div> intercepts pointer events\n     - retrying click action\n       - waiting 500ms\n\n\n   at support\\fixture.mjs:985\n\n  983 |     .first();\n  984 |   await expect(nav).toBeVisible();\n> 985 |   await nav.click();\n      |             ^\n  986 | }\n  987 |\n  988 | // 탭바 개편(이슈 #822, 2026-08-26): 리포트(volume)는 탭바에서 빠지고 드로어 항목만 남았다 —\n    at clickVisibleDashboardNav (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\support\\fixture.mjs:985:13)\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-032-finish-screen-delete-immediate-close-round-trip\\regression.spec.mjs:224:11\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-032-finish-screen-delete-immediate-close-round-trip\\regression.spec.mjs:218:9\n",
        "Error: CASE-032 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-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": "failed",
      "durationMs": 18416,
      "retries": 0,
      "errors": [
        "Error: CASE-033: session.server_revision reaches 2\n\nCASE-033: session.server_revision reaches 2\n\nexpect(received).toBe(expected) // Object.is equality\n\nExpected: 2\nReceived: 3\n\nCall Log:\n- Timeout 10000ms exceeded while waiting on the predicate\n\n  108 |         if (row.error) throw row.error;\n  109 |         return Number(row.data.server_revision);\n> 110 |       }, { message: `CASE-033: session.server_revision reaches ${revision}` }).toBe(revision);\n      |                                                                                ^\n  111 |     };\n  112 |\n  113 |     await test.step(\"CASE-033 checkpoint: the finish-screen auto-save stores the composite as one exercise, two parts, one set and two set parts\", async () => {\n    at waitForRevision (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-033-composite-edit-set-delete-day-set-count-round-trip\\regression.spec.mjs:110:80)\n    at proof (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-033-composite-edit-set-delete-day-set-count-round-trip\\regression.spec.mjs:200: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:30)\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-033-composite-edit-set-delete-day-set-count-round-trip\\regression.spec.mjs:199:15\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-033-composite-edit-set-delete-day-set-count-round-trip\\regression.spec.mjs:183:5",
        "Error: CASE-033 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-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": "failed",
      "durationMs": 19905,
      "retries": 0,
      "errors": [
        "Error: CASE-034: the day summary counts the one completed set\n\nCASE-034: the day summary counts the one completed set\n\nexpect(received).toBe(expected) // Object.is equality\n\nExpected: 1\nReceived: 2\n\nCall Log:\n- Timeout 10000ms exceeded while waiting on the predicate\n\n  218 |         expect(await homePlanCard(c, plan.id), \"CASE-034: a completed plan no longer appears as a plan card\").toBeNull();\n  219 |         await statsRefresh.waitForQuiet();\n> 220 |         await expect.poll(() => daySetCount(c), { message: \"CASE-034: the day summary counts the one completed set\", timeout: 10_000 }).toBe(1);\n      |                                                                                                                                         ^\n  221 |       });\n  222 |     });\n  223 |\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-034-plan-partial-completion-same-row-transition-round-trip\\regression.spec.mjs:220:137\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-034-plan-partial-completion-same-row-transition-round-trip\\regression.spec.mjs:217:7\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-034-plan-partial-completion-same-row-transition-round-trip\\regression.spec.mjs:216:5",
        "Error: CASE-034 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-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": "failed",
      "durationMs": 11178,
      "retries": 0,
      "errors": [
        "AuthApiError: Database error deleting user\n\n   at support\\fixture.mjs:542\n\n  540 |       for (const actor of disposableActors) {\n  541 |         if (actor.deleted) continue;\n> 542 |         const deletedActor = await service.auth.admin.deleteUser(actor.userId);\n      |                              ^\n  543 |         if (deletedActor.error) throw deletedActor.error;\n  544 |         actor.deleted = true;\n  545 |         await assertDeletedUserGraph(service, actor.userId);\n    at handleError (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\node_modules\\@supabase\\auth-js\\src\\lib\\fetch.ts:139:9)\n    at _handleRequest (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\node_modules\\@supabase\\auth-js\\src\\lib\\fetch.ts:232:5)\n    at _request (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\node_modules\\@supabase\\auth-js\\src\\lib\\fetch.ts:194:16)\n    at GoTrueAdminApi.deleteUser (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\node_modules\\@supabase\\auth-js\\src\\GoTrueAdminApi.ts:843:14)\n    at completeDisposableActorCleanup (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\support\\fixture.mjs:542:30)\n    at completeCleanup (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\support\\fixture.mjs:438:38)\n    at completeJourney (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\support\\fixture.mjs:408:7)\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-035-group-board-member-start-origin-round-trip\\regression.spec.mjs:243:7\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-035-group-board-member-start-origin-round-trip\\regression.spec.mjs:239:5",
        "Error: CASE-035 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-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": "failed",
      "durationMs": 5290,
      "retries": 0,
      "errors": [
        "Error: retired entry points write nothing\n\nexpect(received).toBe(expected) // Object.is equality\n\nExpected: 1\nReceived: 2\n\n  142 |         expect(after.error).toBeNull();\n  143 |         expect(after.data).toMatchObject({ id: sessionRow.id, status: \"completed\" });\n> 144 |         expect(Number(after.data.server_revision), \"retired entry points write nothing\").toBe(1);\n      |                                                                                          ^\n  145 |         const layers = await layerCounts(c, sessionRow.id);\n  146 |         expect(layers.exercises.map((row) => row.id)).toEqual(baseline.exercises.map((row) => row.id));\n  147 |         expect(layers.sets.map((row) => row.id)).toEqual(baseline.sets.map((row) => row.id));\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-036-retired-write-contract-update-notice-round-trip\\regression.spec.mjs:144:90\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-036-retired-write-contract-update-notice-round-trip\\regression.spec.mjs:140:7\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-036-retired-write-contract-update-notice-round-trip\\regression.spec.mjs:119:5",
        "Error: CASE-036 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-037",
      "title": "CASE-037 the home favorite board paints exercise names while get_exercise_catalog is held, keeps them after release, and paints them again on reload",
      "file": "CASE-037-boot-exercise-names-without-catalog/regression.spec.mjs",
      "status": "passed",
      "durationMs": 3723,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-038",
      "title": "CASE-038 a custom exercise arrives through one catalog change page, the full catalog is fetched only on the first boot, and another user's custom exercise triggers no catalog request even after reload",
      "file": "CASE-038-custom-exercise-catalog-incremental-sync/regression.spec.mjs",
      "status": "passed",
      "durationMs": 11455,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-039",
      "title": "CASE-039 a pending edit left by the legacy Production bundle is read by the new bundle in the same browser, survives the legacy tab touching it again, and reaches the server exactly once without a user-facing error",
      "file": "CASE-039-legacy-tab-pending-row-coexistence/regression.spec.mjs",
      "status": "passed",
      "durationMs": 32293,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-040",
      "title": "CASE-040 an edit made in the new bundle while the legacy Production bundle is still sending its own edit survives the legacy tab's receipt as a successor row and reaches the server after it",
      "file": "CASE-040-legacy-tab-in-flight-new-tab-successor/regression.spec.mjs",
      "status": "passed",
      "durationMs": 25626,
      "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": "failed",
      "durationMs": 14837,
      "retries": 0,
      "errors": [
        "Error: expect(locator).toBeVisible() failed\n\nLocator: locator('[data-lg-hook=\"finishSyncPending\"]')\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n  - Expect \"toBeVisible\" with timeout 10000ms\n  - waiting for locator('[data-lg-hook=\"finishSyncPending\"]')\n\n\n  71 |           c.armExpectedFaults();\n  72 |           await finishWorkout(page);\n> 73 |           await expect(page.locator('[data-lg-hook=\"finishSyncPending\"]')).toBeVisible();\n     |                                                                            ^\n  74 |         });\n  75 |         await c.prove(\"authenticated-api-rpc\", async () => {\n  76 |           session = await c.waitForSessionByTitle(title);\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-041-committed-write-lost-ack\\regression.spec.mjs:73:76\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-041-committed-write-lost-ack\\regression.spec.mjs:69:9\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-041-committed-write-lost-ack\\regression.spec.mjs:68:7",
        "Error: CASE-041 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-042",
      "title": "CASE-042 a real sending row survives page death and its expired send is replayed by the next boot",
      "file": "CASE-042-pending-write-browser-restart/regression.spec.mjs",
      "status": "passed",
      "durationMs": 18621,
      "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": "failed",
      "durationMs": 14733,
      "retries": 0,
      "errors": [
        "Error: expect(locator).toBeVisible() failed\n\nLocator: locator('[data-lg-hook=\"finishSyncPending\"]')\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n  - Expect \"toBeVisible\" with timeout 10000ms\n  - waiting for locator('[data-lg-hook=\"finishSyncPending\"]')\n\n\n  44 |         await c.armExpectedRecovery(page, \"expired-jwt-recovery\");\n  45 |         await finishWorkout(page);\n> 46 |         await expect(page.locator('[data-lg-hook=\"finishSyncPending\"]')).toBeVisible();\n     |                                                                          ^\n  47 |       });\n  48 |       await c.prove(\"frontend-state\", async () => {\n  49 |         await expect.poll(async () => (await pendingRows(page, c.userId))[0]?.state).toBe(\"held\");\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-043-expired-jwt-held-recovery\\regression.spec.mjs:46:74\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-043-expired-jwt-held-recovery\\regression.spec.mjs:41:7\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-043-expired-jwt-held-recovery\\regression.spec.mjs:40:5",
        "Error: CASE-043 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-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": "failed",
      "durationMs": 15379,
      "retries": 0,
      "errors": [
        "Error: expect(locator).toBeVisible() failed\n\nLocator: locator('[data-lg-hook=\"finishSyncPending\"]')\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n  - Expect \"toBeVisible\" with timeout 10000ms\n  - waiting for locator('[data-lg-hook=\"finishSyncPending\"]')\n\n\n  39 |           await c.armExpectedRecovery(page, \"owner-switch-recovery\");\n  40 |           await finishWorkout(page);\n> 41 |           await expect(page.locator('[data-lg-hook=\"finishSyncPending\"]')).toBeVisible();\n     |                                                                            ^\n  42 |         });\n  43 |         await c.prove(\"frontend-state\", async () => {\n  44 |           await expect.poll(async () => (await pendingRows(page, c.userId))[0]?.state).toBe(\"held\");\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-044-pending-owner-switch-isolation\\regression.spec.mjs:41:76\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-044-pending-owner-switch-isolation\\regression.spec.mjs:36:9\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-044-pending-owner-switch-isolation\\regression.spec.mjs:35:7",
        "Error: CASE-044 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-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": "failed",
      "durationMs": 11933,
      "retries": 0,
      "errors": [
        "Error: expect(received).toBe(expected) // Object.is equality\n\nExpected: 2\nReceived: 3\n\n   at ..\\e2e\\support\\durabilityJourney.mjs:138\n\n  136 |   const aggregate = await c.rawCompletedAggregate(id);\n  137 |   expect(aggregate.session).toMatchObject({ id, user_id: c.userId, status: \"completed\" });\n> 138 |   expect(Number(aggregate.session.server_revision)).toBe(revision);\n      |                                                     ^\n  139 |   expect(aggregate.exercises.map((row) => row.exercise_id)).toEqual([c.systemExercise.id]);\n  140 |   expect(aggregate.sets.map((row) => [Number(row.load), Number(row.reps)])).toEqual([[load, 5]]);\n  141 |   return aggregate;\n    at assertAggregate (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\e2e\\support\\durabilityJourney.mjs:138:53)\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-045-concurrent-tab-latest-intent\\regression.spec.mjs:100:9\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-045-concurrent-tab-latest-intent\\regression.spec.mjs:90:7",
        "Error: CASE-045 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-046",
      "title": "CASE-046 a permanent rejection is quarantined until the user uploads the preserved workout as a new record",
      "file": "CASE-046-blocked-write-user-recovery/regression.spec.mjs",
      "status": "passed",
      "durationMs": 8518,
      "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": "failed",
      "durationMs": 12532,
      "retries": 0,
      "errors": [
        "Error: expect(received).toBe(expected) // Object.is equality\n\nExpected: 1\nReceived: 2\n\n   at ..\\e2e\\support\\durabilityJourney.mjs:138\n\n  136 |   const aggregate = await c.rawCompletedAggregate(id);\n  137 |   expect(aggregate.session).toMatchObject({ id, user_id: c.userId, status: \"completed\" });\n> 138 |   expect(Number(aggregate.session.server_revision)).toBe(revision);\n      |                                                     ^\n  139 |   expect(aggregate.exercises.map((row) => row.exercise_id)).toEqual([c.systemExercise.id]);\n  140 |   expect(aggregate.sets.map((row) => [Number(row.load), Number(row.reps)])).toEqual([[load, 5]]);\n  141 |   return aggregate;\n    at assertAggregate (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\e2e\\support\\durabilityJourney.mjs:138:53)\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-047-read-model-late-response\\regression.spec.mjs:61:11\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-047-read-model-late-response\\regression.spec.mjs:60:9\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-047-read-model-late-response\\regression.spec.mjs:42:7",
        "Error: CASE-047 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-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": "failed",
      "durationMs": 20235,
      "retries": 0,
      "errors": [
        "Error: expect(locator).toBeVisible() failed\n\nLocator: locator('[data-lg-hook=\"finishSyncPending\"]')\nExpected: visible\nTimeout: 10000ms\nError: element(s) not found\n\nCall log:\n  - Expect \"toBeVisible\" with timeout 10000ms\n  - waiting for locator('[data-lg-hook=\"finishSyncPending\"]')\n\n\n  46 |           expect(await page.evaluate(() => navigator.onLine)).toBe(false);\n  47 |           await finishWorkout(page);\n> 48 |           await expect(page.locator('[data-lg-hook=\"finishSyncPending\"]')).toBeVisible();\n     |                                                                            ^\n  49 |         });\n  50 |         await c.prove(\"frontend-state\", async () => {\n  51 |           await expect.poll(async () => (await pendingRows(page, c.userId)).length).toBe(1);\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-048-https-sw-offline-pending-update\\regression.spec.mjs:48:76\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-048-https-sw-offline-pending-update\\regression.spec.mjs:40:9\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-048-https-sw-offline-pending-update\\regression.spec.mjs:39:7",
        "Error: CASE-048 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-049",
      "title": "CASE-049 a cancelled provider callback leaves login available and a retried callback restores the same real account",
      "file": "CASE-049-provider-callback-cancel-retry/regression.spec.mjs",
      "status": "passed",
      "durationMs": 5523,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-050",
      "title": "CASE-050 profile edit failures preserve the draft and retry persists the name handle and photo",
      "file": "CASE-050-profile-edit-failure-retry/regression.spec.mjs",
      "status": "passed",
      "durationMs": 3691,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-051",
      "title": "CASE-051 an unsuccessful account link return preserves the original identity and permits profile reentry",
      "file": "CASE-051-account-link-return-identity-preservation/regression.spec.mjs",
      "status": "passed",
      "durationMs": 3554,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-052",
      "title": "CASE-052 failed likes roll back and failed comments retain their draft before successful UI retry",
      "file": "CASE-052-feed-reaction-failure-recovery/regression.spec.mjs",
      "status": "passed",
      "durationMs": 5618,
      "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": "failed",
      "durationMs": 13330,
      "retries": 0,
      "errors": [
        "TimeoutError: locator.click: Timeout 10000ms exceeded.\nCall log:\n  - waiting for locator('[data-lg-hook=\"brandNotify\"]:visible')\n    - locator resolved to <button type=\"button\" class=\"mb-wmbtn\" aria-label=\"알림 1개\" aria-expanded=\"false\" aria-haspopup=\"dialog\" data-lg-hook=\"brandNotify\">…</button>\n  - attempting click action\n    - waiting for element to be visible, enabled and stable\n    - element is not stable\n  - retrying click action\n    - waiting for element to be visible, enabled and stable\n    - element is not visible\n  - retrying click action\n    - waiting 20ms\n    2 × waiting for element to be visible, enabled and stable\n      - element is not visible\n    - retrying click action\n      - waiting 100ms\n    19 × waiting for element to be visible, enabled and stable\n       - element is not visible\n     - retrying click action\n       - waiting 500ms\n\n\n  32 |         await c.clickVisibleDashboardNav(page, \"group\");\n  33 |         // shell-frames.md#group-invitation-notifications: 실제 초대는 워드마크 알림함에서 수락한다.\n> 34 |         await page.locator('[data-lg-hook=\"brandNotify\"]:visible').click();\n     |                                                                    ^\n  35 |         const notifications = page.getByRole(\"dialog\", { name: \"알림\", exact: true });\n  36 |         await expect(notifications).toBeVisible();\n  37 |         const invite = notifications.locator(\".ntf-row\").filter({ hasText: groupName });\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-053-group-invite-ui-membership-revocation\\regression.spec.mjs:34:68\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-053-group-invite-ui-membership-revocation\\regression.spec.mjs:21:7\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-053-group-invite-ui-membership-revocation\\regression.spec.mjs:20:5",
        "Error: CASE-053 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-054",
      "title": "CASE-054 composed catalog search and failed archive retry preserve historical facts and restore the exercise",
      "file": "CASE-054-catalog-search-archive-recovery/regression.spec.mjs",
      "status": "passed",
      "durationMs": 10358,
      "retries": 0,
      "errors": []
    },
    {
      "caseId": "CASE-057",
      "title": "CASE-057 export failure creates no download and UI retry downloads exact owner facts and identities",
      "file": "CASE-057-export-download-facts-retry/regression.spec.mjs",
      "status": "passed",
      "durationMs": 11166,
      "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": "failed",
      "durationMs": 9591,
      "retries": 0,
      "errors": [
        "Error: the reproduced user journey must not surface a declared failure or any unexpected problem\n\nexpect(received).toEqual(expected) // deep equality\n\n- Expected  -  2\n+ Received  + 18\n\n  Object {\n-   \"browserAndNetworkFailures\": Array [],\n+   \"browserAndNetworkFailures\": Array [\n+     \"application emitted an error-report event: http://127.0.0.1:57821/rest/v1/rpc/record_client_error_event\",\n+   ],\n    \"fatalHeadingCount\": 0,\n    \"fatalShellCount\": 0,\n    \"pendingApplicationErrorEvents\": Array [],\n    \"recoveryViolations\": Array [],\n    \"renderedErrorSurfaces\": Array [],\n-   \"storedApplicationErrorEvents\": Array [],\n+   \"storedApplicationErrorEvents\": Array [\n+     Object {\n+       \"client_event_id\": \"98a76688-469b-453a-b952-8260fbc5abd8\",\n+       \"diagnostic_key\": \"draft_archive_overwritten\",\n+       \"error_code\": \"\",\n+       \"id\": \"22fa2049-3b06-480a-9838-f5d7aa9edc50\",\n+       \"kind\": \"local_queue_failure\",\n+       \"operation_name\": \"persist_workout_draft\",\n+       \"received_at\": \"2026-09-11T05:29:46.645077+00:00\",\n+       \"severity\": \"warning\",\n+       \"source\": \"queue\",\n+       \"surface\": \"workout-draft\",\n+       \"user_id\": \"f19ce425-bb08-43c2-8203-e72657837d68\",\n+     },\n+   ],\n  }\n\n   at support\\fixture.mjs:928\n\n  926 |     evidence,\n  927 |     \"the reproduced user journey must not surface a declared failure or any unexpected problem\",\n> 928 |   ).toEqual({\n      |     ^\n  929 |     fatalShellCount: 0,\n  930 |     fatalHeadingCount: 0,\n  931 |     renderedErrorSurfaces: [],\n    at assertNoUnexpectedErrors (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\support\\fixture.mjs:928:5)\n    at completeJourney (C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\support\\fixture.mjs:374:7)\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-058-indexeddb-enqueue-failure\\regression.spec.mjs:83:7\n    at C:\\Users\\USER\\Documents\\Codex\\2026-09-10\\1534-5-18-0-hq-4\\work\\barbelic-1540\\error-cases\\CASE-058-indexeddb-enqueue-failure\\regression.spec.mjs:81:5",
        "Error: CASE-058 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)"
      ]
    }
  ]
}