{
  "generatedAt": "2026-10-18T09:36:41.885Z",
  "startedAt": "2026-10-18T09:28:06.208Z",
  "durationMs": 435158.95,
  "followup": {
    "image": "sha256:22258ddcf6b779a6b0cc30c9ee373fc251a13ceeb9e52e31d4547fb47f043a82",
    "reason": "Local SSH forward closed; loopback listener absent while remote app remained healthy (HTTP 200). Restored a detached forward and repeated the eight connection-refused scenarios without changing test timeouts or application source. Cause of the SSH exit is unknown.",
    "startedAt": "2026-10-18T09:35:22.801Z",
    "durationMs": 63707.103,
    "count": 8,
    "passed": 8,
    "originalPassed": 45,
    "originalFailed": 8
  },
  "image": "sha256:22258ddcf6b779a6b0cc30c9ee373fc251a13ceeb9e52e31d4547fb47f043a82",
  "baseCommit": "3d188e3da5172e0fbe1ac44b1b0bb1ad0c4e171e",
  "scenarioFingerprint": "2e6ab5e633a28b74a4887640333245e06ec4b0718d2311e74c2d11727f1b844d",
  "ci": "GitHub Actions blocked by account billing; independent executions recorded here",
  "layers": [
    {
      "key": "unit",
      "title": "Юнит-тесты",
      "status": "passed",
      "count": 346,
      "checkedAt": "2026-10-18T09:02:37.377Z"
    },
    {
      "key": "postgres",
      "title": "Интеграция PostgreSQL",
      "status": "passed",
      "count": 137,
      "checkedAt": "2026-10-18T09:02:56.247Z"
    },
    {
      "key": "mobile",
      "title": "Мобильные финансовые сценарии RU/EN",
      "status": "not-run",
      "count": 0,
      "checkedAt": "2026-10-18T09:28:34.739Z"
    },
    {
      "key": "bank",
      "title": "BOG: HTTP и TLS-стенд банка",
      "status": "not-run",
      "count": 0,
      "checkedAt": "2026-10-18T09:28:34.739Z"
    }
  ],
  "tests": [
    {
      "id": "J46",
      "title": "J46 mobile booking: primary decision, separate tabs, cancellation dialog and persisted result",
      "status": "passed",
      "durationMs": 3400,
      "engine": "Chromium"
    },
    {
      "id": "J31",
      "title": "J31 WebKit phone/iPad: light and dark login, menu and theme-owned controls",
      "status": "passed",
      "durationMs": 18800,
      "engine": "WebKit / TLS"
    },
    {
      "id": "J32",
      "title": "J32 tourist registration in browser → saved profile → logout → login restores data",
      "status": "passed",
      "durationMs": 2194,
      "engine": "Chromium"
    },
    {
      "id": "J33",
      "title": "J33 supplier one-use link: real browser confirmation, token removed, replay denied",
      "status": "passed",
      "durationMs": 5211,
      "engine": "Chromium"
    },
    {
      "id": "J34",
      "title": "J34 tourist tabs preserve drafts, email and order navigation stay available",
      "status": "passed",
      "durationMs": 1486,
      "engine": "Chromium"
    },
    {
      "id": "J35",
      "title": "J35 operator filters auto-apply and removable chips clear one condition; create form supports Escape",
      "status": "passed",
      "durationMs": 2273,
      "engine": "Chromium"
    },
    {
      "id": "J36",
      "title": "J36 guide browser B2B creation closes once, resets form, legacy notification opens same request",
      "status": "passed",
      "durationMs": 2319,
      "engine": "Chromium"
    },
    {
      "id": "J37",
      "title": "J37 calendar return opens the correct tab and dialog; closing keeps the calendar selected",
      "status": "passed",
      "durationMs": 1235,
      "engine": "Chromium"
    },
    {
      "id": "J38",
      "title": "J38 expired-session notification survives login and opens the guide B2B request",
      "status": "passed",
      "durationMs": 1246,
      "engine": "Chromium"
    },
    {
      "id": "J39",
      "title": "J39 supplier price is entered in major units and round-trips through editing exactly",
      "status": "passed",
      "durationMs": 1735,
      "engine": "Chromium"
    },
    {
      "id": "J23",
      "title": "J23 GDPR: cancel guest booking → exact reference lookup → anonymization revokes capability",
      "status": "passed",
      "durationMs": 1745,
      "engine": "Chromium"
    },
    {
      "id": "J24",
      "title": "J24 staff access revoke invalidates existing session before next supplier operation",
      "status": "passed",
      "durationMs": 2112,
      "engine": "Chromium"
    },
    {
      "id": "J25",
      "title": "J25 2FA: enable real TOTP → wrong code denied → verify → old session revoked",
      "status": "passed",
      "durationMs": 2325,
      "engine": "Chromium"
    },
    {
      "id": "J26",
      "title": "J26 media: real upload to isolated S3 → public WebP → cover → deletion",
      "status": "passed",
      "durationMs": 1912,
      "engine": "Chromium"
    },
    {
      "id": "J27",
      "title": "J27 hero: malformed video denied, no media published by invalid upload",
      "status": "passed",
      "durationMs": 86,
      "engine": "Chromium"
    },
    {
      "id": "J28",
      "title": "J28 audit journal: ADMIN sees actions, OPERATOR denied, no password/guest token fields",
      "status": "passed",
      "durationMs": 81,
      "engine": "Chromium"
    },
    {
      "id": "J29",
      "title": "J29 supplier decline → alternative quote → replacement once, no duplicate commitment",
      "status": "passed",
      "durationMs": 2217,
      "engine": "Chromium"
    },
    {
      "id": "J30",
      "title": "J30 real notification workers record mock delivery for tourist, operator and supplier events",
      "status": "passed",
      "durationMs": 2848,
      "engine": "Chromium"
    },
    {
      "id": "J01",
      "title": "J01 catalog: category → destination → search → excursion and language",
      "status": "passed",
      "durationMs": 29257,
      "engine": "Chromium"
    },
    {
      "id": "J02",
      "title": "J02 tourist: save profile in browser → reload → form prefill",
      "status": "passed",
      "durationMs": 25564,
      "engine": "Chromium"
    },
    {
      "id": "J03",
      "title": "J03 tourist → operator UI confirms → tourist payment ready, DB agrees",
      "status": "passed",
      "durationMs": 3738,
      "engine": "Chromium"
    },
    {
      "id": "J04",
      "title": "J04 operator UI rejects with reason and tourist sees only own result",
      "status": "passed",
      "durationMs": 19475,
      "engine": "Chromium"
    },
    {
      "id": "J05",
      "title": "J05 operator CRM note survives reload",
      "status": "passed",
      "durationMs": 22398,
      "engine": "Chromium"
    },
    {
      "id": "J06",
      "title": "J06 guest capability: same idempotency key returns one booking; wrong token denied; cancellation persists",
      "status": "passed",
      "durationMs": 1736,
      "engine": "Chromium"
    },
    {
      "id": "J07",
      "title": "J07 capacity race: two tourists compete for last seat without overselling",
      "status": "passed",
      "durationMs": 20566,
      "engine": "Chromium"
    },
    {
      "id": "J08",
      "title": "J08 ownership and CSRF: tourist cannot read/cancel another booking or access staff APIs",
      "status": "passed",
      "durationMs": 21737,
      "engine": "Chromium"
    },
    {
      "id": "J09",
      "title": "J09 guide browser proposal → administrator rejection → guide edits → acceptance → publication",
      "status": "passed",
      "durationMs": 35218,
      "engine": "Chromium"
    },
    {
      "id": "J10",
      "title": "J10 guide isolation and schedule optimistic concurrency",
      "status": "passed",
      "durationMs": 3792,
      "engine": "Chromium"
    },
    {
      "id": "J11",
      "title": "J11 supplier draft → administrator publication → slot creation → guide visibility",
      "status": "passed",
      "durationMs": 334,
      "engine": "Chromium"
    },
    {
      "id": "J12",
      "title": "J12 guide request → supplier browser CONFIRMED → guide result and no tourist data exposure",
      "status": "passed",
      "durationMs": 3376,
      "engine": "Chromium"
    },
    {
      "id": "J13",
      "title": "J13 guide request → supplier browser DECLINED → guide result and no tourist data exposure",
      "status": "passed",
      "durationMs": 2722,
      "engine": "Chromium"
    },
    {
      "id": "J14",
      "title": "J14 supplier ownership, duplicate request and cancellation release seats",
      "status": "passed",
      "durationMs": 1809,
      "engine": "Chromium"
    },
    {
      "id": "J15",
      "title": "J15 partner referral survives booking and dashboard sees only own source",
      "status": "passed",
      "durationMs": 21006,
      "engine": "Chromium"
    },
    {
      "id": "J16",
      "title": "J16 administrator promo → public quote → redemption limit → disabled promo rejected",
      "status": "passed",
      "durationMs": 21886,
      "engine": "Chromium"
    },
    {
      "id": "J17",
      "title": "J17 CMS browser draft → publication → unpublished edits do not leak → unpublish",
      "status": "passed",
      "durationMs": 1293,
      "engine": "Chromium"
    },
    {
      "id": "J18",
      "title": "J18 collections: create → publish on homepage → draft revision conflict → unpublish",
      "status": "passed",
      "durationMs": 226,
      "engine": "Chromium"
    },
    {
      "id": "J19",
      "title": "J19 completed tourist review → moderation → guide reply → moderation → public rating",
      "status": "passed",
      "durationMs": 24241,
      "engine": "Chromium"
    },
    {
      "id": "J20",
      "title": "J20 email verification link is idempotent, malformed token denied, URL cleared",
      "status": "passed",
      "durationMs": 5088,
      "engine": "Chromium"
    },
    {
      "id": "J21",
      "title": "J21 password recovery UI changes credential, revokes old session, rejects mismatched confirmation",
      "status": "passed",
      "durationMs": 4053,
      "engine": "Chromium"
    },
    {
      "id": "J22",
      "title": "J22 logout in browser invalidates old cookie and hides profile",
      "status": "passed",
      "durationMs": 2026,
      "engine": "Chromium"
    },
    {
      "id": "J41",
      "title": "J41 wrong tourist login issues no session; all staff roles are denied tourist profile, bookings and payment APIs",
      "status": "passed",
      "durationMs": 1574,
      "engine": "Chromium"
    },
    {
      "id": "J42",
      "title": "J42 published supplier service exposes its net rate only to its owner, guides and administrators",
      "status": "passed",
      "durationMs": 161,
      "engine": "Chromium"
    },
    {
      "id": "J43",
      "title": "J43 excursion editor saves a real draft across sections and status dropdown publishes only after schedule is present",
      "status": "passed",
      "durationMs": 2291,
      "engine": "Chromium"
    },
    {
      "id": "J44",
      "title": "J44 refund conditions use numeric rows and save exact percentages; optional settings are separate",
      "status": "passed",
      "durationMs": 2300,
      "engine": "Chromium"
    },
    {
      "id": "J45",
      "title": "J45 partner focus checks access without clearing data or repeatedly fetching balances",
      "status": "passed",
      "durationMs": 1106,
      "engine": "Chromium"
    },
    {
      "id": "R-anonymous",
      "title": "R-anonymous all 14 static pages load with real role and no broken API or JS errors",
      "status": "passed",
      "durationMs": 56320,
      "engine": "Chromium",
      "attempts": [
        {
          "status": "failed",
          "startedAt": "2026-10-18T09:28:06.208Z"
        },
        {
          "status": "passed",
          "startedAt": "2026-10-18T09:35:22.801Z"
        }
      ]
    },
    {
      "id": "R-admin",
      "title": "R-admin all 23 static pages load with real role and no broken API or JS errors",
      "status": "passed",
      "durationMs": 18081,
      "engine": "Chromium",
      "attempts": [
        {
          "status": "failed",
          "startedAt": "2026-10-18T09:28:06.208Z"
        },
        {
          "status": "passed",
          "startedAt": "2026-10-18T09:35:22.801Z"
        }
      ]
    },
    {
      "id": "R-guide",
      "title": "R-guide all 6 static pages load with real role and no broken API or JS errors",
      "status": "passed",
      "durationMs": 4815,
      "engine": "Chromium",
      "attempts": [
        {
          "status": "failed",
          "startedAt": "2026-10-18T09:28:06.208Z"
        },
        {
          "status": "passed",
          "startedAt": "2026-10-18T09:35:22.801Z"
        }
      ]
    },
    {
      "id": "R-supplier",
      "title": "R-supplier all 3 static pages load with real role and no broken API or JS errors",
      "status": "passed",
      "durationMs": 2648,
      "engine": "Chromium",
      "attempts": [
        {
          "status": "failed",
          "startedAt": "2026-10-18T09:28:06.208Z"
        },
        {
          "status": "passed",
          "startedAt": "2026-10-18T09:35:22.801Z"
        }
      ]
    },
    {
      "id": "R-partner",
      "title": "R-partner all 3 static pages load with real role and no broken API or JS errors",
      "status": "passed",
      "durationMs": 2526,
      "engine": "Chromium",
      "attempts": [
        {
          "status": "failed",
          "startedAt": "2026-10-18T09:28:06.208Z"
        },
        {
          "status": "passed",
          "startedAt": "2026-10-18T09:35:22.801Z"
        }
      ]
    },
    {
      "id": "R-tourist",
      "title": "R-tourist all 1 static pages load with real role and no broken API or JS errors",
      "status": "passed",
      "durationMs": 1257,
      "engine": "Chromium",
      "attempts": [
        {
          "status": "failed",
          "startedAt": "2026-10-18T09:28:06.208Z"
        },
        {
          "status": "passed",
          "startedAt": "2026-10-18T09:35:22.801Z"
        }
      ]
    },
    {
      "id": "R-dynamic",
      "title": "R-dynamic editor routes load actual excursion and published CMS/collection IDs",
      "status": "passed",
      "durationMs": 3486,
      "engine": "Chromium",
      "attempts": [
        {
          "status": "failed",
          "startedAt": "2026-10-18T09:28:06.208Z"
        },
        {
          "status": "passed",
          "startedAt": "2026-10-18T09:35:22.801Z"
        }
      ]
    },
    {
      "id": "J40",
      "title": "J40 guide working/history views filter real bookings and preserve role ownership",
      "status": "passed",
      "durationMs": 1454,
      "engine": "Chromium",
      "attempts": [
        {
          "status": "failed",
          "startedAt": "2026-10-18T09:28:06.208Z"
        },
        {
          "status": "passed",
          "startedAt": "2026-10-18T09:35:22.801Z"
        }
      ]
    }
  ],
  "qa": {
    "QA-01": [
      "J02",
      "J32",
      "J34"
    ],
    "QA-02": [
      "J15"
    ],
    "QA-03": [
      "J02",
      "J03"
    ],
    "QA-04": [
      "J03",
      "J35"
    ],
    "QA-05": [
      "legacy:mobile"
    ],
    "QA-06": [
      "J19",
      "legacy:mobile",
      "legacy:bank"
    ],
    "QA-07": [
      "legacy:mobile"
    ],
    "QA-08": [
      "J04"
    ],
    "QA-09": [
      "legacy:mobile"
    ],
    "QA-10": [
      "legacy:mobile",
      "J40"
    ],
    "QA-11": [
      "J12",
      "J13",
      "J36",
      "J38"
    ],
    "QA-12": [
      "J12",
      "J33"
    ],
    "QA-13": [
      "J13",
      "J29"
    ],
    "QA-14": [
      "legacy:mobile",
      "legacy:bank"
    ],
    "QA-15": [
      "legacy:mobile"
    ],
    "QA-16": [
      "J11",
      "J39"
    ],
    "QA-17": [
      "J16",
      "J44"
    ],
    "QA-18": [
      "J17",
      "J18",
      "J28"
    ],
    "QA-19": [
      "J08",
      "J10",
      "J14",
      "J24",
      "J41",
      "J42"
    ],
    "QA-20": [
      "J22",
      "J32"
    ],
    "QA-21": [
      "J31",
      "legacy:cabinet",
      "J46"
    ],
    "QA-22": [
      "J09"
    ],
    "QA-23": [
      "J09"
    ],
    "QA-24": [
      "J10"
    ]
  },
  "pageDefinitions": 55
}
