{
  "generatedAt": "2026-05-05T10:46:21.910Z",
  "url": "http://127.0.0.1:4179/families",
  "outputRoot": "/Users/m1/december/opal-families-overview-2026-05-05",
  "commit": "9a94c90118b2615201b6e7cde84355febef49418",
  "branchSource": "origin/main detached worktree",
  "viewport": {
    "width": 414,
    "height": 896,
    "deviceScaleFactor": 2
  },
  "screenOrder": [
    "f1_hook",
    "f2_conflict_window",
    "f2b_conflict_reinforce",
    "f3_family_stage",
    "f3b_household_size",
    "f4_primary_target",
    "f5_app_loop",
    "f6_prior_attempt",
    "f6b_prior_attempt_reinforce",
    "f7_branch_1",
    "f8_branch_2",
    "f9_branch_3",
    "f10_loader",
    "f11_diagnosis",
    "f12_reframe",
    "f12b_strict_mode",
    "f12c_scheduled_blocks",
    "f12d_gemstone",
    "f13_control_style",
    "f14_plan_preview",
    "f15_product_proof",
    "f17a_household_hours",
    "f17b_parent_age",
    "f17_email_gate",
    "f17c_projection_shock",
    "f17d_projection_hope",
    "f18_plan_summary",
    "f19_paywall",
    "f20_handoff"
  ],
  "runtimeScreenCount": 29,
  "screenshotCount": 67,
  "groups": [
    "Main path: teen parent",
    "Branch variants",
    "Conflict reinforcement variants",
    "Prior-attempt reinforcement variants",
    "Paywall scroll states",
    "Handoff internal states"
  ],
  "mismatches": 0,
  "errors": [],
  "consoleEvents": [
    {
      "type": "error",
      "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
    },
    {
      "type": "requestfailed",
      "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
    },
    {
      "type": "requestfailed",
      "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
    }
  ],
  "items": [
    {
      "number": 1,
      "id": "f1_hook",
      "label": "Family hook / parent role",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 0,
      "screenshot": "screenshots/001_main-path-teen-parent_f1-hook_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f1_hook",
      "actualLabel": "Family hook",
      "cursor": 0,
      "total": 29,
      "title": "STRUCTURE YOUR FAMILY’S SCREEN TIME.",
      "text": "STRUCTURE YOUR FAMILY’S SCREEN TIME.\nFAMILY SCREEN-TIME PLAN\nMom\nDad\nBy choosing and continuing, you agree to our Terms of Service · Privacy Policy.",
      "imageCount": 2,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 2,
      "id": "f2_conflict_window",
      "label": "Question: conflict window",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 1,
      "screenshot": "screenshots/002_main-path-teen-parent_f2-conflict-window_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f2_conflict_window",
      "actualLabel": "Conflict window",
      "cursor": 1,
      "total": 29,
      "title": "When do screens cause the most friction at home?",
      "text": "When do screens cause the most friction at home?\nPick the moments you are tired of arguing about. Opal handles them quietly.\n🌅\nMorning\nBefore school or work\n📚\nHomework / after school\nThe window that needs focus\n🍽️\nDinner\nPhones at the table\n🌙\nBedtime\nWhen the day should end\n📅\nWeekends\nLoose hours, lots of screens\n😮‍💨\nWhen I'm exhausted\nThe phone wins the tired moments\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 3,
      "id": "f2b_conflict_reinforce",
      "label": "Reinforcement: conflict window",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 2,
      "screenshot": "screenshots/003_main-path-teen-parent_f2b-conflict-reinforce_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f2b_conflict_reinforce",
      "actualLabel": "Conflict reinforce",
      "cursor": 2,
      "total": 29,
      "title": "Late assignments turn into midnight feeds.",
      "text": "Late assignments turn into midnight feeds.\nOpal separates study tools from the apps that keep everyone awake past midnight.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 4,
      "id": "f3_family_stage",
      "label": "Question: family stage",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 3,
      "screenshot": "screenshots/004_main-path-teen-parent_f3-family-stage_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f3_family_stage",
      "actualLabel": "Family stage",
      "cursor": 3,
      "total": 29,
      "title": "Who's at home?",
      "text": "Who's at home?\nYoung kids (3–6)\nYounger kids (7–9)\nTweens (10–12)\nTeens (13–15)\nOlder teens (16–18)\nMixed ages\nA new baby / expecting\nNo kids at home\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 5,
      "id": "f3b_household_size",
      "label": "Question: household phones",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 4,
      "screenshot": "screenshots/005_main-path-teen-parent_f3b-household-size_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f3b_household_size",
      "actualLabel": "Household size",
      "cursor": 4,
      "total": 29,
      "title": "How many phones are in the household?",
      "text": "How many phones are in the household?\nFamily Sharing covers up to 5 phones on one subscription. Each phone runs its own Opal.\n1\n2\n3\n4\n5\nCount every phone you'd like Opal on. Yours, your partner's, the kids'.\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 6,
      "id": "f4_primary_target",
      "label": "Question: primary target",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 5,
      "screenshot": "screenshots/006_main-path-teen-parent_f4-primary-target_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f4_primary_target",
      "actualLabel": "Primary target",
      "cursor": 5,
      "total": 29,
      "title": "Whose phone is the biggest source of friction?",
      "text": "Whose phone is the biggest source of friction?\nEach device runs its own rules. No remote monitoring.\nMy teen's phone\nMy younger child's phone\nMy own phone\nThe whole household's\nI want to protect early parenthood\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 7,
      "id": "f5_app_loop",
      "label": "Question: app loop",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 6,
      "screenshot": "screenshots/007_main-path-teen-parent_f5-app-loop_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f5_app_loop",
      "actualLabel": "App loop",
      "cursor": 6,
      "total": 29,
      "title": "Which loops are hardest to break?",
      "text": "Which loops are hardest to break?\nSelect the specific apps they cannot seem to close.\nTikTok / Reels\nYouTube\nGames\nSnapchat / messaging\nGeneral phone pickup\nMy own scrolling\nNot sure\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 8,
      "id": "f6_prior_attempt",
      "label": "Question: prior attempts",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 7,
      "screenshot": "screenshots/008_main-path-teen-parent_f6-prior-attempt_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f6_prior_attempt",
      "actualLabel": "Prior attempts",
      "cursor": 7,
      "total": 29,
      "title": "What have you already tried?",
      "text": "What have you already tried?\nSelect everything you have tried so far. Most fall apart when you are too tired to enforce them.\nApple Screen Time\nTaking the phone away\nFamily rules\nTimers\nTalking about it\nNothing yet\nIt works briefly, then collapses\nHousehold limits fail the moment you are too tired to enforce them. Opal places the boundary onto the phone itself so you stop having to play police officer.\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 9,
      "id": "f6b_prior_attempt_reinforce",
      "label": "Reinforcement: prior attempts",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 8,
      "screenshot": "screenshots/009_main-path-teen-parent_f6b-prior-attempt-reinforce_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f6b_prior_attempt_reinforce",
      "actualLabel": "Prior attempt reinforce",
      "cursor": 8,
      "total": 29,
      "title": "Verbal warnings and Apple limits both get ignored.",
      "text": "Verbal warnings and Apple limits both get ignored.\nOpal steps in when the kitchen table talk fails and they bypass Screen Time again.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 10,
      "id": "f7_branch_1",
      "label": "Branch module 1",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 9,
      "screenshot": "screenshots/010_main-path-teen-parent_f7-branch-1_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f7_branch_1",
      "actualLabel": "Branch 1",
      "cursor": 9,
      "total": 29,
      "title": "Where does the rule break down?",
      "text": "Where does the rule break down?\n\"Just 5 more minutes\"\nThey find loopholes\nI get tired of enforcing it\nIt turns into a fight\nNot sure\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 11,
      "id": "f8_branch_2",
      "label": "Branch module 2",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 10,
      "screenshot": "screenshots/011_main-path-teen-parent_f8-branch-2_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f8_branch_2",
      "actualLabel": "Branch 2",
      "cursor": 10,
      "total": 29,
      "title": "The real problem isn't your teen. It's enforcement fatigue.",
      "text": "The real problem isn't your teen. It's enforcement fatigue.\nPhone rules fail when every boundary depends on you enforcing it at the worst moment of the day. The fix isn't a stricter rule. It's a tool your teen runs themselves.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 12,
      "id": "f9_branch_3",
      "label": "Branch module 3",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 11,
      "screenshot": "screenshots/012_main-path-teen-parent_f9-branch-3_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f9_branch_3",
      "actualLabel": "Branch 3",
      "cursor": 11,
      "total": 29,
      "title": "Would your teen actually use Opal if it ran on their own phone?",
      "text": "Would your teen actually use Opal if it ran on their own phone?\nThey self-manage their own settings. No remote control, no monitoring. Honest answer. Opal adapts.\nYes, they've asked for one\nMaybe, with the right framing\nThey'd resist at first\nI don't know yet\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 13,
      "id": "f10_loader",
      "label": "Loader",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 12,
      "screenshot": "screenshots/013_main-path-teen-parent_f10-loader_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f10_loader",
      "actualLabel": "Loader",
      "cursor": 12,
      "total": 29,
      "title": "Mapping your family's phone loop…",
      "text": "Mapping your family's phone loop…\nFinding the highest-friction moment\nReading what hasn't worked before\nBuilding a first boundary\nMapping your household to seats",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 14,
      "id": "f11_diagnosis",
      "label": "Diagnosis",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 13,
      "screenshot": "screenshots/014_main-path-teen-parent_f11-diagnosis_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f11_diagnosis",
      "actualLabel": "Diagnosis",
      "cursor": 13,
      "total": 29,
      "title": "Here's what's actually going on.",
      "text": "Here's what's actually going on.\nWINDOW\nbedtime\nMAIN LOOP\nYouTube\nFIRST BOUNDARY\n9pm wind-down block + emergency access\nThe bedtime rule keeps collapsing because it depends on you enforcing it when everyone is tired. Your plan starts by giving your teen the same Opal app, beginning with 9pm wind-down block + emergency access. Each phone runs its own boundary, so you stop being the rule.\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 15,
      "id": "f12_reframe",
      "label": "Reframe",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 14,
      "screenshot": "screenshots/015_main-path-teen-parent_f12-reframe_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f12_reframe",
      "actualLabel": "Reframe",
      "cursor": 14,
      "total": 29,
      "title": "This isn't a motivation problem.",
      "text": "This isn't a motivation problem.\nApps are engineered to win the tired moments. Opal changes the device environment before the argument starts, independent of who holds the phone.\nBuild my plan",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 16,
      "id": "f12b_strict_mode",
      "label": "Feature reveal: Strict Mode",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 15,
      "screenshot": "screenshots/016_main-path-teen-parent_f12b-strict-mode_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f12b_strict_mode",
      "actualLabel": "Feature: Strict Mode",
      "cursor": 15,
      "total": 29,
      "title": "Would Strict Mode help during the hard windows?",
      "text": "IMAGINE THIS\nWould Strict Mode help during the hard windows?\nStrict Mode locks the loud apps during bedtime. No bypass on each phone, no remote override from a parent. The window passes without the fight.\n✅\nYes, lock those windows down\n🤔\nI'd want softer limits\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 17,
      "id": "f12c_scheduled_blocks",
      "label": "Feature reveal: Scheduled blocks",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 16,
      "screenshot": "screenshots/017_main-path-teen-parent_f12c-scheduled-blocks_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f12c_scheduled_blocks",
      "actualLabel": "Feature: Scheduled blocks",
      "cursor": 16,
      "total": 29,
      "title": "Want Opal to auto-schedule school-night blocks?",
      "text": "IMAGINE THIS\nWant Opal to auto-schedule school-night blocks?\nSet the family pattern once: weekday homework, dinner, lights-out. Each phone enforces it without anyone re-negotiating every night.\n🗓️\nYes, schedule them for us\n🔧\nWe'd rather set them manually\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 18,
      "id": "f12d_gemstone",
      "label": "Feature reveal: Gemstone progress",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 17,
      "screenshot": "screenshots/018_main-path-teen-parent_f12d-gemstone_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f12d_gemstone",
      "actualLabel": "Feature: Gemstone progress",
      "cursor": 17,
      "total": 29,
      "title": "Should each phone earn a gemstone for protected time?",
      "text": "PROGRESS STYLE\nShould each phone earn a gemstone for protected time?\nVisible streaks and a gemstone that evolves. The kid's own progress, not a parent dashboard. Most teens engage with progress they own.\n💎\nYes, motivate them with progress\n◌\nKeep it quiet, just enforce the rules\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 19,
      "id": "f13_control_style",
      "label": "Question: control style",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 18,
      "screenshot": "screenshots/019_main-path-teen-parent_f13-control-style_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f13_control_style",
      "actualLabel": "Control style",
      "cursor": 18,
      "total": 29,
      "title": "How much friction is required on day one?",
      "text": "How much friction is required on day one?\nOpal sets a baseline. Your plan expands from there.\nFriction only\nAdd a pause before the reflex.\nOne strict window\nHold a hard line for a single moment.\nParent baseline\nSecure your own phone before adding the house.\nFull reset\nRun a strict schedule for seven days.\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 20,
      "id": "f14_plan_preview",
      "label": "Plan preview",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 19,
      "screenshot": "screenshots/020_main-path-teen-parent_f14-plan-preview_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f14_plan_preview",
      "actualLabel": "Plan preview",
      "cursor": 19,
      "total": 29,
      "title": "Built around your moment.",
      "text": "Built around your moment.\n1\nProtect bedtime\n2\nAdd Waiting Room to YouTube\n3\nStart with 9pm wind-down block + emergency access\n4\nReview progress after 7 days\n5\nExtend Family Sharing to up to 4 more phones\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 21,
      "id": "f15_product_proof",
      "label": "Product proof",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 20,
      "screenshot": "screenshots/021_main-path-teen-parent_f15-product-proof_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f15_product_proof",
      "actualLabel": "Product proof",
      "cursor": 20,
      "total": 29,
      "title": "The same Opal, on every phone in the house.",
      "text": "The same Opal, on every phone in the house.\nSelf-managed friction. No monitoring, no remote control.\nWaiting Room\nA 5-second pause before the reflex.\nSchedules\nBlock windows that protect your moments.\nFocus sessions\nStrict, no-bypass blocks when needed.\nReports\nStay private to each member's phone.\n Top-rated structure app on iOS.\nContinue",
      "imageCount": 4,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 22,
      "id": "f17a_household_hours",
      "label": "Question: household hours",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 21,
      "screenshot": "screenshots/022_main-path-teen-parent_f17a-household-hours_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f17a_household_hours",
      "actualLabel": "Household hours",
      "cursor": 21,
      "total": 29,
      "title": "How many hours a day are spent on phones in your household?",
      "text": "How many hours a day are spent on phones in your household?\nAverage across every phone in the house. Screen Time estimates are fine.\n2–3 hours\nLight\n4–5 hours\nAverage\n6–7 hours\nHeavy\n8+ hours\nAlways-on\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 23,
      "id": "f17b_parent_age",
      "label": "Question: parent age",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 22,
      "screenshot": "screenshots/023_main-path-teen-parent_f17b-parent-age_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f17b_parent_age",
      "actualLabel": "Parent age",
      "cursor": 22,
      "total": 29,
      "title": "And what's your age range?",
      "text": "And what's your age range?\nWe use this to project how household screen time stacks up over the years ahead.\n25–34\n35–44\n45+\n18–24\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 24,
      "id": "f17_email_gate",
      "label": "Email gate",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 23,
      "screenshot": "screenshots/024_main-path-teen-parent_f17-email-gate_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f17_email_gate",
      "actualLabel": "Email",
      "cursor": 23,
      "total": 29,
      "title": "Where should we send your plan?",
      "text": "Where should we send your plan?\nWe'll email your activation link and the invites for the rest of the household.\nEMAIL\nNo spam. No selling your data. Plan + product updates only.\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 25,
      "id": "f17c_projection_shock",
      "label": "Projection shock",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 24,
      "screenshot": "screenshots/025_main-path-teen-parent_f17c-projection-shock_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f17c_projection_shock",
      "actualLabel": "Projection (shock)",
      "cursor": 24,
      "total": 29,
      "title": "",
      "text": "Your household will spend 160 days on phones this year.\nThat puts your family on track to spend\n17\nYEARS\nof household life looking down\nat phones.\nProjection of your household's current screen-time habits,\nbased on an average 16 waking hours per day.\nFix this",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 26,
      "id": "f17d_projection_hope",
      "label": "Projection hope",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 25,
      "screenshot": "screenshots/026_main-path-teen-parent_f17d-projection-hope_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f17d_projection_hope",
      "actualLabel": "Projection (hope)",
      "cursor": 25,
      "total": 29,
      "title": "",
      "text": "The good news: Opal can give your household back\n5+\nYEARS\nof household life back. Protected dinners, real bedtimes, the weekends you wanted.\nAccording to your profile combined with the Opal program.\nI want those years",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 27,
      "id": "f18_plan_summary",
      "label": "Plan summary",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 26,
      "screenshot": "screenshots/027_main-path-teen-parent_f18-plan-summary_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f18_plan_summary",
      "actualLabel": "Plan summary",
      "cursor": 26,
      "total": 29,
      "title": "Here's what activates next.",
      "text": "Here's what activates next.\nWINDOW\nbedtime\nMAIN LOOP\nYouTube\nFIRST BOUNDARY\n9pm wind-down block + emergency access\nStarting style: strict block during one window.\nChoose my plan",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 28,
      "id": "f19_paywall",
      "label": "Paywall",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "RevenueCat packages stubbed locally. No real checkout.",
      "scroll": null,
      "special": null,
      "expectedCursor": 27,
      "screenshot": "screenshots/028_main-path-teen-parent_f19-paywall_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f19_paywall",
      "actualLabel": "Paywall",
      "cursor": 27,
      "total": 29,
      "title": "One subscription. Every phone in the house.",
      "text": "⏳\nSecure trial reserved for\n09:35\nContinue\nYOUR PLAN, READY\nOne subscription. Every phone in the house.\nBuilt around bedtime. Same Opal app on every phone in the house. Each member self-manages.\nMonthly\n$19.99 /month\nUS$0.67\nper day\nMOST POPULAR\nAnnual\n3 DAYS FREE\n$99.99 /year\nUS$0.27\nper day\nWeekly\n$8.99 /week\nUS$1.28\nper day\nStart 3 days trial\nSecure checkout. Cancel anytime.\n🛡️\n7-Day Money-Back Guarantee. Cancel anytime in one tap.\nWhat activates after checkout\nBedtime and homework windows live on your teen's phone, not on your enforcement.\n5-second Waiting Room\nA pause between the reach and the open. On every member's phone.\nSchedules per phone\nBlock the windows each person picked. No remote control, no nagging.\nNo-Bypass focus sessions\nStrict locks for the moments that matter most. Even from yourself.\nWind-down after 10pm\nPhones progressively lock so the night actually ends.\nPrivate reports\nEach member's data stays on their own phone. No shared dashboard, no monitoring.\nFamily Sharing seats\nOne subscription, 5 seats, up to 5 phones. Invites by email after checkout.\n1 million daily users trust Opal\nUsed in households where every phone runs its own copy.\n“We set one block from dinner to bedtime. Every phone in the house is in it. The room finally feels calmer.”\nDavid K., parent of two\nFrequently asked\nIs my payment secure?\n＋\nCan I cancel easily?\n＋\nDoes this work on iPhone?\n＋\nWhat if the app doesn't help me?\n＋\nWill you email me a lot?\n＋\nParents using Opal\nAPP STORE\n“I set one family block from dinner to bedtime. The phone is out of the loop, and the room feels calmer.”\nD",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 29,
      "id": "f20_handoff",
      "label": "Handoff",
      "group": "Main path: teen parent",
      "variant": "Teen parent · bedtime + homework · YouTube + games",
      "branch": null,
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 28,
      "screenshot": "screenshots/029_main-path-teen-parent_f20-handoff_teen-parent-bedtime-homework-youtube-games.png",
      "width": 414,
      "height": 896,
      "actualId": "f20_handoff",
      "actualLabel": "Handoff",
      "cursor": 28,
      "total": 29,
      "title": "Open Opal and activate your plan.",
      "text": "STEP 1 OF 2\nOpen Opal and activate your plan.\nYour subscription is ready. Open the Opal app on your phone to start.\nOpen Opal and activate Pro\nOr get Opal on Google Play\nStep 2, invite your family by email, appears after you open Opal.",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 30,
      "id": "f7_branch_1",
      "label": "Branch module 1",
      "group": "Branch variants",
      "variant": "Parent-first branch",
      "branch": "parent_first",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 9,
      "screenshot": "screenshots/030_branch-variants_f7-branch-1_parent-first-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f7_branch_1",
      "actualLabel": "Branch 1",
      "cursor": 9,
      "total": 29,
      "title": "When is your phone most visible to your kids?",
      "text": "When is your phone most visible to your kids?\nMorning checking\nSocial apps at night\nWhile with my kids\nDuring work\nIn bed\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 31,
      "id": "f8_branch_2",
      "label": "Branch module 2",
      "group": "Branch variants",
      "variant": "Parent-first branch",
      "branch": "parent_first",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 10,
      "screenshot": "screenshots/031_branch-variants_f8-branch-2_parent-first-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f8_branch_2",
      "actualLabel": "Branch 2",
      "cursor": 10,
      "total": 29,
      "title": "Kids learn the default before the rule.",
      "text": "Kids learn the default before the rule.\nIf the home default is \"phones fill every gap,\" every rule will feel arbitrary. The most powerful thing a parent can do is change the default, starting with their own phone.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 32,
      "id": "f9_branch_3",
      "label": "Branch module 3",
      "group": "Branch variants",
      "variant": "Parent-first branch",
      "branch": "parent_first",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 11,
      "screenshot": "screenshots/032_branch-variants_f9-branch-3_parent-first-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f9_branch_3",
      "actualLabel": "Branch 3",
      "cursor": 11,
      "total": 29,
      "title": "What would feel like a real first win?",
      "text": "What would feel like a real first win?\nNo phone in bed\nLess scrolling around my kids\nPhone-free dinner\nBetter sleep\nFewer pickups\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 33,
      "id": "f11_diagnosis",
      "label": "Diagnosis",
      "group": "Branch variants",
      "variant": "Parent-first branch",
      "branch": "parent_first",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 13,
      "screenshot": "screenshots/033_branch-variants_f11-diagnosis_parent-first-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f11_diagnosis",
      "actualLabel": "Diagnosis",
      "cursor": 13,
      "total": 29,
      "title": "Here's what's actually going on.",
      "text": "Here's what's actually going on.\nWINDOW\ndinner\nMAIN LOOP\nyour own scrolling\nFIRST BOUNDARY\nphone-free dinner window\nYour family's phone habits start with your own default. The first win is making your phone less available during dinner. Your plan starts with phone-free dinner window. You can extend Family Sharing to the rest of the house from there.\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 34,
      "id": "f14_plan_preview",
      "label": "Plan preview",
      "group": "Branch variants",
      "variant": "Parent-first branch",
      "branch": "parent_first",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 19,
      "screenshot": "screenshots/034_branch-variants_f14-plan-preview_parent-first-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f14_plan_preview",
      "actualLabel": "Plan preview",
      "cursor": 19,
      "total": 29,
      "title": "Built around your moment.",
      "text": "Built around your moment.\n1\nProtect dinner\n2\nAdd Waiting Room to your own scrolling\n3\nStart with phone-free dinner window\n4\nReview progress after 7 days\n5\nExtend Family Sharing to up to 4 more phones\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 35,
      "id": "f18_plan_summary",
      "label": "Plan summary",
      "group": "Branch variants",
      "variant": "Parent-first branch",
      "branch": "parent_first",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 26,
      "screenshot": "screenshots/035_branch-variants_f18-plan-summary_parent-first-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f18_plan_summary",
      "actualLabel": "Plan summary",
      "cursor": 26,
      "total": 29,
      "title": "Here's what activates next.",
      "text": "Here's what activates next.\nWINDOW\ndinner\nMAIN LOOP\nyour own scrolling\nFIRST BOUNDARY\nphone-free dinner window\nStarting style: parent starts first.\nChoose my plan",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 36,
      "id": "f19_paywall",
      "label": "Paywall",
      "group": "Branch variants",
      "variant": "Parent-first branch",
      "branch": "parent_first",
      "note": "Branch-specific paywall header / benefits.",
      "scroll": null,
      "special": null,
      "expectedCursor": 27,
      "screenshot": "screenshots/036_branch-variants_f19-paywall_parent-first-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f19_paywall",
      "actualLabel": "Paywall",
      "cursor": 27,
      "total": 29,
      "title": "Start with the phone your kids see most.",
      "text": "⏳\nSecure trial reserved for\n09:30\nContinue\nYOUR PLAN, READY\nStart with the phone your kids see most.\nBuilt around dinner. Same Opal app on every phone in the house. Each member self-manages.\nMonthly\n$19.99 /month\nUS$0.67\nper day\nMOST POPULAR\nAnnual\n3 DAYS FREE\n$99.99 /year\nUS$0.27\nper day\nWeekly\n$8.99 /week\nUS$1.28\nper day\nStart 3 days trial\nSecure checkout. Cancel anytime.\n🛡️\n7-Day Money-Back Guarantee. Cancel anytime in one tap.\nWhat activates after checkout\nKids learn the rhythm of the house before they learn the rule.\n5-second Waiting Room\nA pause between the reach and the open. On every member's phone.\nSchedules per phone\nBlock the windows each person picked. No remote control, no nagging.\nNo-Bypass focus sessions\nStrict locks for the moments that matter most. Even from yourself.\nWind-down after 10pm\nPhones progressively lock so the night actually ends.\nPrivate reports\nEach member's data stays on their own phone. No shared dashboard, no monitoring.\nFamily Sharing seats\nOne subscription, 5 seats, up to 5 phones. Invites by email after checkout.\n1 million daily users trust Opal\nUsed in households where every phone runs its own copy.\n“We set one block from dinner to bedtime. Every phone in the house is in it. The room finally feels calmer.”\nDavid K., parent of two\nFrequently asked\nIs my payment secure?\n＋\nCan I cancel easily?\n＋\nDoes this work on iPhone?\n＋\nWhat if the app doesn't help me?\n＋\nWill you email me a lot?\n＋\nParents using Opal\nAPP STORE\n“I set one family block from dinner to bedtime. The phone is out of the loop, and the room feels calmer.”\nDavid K., 41\nparent\nAPP",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 37,
      "id": "f20_handoff",
      "label": "Handoff",
      "group": "Branch variants",
      "variant": "Parent-first branch",
      "branch": "parent_first",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 28,
      "screenshot": "screenshots/037_branch-variants_f20-handoff_parent-first-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f20_handoff",
      "actualLabel": "Handoff",
      "cursor": 28,
      "total": 29,
      "title": "Open Opal and activate your plan.",
      "text": "STEP 1 OF 2\nOpen Opal and activate your plan.\nYour subscription is ready. Open the Opal app on your phone to start.\nOpen Opal and activate Pro\nOr get Opal on Google Play\nStep 2, invite your family by email, appears after you open Opal.",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 38,
      "id": "f7_branch_1",
      "label": "Branch module 1",
      "group": "Branch variants",
      "variant": "New-parent branch",
      "branch": "new_parent",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 9,
      "screenshot": "screenshots/038_branch-variants_f7-branch-1_new-parent-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f7_branch_1",
      "actualLabel": "Branch 1",
      "cursor": 9,
      "total": 29,
      "title": "When does your phone pull you most?",
      "text": "When does your phone pull you most?\nFeeding\nNap-trapped\nLate night\nWhen the baby finally sleeps\nWhen I'm overwhelmed\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 39,
      "id": "f8_branch_2",
      "label": "Branch module 2",
      "group": "Branch variants",
      "variant": "New-parent branch",
      "branch": "new_parent",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 10,
      "screenshot": "screenshots/039_branch-variants_f8-branch-2_new-parent-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f8_branch_2",
      "actualLabel": "Branch 2",
      "cursor": 10,
      "total": 29,
      "title": "Willpower fails when you are depleted.",
      "text": "Willpower fails when you are depleted.\nEarly parenthood depletes willpower. The phone is the most available escape. Structure holds the boundary when energy fails.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 40,
      "id": "f9_branch_3",
      "label": "Branch module 3",
      "group": "Branch variants",
      "variant": "New-parent branch",
      "branch": "new_parent",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 11,
      "screenshot": "screenshots/040_branch-variants_f9-branch-3_new-parent-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f9_branch_3",
      "actualLabel": "Branch 3",
      "cursor": 11,
      "total": 29,
      "title": "Which moment do you want to protect first?",
      "text": "Which moment do you want to protect first?\nFeeding\nBedtime\nLate night\nMorning with my child\nMy own sleep\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 41,
      "id": "f11_diagnosis",
      "label": "Diagnosis",
      "group": "Branch variants",
      "variant": "New-parent branch",
      "branch": "new_parent",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 13,
      "screenshot": "screenshots/041_branch-variants_f11-diagnosis_new-parent-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f11_diagnosis",
      "actualLabel": "Diagnosis",
      "cursor": 13,
      "total": 29,
      "title": "Here's what's actually going on.",
      "text": "Here's what's actually going on.\nWINDOW\nexhausted parent moments\nMAIN LOOP\nyour own scrolling\nFIRST BOUNDARY\ngentle block during depleted moments\nYour highest-risk loop is exhausted scrolling around exhausted parent moments. Your phone is most available when your energy is lowest. Your plan starts with gentle block during depleted moments. It runs gently on your own phone before anything else.\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 42,
      "id": "f14_plan_preview",
      "label": "Plan preview",
      "group": "Branch variants",
      "variant": "New-parent branch",
      "branch": "new_parent",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 19,
      "screenshot": "screenshots/042_branch-variants_f14-plan-preview_new-parent-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f14_plan_preview",
      "actualLabel": "Plan preview",
      "cursor": 19,
      "total": 29,
      "title": "Built around your moment.",
      "text": "Built around your moment.\n1\nProtect exhausted parent moments\n2\nAdd Waiting Room to your own scrolling\n3\nStart with gentle block during depleted moments\n4\nReview progress after 7 days\nContinue",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 43,
      "id": "f18_plan_summary",
      "label": "Plan summary",
      "group": "Branch variants",
      "variant": "New-parent branch",
      "branch": "new_parent",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 26,
      "screenshot": "screenshots/043_branch-variants_f18-plan-summary_new-parent-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f18_plan_summary",
      "actualLabel": "Plan summary",
      "cursor": 26,
      "total": 29,
      "title": "Here's what activates next.",
      "text": "Here's what activates next.\nWINDOW\nexhausted parent moments\nMAIN LOOP\nyour own scrolling\nFIRST BOUNDARY\ngentle block during depleted moments\nStarting style: gentle friction first.\nChoose my plan",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 44,
      "id": "f19_paywall",
      "label": "Paywall",
      "group": "Branch variants",
      "variant": "New-parent branch",
      "branch": "new_parent",
      "note": "Branch-specific paywall header / benefits.",
      "scroll": null,
      "special": null,
      "expectedCursor": 27,
      "screenshot": "screenshots/044_branch-variants_f19-paywall_new-parent-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f19_paywall",
      "actualLabel": "Paywall",
      "cursor": 27,
      "total": 29,
      "title": "Protect the moments you do not get back.",
      "text": "⏳\nSecure trial reserved for\n09:25\nContinue\nYOUR PLAN, READY\nProtect the moments you do not get back.\nBuilt around exhausted parent moments. Same Opal app on every phone in the house. Each member self-manages.\nMonthly\n$19.99 /month\nUS$0.67\nper day\nMOST POPULAR\nAnnual\n3 DAYS FREE\n$99.99 /year\nUS$0.27\nper day\nWeekly\n$8.99 /week\nUS$1.28\nper day\nStart 3 days trial\nSecure checkout. Cancel anytime.\n🛡️\n7-Day Money-Back Guarantee. Cancel anytime in one tap.\nWhat activates after checkout\nSocial apps stay out of your most depleted moments.\n5-second Waiting Room\nA pause between the reach and the open. On every member's phone.\nSchedules per phone\nBlock the windows each person picked. No remote control, no nagging.\nNo-Bypass focus sessions\nStrict locks for the moments that matter most. Even from yourself.\nWind-down after 10pm\nPhones progressively lock so the night actually ends.\nPrivate reports\nEach member's data stays on their own phone. No shared dashboard, no monitoring.\nFamily Sharing seats\nOne subscription, 5 seats, up to 5 phones. Invites by email after checkout.\n1 million daily users trust Opal\nUsed in households where every phone runs its own copy.\n“We set one block from dinner to bedtime. Every phone in the house is in it. The room finally feels calmer.”\nDavid K., parent of two\nFrequently asked\nIs my payment secure?\n＋\nCan I cancel easily?\n＋\nDoes this work on iPhone?\n＋\nWhat if the app doesn't help me?\n＋\nWill you email me a lot?\n＋\nParents using Opal\nAPP STORE\n“I set one family block from dinner to bedtime. The phone is out of the loop, and the room feels calmer.”\nDavid K., 41\npar",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 45,
      "id": "f20_handoff",
      "label": "Handoff",
      "group": "Branch variants",
      "variant": "New-parent branch",
      "branch": "new_parent",
      "note": "",
      "scroll": null,
      "special": null,
      "expectedCursor": 28,
      "screenshot": "screenshots/045_branch-variants_f20-handoff_new-parent-branch.png",
      "width": 414,
      "height": 896,
      "actualId": "f20_handoff",
      "actualLabel": "Handoff",
      "cursor": 28,
      "total": 29,
      "title": "Open Opal and activate your plan.",
      "text": "STEP 1 OF 1\nOpen Opal and activate your plan.\nYour subscription is ready. Open the Opal app on your phone to start.\nOpen Opal and activate Pro\nOr get Opal on Google Play",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 46,
      "id": "f2b_conflict_reinforce",
      "label": "Reinforcement: conflict window",
      "group": "Conflict reinforcement variants",
      "variant": "morning",
      "branch": null,
      "note": "Single-pick variant with its own artwork and copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 2,
      "screenshot": "screenshots/046_conflict-reinforcement-variants_f2b-conflict-reinforce_morning.png",
      "width": 414,
      "height": 896,
      "actualId": "f2b_conflict_reinforce",
      "actualLabel": "Conflict reinforce",
      "cursor": 2,
      "total": 29,
      "title": "The morning disappears before breakfast.",
      "text": "The morning disappears before breakfast.\nA quick check of a single notification turns into thirty minutes lost in bed. Opal delays the apps so everyone actually gets to the table.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 47,
      "id": "f2b_conflict_reinforce",
      "label": "Reinforcement: conflict window",
      "group": "Conflict reinforcement variants",
      "variant": "homework",
      "branch": null,
      "note": "Single-pick variant with its own artwork and copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 2,
      "screenshot": "screenshots/047_conflict-reinforcement-variants_f2b-conflict-reinforce_homework.png",
      "width": 414,
      "height": 896,
      "actualId": "f2b_conflict_reinforce",
      "actualLabel": "Conflict reinforce",
      "cursor": 2,
      "total": 29,
      "title": "Math problems lose to group chats.",
      "text": "Math problems lose to group chats.\nEvery notification pulls attention away from the textbook and into a different room. Opal keeps the phone quiet so the assignment actually gets finished.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 48,
      "id": "f2b_conflict_reinforce",
      "label": "Reinforcement: conflict window",
      "group": "Conflict reinforcement variants",
      "variant": "dinner",
      "branch": null,
      "note": "Single-pick variant with its own artwork and copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 2,
      "screenshot": "screenshots/048_conflict-reinforcement-variants_f2b-conflict-reinforce_dinner.png",
      "width": 414,
      "height": 896,
      "actualId": "f2b_conflict_reinforce",
      "actualLabel": "Conflict reinforce",
      "cursor": 2,
      "total": 29,
      "title": "The phone sits right next to the plate.",
      "text": "The phone sits right next to the plate.\nShared meals fracture the second a screen lights up on the table. Opal keeps the apps locked so dinner stays a meal.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 49,
      "id": "f2b_conflict_reinforce",
      "label": "Reinforcement: conflict window",
      "group": "Conflict reinforcement variants",
      "variant": "bedtime",
      "branch": null,
      "note": "Single-pick variant with its own artwork and copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 2,
      "screenshot": "screenshots/049_conflict-reinforcement-variants_f2b-conflict-reinforce_bedtime.png",
      "width": 414,
      "height": 896,
      "actualId": "f2b_conflict_reinforce",
      "actualLabel": "Conflict reinforce",
      "cursor": 2,
      "total": 29,
      "title": "The hallway light is still on at midnight.",
      "text": "The hallway light is still on at midnight.\nBy the time you ask them to put the phone down, you are too tired to argue. Opal enforces a hard cutoff so everyone actually goes to sleep.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 50,
      "id": "f2b_conflict_reinforce",
      "label": "Reinforcement: conflict window",
      "group": "Conflict reinforcement variants",
      "variant": "weekends",
      "branch": null,
      "note": "Single-pick variant with its own artwork and copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 2,
      "screenshot": "screenshots/050_conflict-reinforcement-variants_f2b-conflict-reinforce_weekends.png",
      "width": 414,
      "height": 896,
      "actualId": "f2b_conflict_reinforce",
      "actualLabel": "Conflict reinforce",
      "cursor": 2,
      "total": 29,
      "title": "Saturday afternoon vanishes into a feed.",
      "text": "Saturday afternoon vanishes into a feed.\nWhen there is no school bell to ring, the phone fills every quiet hour. Opal secures the morning and night while leaving the rest of the weekend open.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 51,
      "id": "f2b_conflict_reinforce",
      "label": "Reinforcement: conflict window",
      "group": "Conflict reinforcement variants",
      "variant": "exhausted_parent",
      "branch": null,
      "note": "Single-pick variant with its own artwork and copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 2,
      "screenshot": "screenshots/051_conflict-reinforcement-variants_f2b-conflict-reinforce_exhausted-parent.png",
      "width": 414,
      "height": 896,
      "actualId": "f2b_conflict_reinforce",
      "actualLabel": "Conflict reinforce",
      "cursor": 2,
      "total": 29,
      "title": "You are already done by nine.",
      "text": "You are already done by nine.\nEnforcing bedtime takes energy you simply do not have after a long day. Opal steps in so you stop playing the bad guy.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 52,
      "id": "f2b_conflict_reinforce",
      "label": "Reinforcement: conflict window",
      "group": "Conflict reinforcement variants",
      "variant": "combo: bedtime + dinner",
      "branch": null,
      "note": "Two-pick hand-authored combo copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 2,
      "screenshot": "screenshots/052_conflict-reinforcement-variants_f2b-conflict-reinforce_combo-bedtime-dinner.png",
      "width": 414,
      "height": 896,
      "actualId": "f2b_conflict_reinforce",
      "actualLabel": "Conflict reinforce",
      "cursor": 2,
      "total": 29,
      "title": "The dinner arguments bleed into midnight scrolls.",
      "text": "The dinner arguments bleed into midnight scrolls.\nOpal secures the table and holds the line until morning so you can finally stop nagging.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 53,
      "id": "f2b_conflict_reinforce",
      "label": "Reinforcement: conflict window",
      "group": "Conflict reinforcement variants",
      "variant": "combo: morning + homework + dinner",
      "branch": null,
      "note": "3+ pick templated combo copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 2,
      "screenshot": "screenshots/053_conflict-reinforcement-variants_f2b-conflict-reinforce_combo-morning-homework-dinner.png",
      "width": 414,
      "height": 896,
      "actualId": "f2b_conflict_reinforce",
      "actualLabel": "Conflict reinforce",
      "cursor": 2,
      "total": 29,
      "title": "3 difficult times of day.",
      "text": "3 difficult times of day.\nOpal quiets down mornings, homework hours, and dinner. The blocks happen directly on the device so you do not have to fight about it.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 54,
      "id": "f6b_prior_attempt_reinforce",
      "label": "Reinforcement: prior attempts",
      "group": "Prior-attempt reinforcement variants",
      "variant": "apple_screen_time",
      "branch": null,
      "note": "Single-pick variant with its own artwork and copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 8,
      "screenshot": "screenshots/054_prior-attempt-reinforcement-variants_f6b-prior-attempt-reinforce_apple-screen-time.png",
      "width": 414,
      "height": 896,
      "actualId": "f6b_prior_attempt_reinforce",
      "actualLabel": "Prior attempt reinforce",
      "cursor": 8,
      "total": 29,
      "title": "They already memorized the passcode.",
      "text": "They already memorized the passcode.\nNative Apple limits fall apart the moment a child taps ignore for fifteen more minutes. Opal adds a 5-second Waiting Room that completely stops the reflex.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 55,
      "id": "f6b_prior_attempt_reinforce",
      "label": "Reinforcement: prior attempts",
      "group": "Prior-attempt reinforcement variants",
      "variant": "taking_phone",
      "branch": null,
      "note": "Single-pick variant with its own artwork and copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 8,
      "screenshot": "screenshots/055_prior-attempt-reinforcement-variants_f6b-prior-attempt-reinforce_taking-phone.png",
      "width": 414,
      "height": 896,
      "actualId": "f6b_prior_attempt_reinforce",
      "actualLabel": "Prior attempt reinforce",
      "cursor": 8,
      "total": 29,
      "title": "Confiscation turns into a shouting match.",
      "text": "Confiscation turns into a shouting match.\nTaking the device away works for one night but destroys trust by morning. Opal blocks the distraction while leaving the physical phone right where it is.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 56,
      "id": "f6b_prior_attempt_reinforce",
      "label": "Reinforcement: prior attempts",
      "group": "Prior-attempt reinforcement variants",
      "variant": "family_rules",
      "branch": null,
      "note": "Single-pick variant with its own artwork and copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 8,
      "screenshot": "screenshots/056_prior-attempt-reinforcement-variants_f6b-prior-attempt-reinforce_family-rules.png",
      "width": 414,
      "height": 896,
      "actualId": "f6b_prior_attempt_reinforce",
      "actualLabel": "Prior attempt reinforce",
      "cursor": 8,
      "total": 29,
      "title": "The kitchen table promise fades by evening.",
      "text": "The kitchen table promise fades by evening.\nVerbal agreements work perfectly until the algorithm pulls them back in. Opal runs locally to hold the boundary when conversations fail.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 57,
      "id": "f6b_prior_attempt_reinforce",
      "label": "Reinforcement: prior attempts",
      "group": "Prior-attempt reinforcement variants",
      "variant": "timers",
      "branch": null,
      "note": "Single-pick variant with its own artwork and copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 8,
      "screenshot": "screenshots/057_prior-attempt-reinforcement-variants_f6b-prior-attempt-reinforce_timers.png",
      "width": 414,
      "height": 896,
      "actualId": "f6b_prior_attempt_reinforce",
      "actualLabel": "Prior attempt reinforce",
      "cursor": 8,
      "total": 29,
      "title": "The timer ends and the begging begins.",
      "text": "The timer ends and the begging begins.\nA countdown just sets a hard deadline for the next argument over five more minutes. Opal stops the app from opening in the first place.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 58,
      "id": "f6b_prior_attempt_reinforce",
      "label": "Reinforcement: prior attempts",
      "group": "Prior-attempt reinforcement variants",
      "variant": "talking",
      "branch": null,
      "note": "Single-pick variant with its own artwork and copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 8,
      "screenshot": "screenshots/058_prior-attempt-reinforcement-variants_f6b-prior-attempt-reinforce_talking.png",
      "width": 414,
      "height": 896,
      "actualId": "f6b_prior_attempt_reinforce",
      "actualLabel": "Prior attempt reinforce",
      "cursor": 8,
      "total": 29,
      "title": "Good intentions lose to endless scrolls.",
      "text": "Good intentions lose to endless scrolls.\nYou can agree on boundaries all afternoon but the feed is designed to keep them awake. Opal backs up the conversation with a silent block.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 59,
      "id": "f6b_prior_attempt_reinforce",
      "label": "Reinforcement: prior attempts",
      "group": "Prior-attempt reinforcement variants",
      "variant": "none",
      "branch": null,
      "note": "Single-pick variant with its own artwork and copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 8,
      "screenshot": "screenshots/059_prior-attempt-reinforcement-variants_f6b-prior-attempt-reinforce_none.png",
      "width": 414,
      "height": 896,
      "actualId": "f6b_prior_attempt_reinforce",
      "actualLabel": "Prior attempt reinforce",
      "cursor": 8,
      "total": 29,
      "title": "The nightly arguments are just starting.",
      "text": "The nightly arguments are just starting.\nYou see the phone taking over and want to stop it before the real fights begin. Opal sets a clear boundary before habits get too entrenched.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 60,
      "id": "f6b_prior_attempt_reinforce",
      "label": "Reinforcement: prior attempts",
      "group": "Prior-attempt reinforcement variants",
      "variant": "collapses",
      "branch": null,
      "note": "Single-pick variant with its own artwork and copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 8,
      "screenshot": "screenshots/060_prior-attempt-reinforcement-variants_f6b-prior-attempt-reinforce_collapses.png",
      "width": 414,
      "height": 896,
      "actualId": "f6b_prior_attempt_reinforce",
      "actualLabel": "Prior attempt reinforce",
      "cursor": 8,
      "total": 29,
      "title": "Every new rule falls apart in a week.",
      "text": "Every new rule falls apart in a week.\nYou try a new approach and it works until you are too tired to enforce it. Opal holds the line even when your own motivation is completely gone.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 61,
      "id": "f6b_prior_attempt_reinforce",
      "label": "Reinforcement: prior attempts",
      "group": "Prior-attempt reinforcement variants",
      "variant": "combo: Apple Screen Time + family rules",
      "branch": null,
      "note": "Two-pick hand-authored combo copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 8,
      "screenshot": "screenshots/061_prior-attempt-reinforcement-variants_f6b-prior-attempt-reinforce_combo-apple-screen-time-family-rules.png",
      "width": 414,
      "height": 896,
      "actualId": "f6b_prior_attempt_reinforce",
      "actualLabel": "Prior attempt reinforce",
      "cursor": 8,
      "total": 29,
      "title": "Verbal warnings and Apple limits both get ignored.",
      "text": "Verbal warnings and Apple limits both get ignored.\nOpal steps in when the kitchen table talk fails and they bypass Screen Time again.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 62,
      "id": "f6b_prior_attempt_reinforce",
      "label": "Reinforcement: prior attempts",
      "group": "Prior-attempt reinforcement variants",
      "variant": "combo: timers + talking + collapses",
      "branch": null,
      "note": "3+ pick templated combo copy.",
      "scroll": null,
      "special": null,
      "expectedCursor": 8,
      "screenshot": "screenshots/062_prior-attempt-reinforcement-variants_f6b-prior-attempt-reinforce_combo-timers-talking-collapses.png",
      "width": 414,
      "height": 896,
      "actualId": "f6b_prior_attempt_reinforce",
      "actualLabel": "Prior attempt reinforce",
      "cursor": 8,
      "total": 29,
      "title": "Every past attempt demanded your constant attention.",
      "text": "Every past attempt demanded your constant attention.\ntimers, talking it through, and rules that collapse all forced you to play the bad guy. Opal shifts the boundary onto the phone so you can just be a parent.\nContinue",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 63,
      "id": "f19_paywall",
      "label": "Paywall",
      "group": "Paywall scroll states",
      "variant": "Teen parent paywall · middle",
      "branch": null,
      "note": "Same paywall screen, scrolled to expose the long-form sections.",
      "scroll": "middle",
      "special": null,
      "expectedCursor": 27,
      "screenshot": "screenshots/063_paywall-scroll-states_f19-paywall_teen-parent-paywall-middle_middle.png",
      "width": 414,
      "height": 896,
      "actualId": "f19_paywall",
      "actualLabel": "Paywall",
      "cursor": 27,
      "total": 29,
      "title": "One subscription. Every phone in the house.",
      "text": "⏳\nSecure trial reserved for\n09:11\nContinue\nYOUR PLAN, READY\nOne subscription. Every phone in the house.\nBuilt around bedtime. Same Opal app on every phone in the house. Each member self-manages.\nMonthly\n$19.99 /month\nUS$0.67\nper day\nMOST POPULAR\nAnnual\n3 DAYS FREE\n$99.99 /year\nUS$0.27\nper day\nWeekly\n$8.99 /week\nUS$1.28\nper day\nStart 3 days trial\nSecure checkout. Cancel anytime.\n🛡️\n7-Day Money-Back Guarantee. Cancel anytime in one tap.\nWhat activates after checkout\nBedtime and homework windows live on your teen's phone, not on your enforcement.\n5-second Waiting Room\nA pause between the reach and the open. On every member's phone.\nSchedules per phone\nBlock the windows each person picked. No remote control, no nagging.\nNo-Bypass focus sessions\nStrict locks for the moments that matter most. Even from yourself.\nWind-down after 10pm\nPhones progressively lock so the night actually ends.\nPrivate reports\nEach member's data stays on their own phone. No shared dashboard, no monitoring.\nFamily Sharing seats\nOne subscription, 5 seats, up to 5 phones. Invites by email after checkout.\n1 million daily users trust Opal\nUsed in households where every phone runs its own copy.\n“We set one block from dinner to bedtime. Every phone in the house is in it. The room finally feels calmer.”\nDavid K., parent of two\nFrequently asked\nIs my payment secure?\n＋\nCan I cancel easily?\n＋\nDoes this work on iPhone?\n＋\nWhat if the app doesn't help me?\n＋\nWill you email me a lot?\n＋\nParents using Opal\nAPP STORE\n“I set one family block from dinner to bedtime. The phone is out of the loop, and the room feels calmer.”\nD",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 64,
      "id": "f19_paywall",
      "label": "Paywall",
      "group": "Paywall scroll states",
      "variant": "Teen parent paywall · bottom",
      "branch": null,
      "note": "Same paywall screen, scrolled to expose the long-form sections.",
      "scroll": "bottom",
      "special": null,
      "expectedCursor": 27,
      "screenshot": "screenshots/064_paywall-scroll-states_f19-paywall_teen-parent-paywall-bottom_bottom.png",
      "width": 414,
      "height": 896,
      "actualId": "f19_paywall",
      "actualLabel": "Paywall",
      "cursor": 27,
      "total": 29,
      "title": "One subscription. Every phone in the house.",
      "text": "⏳\nSecure trial reserved for\n09:10\nContinue\nYOUR PLAN, READY\nOne subscription. Every phone in the house.\nBuilt around bedtime. Same Opal app on every phone in the house. Each member self-manages.\nMonthly\n$19.99 /month\nUS$0.67\nper day\nMOST POPULAR\nAnnual\n3 DAYS FREE\n$99.99 /year\nUS$0.27\nper day\nWeekly\n$8.99 /week\nUS$1.28\nper day\nStart 3 days trial\nSecure checkout. Cancel anytime.\n🛡️\n7-Day Money-Back Guarantee. Cancel anytime in one tap.\nWhat activates after checkout\nBedtime and homework windows live on your teen's phone, not on your enforcement.\n5-second Waiting Room\nA pause between the reach and the open. On every member's phone.\nSchedules per phone\nBlock the windows each person picked. No remote control, no nagging.\nNo-Bypass focus sessions\nStrict locks for the moments that matter most. Even from yourself.\nWind-down after 10pm\nPhones progressively lock so the night actually ends.\nPrivate reports\nEach member's data stays on their own phone. No shared dashboard, no monitoring.\nFamily Sharing seats\nOne subscription, 5 seats, up to 5 phones. Invites by email after checkout.\n1 million daily users trust Opal\nUsed in households where every phone runs its own copy.\n“We set one block from dinner to bedtime. Every phone in the house is in it. The room finally feels calmer.”\nDavid K., parent of two\nFrequently asked\nIs my payment secure?\n＋\nCan I cancel easily?\n＋\nDoes this work on iPhone?\n＋\nWhat if the app doesn't help me?\n＋\nWill you email me a lot?\n＋\nParents using Opal\nAPP STORE\n“I set one family block from dinner to bedtime. The phone is out of the loop, and the room feels calmer.”\nD",
      "imageCount": 1,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 65,
      "id": "f20_handoff",
      "label": "Handoff",
      "group": "Handoff internal states",
      "variant": "Family invite form",
      "branch": null,
      "note": "Internal state after activation click, before inviting family.",
      "scroll": null,
      "special": "handoff_invite",
      "expectedCursor": 28,
      "screenshot": "screenshots/065_handoff-internal-states_f20-handoff_family-invite-form_handoff_invite.png",
      "width": 414,
      "height": 896,
      "actualId": "f20_handoff",
      "actualLabel": "Handoff",
      "cursor": 28,
      "total": 29,
      "title": "Invite your family.",
      "text": "STEP 2 OF 2\nInvite your family.\nEach person receives a redemption link. They install Opal and manage their own settings.\nAdd at least one email\nI'll invite them later",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 66,
      "id": "f20_handoff",
      "label": "Handoff",
      "group": "Handoff internal states",
      "variant": "Invites queued confirmation",
      "branch": null,
      "note": "Internal state after one invite is queued.",
      "scroll": null,
      "special": "handoff_done",
      "expectedCursor": 28,
      "screenshot": "screenshots/066_handoff-internal-states_f20-handoff_invites-queued-confirmation_handoff_done.png",
      "width": 414,
      "height": 896,
      "actualId": "f20_handoff",
      "actualLabel": "Handoff",
      "cursor": 28,
      "total": 29,
      "title": "1 invite queued.",
      "text": "1 invite queued.\nEach invite sends a redemption link. They install Opal on their own phone and self-manage from there.",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    },
    {
      "number": 67,
      "id": "f20_handoff",
      "label": "Handoff",
      "group": "Handoff internal states",
      "variant": "Solo activation",
      "branch": null,
      "note": "Solo path: no family invite step shown.",
      "scroll": null,
      "special": null,
      "expectedCursor": 28,
      "screenshot": "screenshots/067_handoff-internal-states_f20-handoff_solo-activation.png",
      "width": 414,
      "height": 896,
      "actualId": "f20_handoff",
      "actualLabel": "Handoff",
      "cursor": 28,
      "total": 29,
      "title": "Open Opal and activate your plan.",
      "text": "STEP 1 OF 1\nOpen Opal and activate your plan.\nYour subscription is ready. Open the Opal app on your phone to start.\nOpen Opal and activate Pro\nOr get Opal on Google Play",
      "imageCount": 0,
      "brokenVisibleImages": [],
      "scrollables": [],
      "mismatch": false,
      "scrollInfo": null,
      "recentConsole": [
        {
          "type": "error",
          "text": "Failed to load resource: the server responded with a status of 404 (Not Found)"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-45-plus-female.avif :: net::ERR_ABORTED"
        },
        {
          "type": "requestfailed",
          "text": "http://127.0.0.1:4179/assets/portraits/opal-portrait-35-44-male.avif :: net::ERR_ABORTED"
        }
      ]
    }
  ]
}