{
  "runId": "E2E-PENDING-20260901-A",
  "environment": "dev2/ou00 via local ngrok",
  "verdict": "PARTIAL_PASS_BLOCKED",
  "liveApi": {
    "authenticated": true,
    "pendingList": {"status": 200, "requestCount": 0},
    "missingSingleDecision": {
      "status": 400,
      "code": "REQUEST_NOT_FOUND",
      "errorMessage": "Time off request not found",
      "legacyPrefixRetained": true
    },
    "missingBatch": {
      "status": 200,
      "processed": 0,
      "failed": 2,
      "allFailureCodes": "REQUEST_NOT_FOUND",
      "separateMessages": true,
      "rawLegacyErrorsRetained": true
    },
    "malformedBatch": {
      "status": 200,
      "processed": 0,
      "failed": 4,
      "allFailureCodes": "INVALID_REQUEST",
      "batchCompletedWithoutTypeError": true
    }
  },
  "regressionEvidence": {
    "webTargeted": {"tests": 9, "assertions": 30, "result": "PASS"},
    "webMobileScheduling": {
      "tests": 348,
      "assertions": 1126,
      "result": "PASS",
      "phpunitDeprecations": 3
    },
    "liveSelected": {"tests": 57, "result": "PASS"},
    "coverage": [
      "single terminal error mapping",
      "per-row canonical batch error codes",
      "malformed and wrong-typed batch rows fail per item",
      "unknown prefixes preserve full diagnostics",
      "non-request errors remain on the legacy generic contract",
      "language-independent terminal classification",
      "expired-only cursor-page draining",
      "overlapping load/refresh stale-result suppression",
      "optimistic rollback and terminal non-restoration"
    ]
  },
  "review": {
    "initialReview": "FAIL",
    "initialDefects": 4,
    "remediation": "PASSING_TESTS",
    "independentReReview": "PASS",
    "securityConcerns": [],
    "logicErrors": [],
    "reviewedTests": 9,
    "reviewedAssertions": 30,
    "fullMobileSchedulingTests": 348,
    "fullMobileSchedulingAssertions": 1126,
    "phpstan": "ONE_UNRELATED_EXISTING_SLIM_JWTUSER_WARNING"
  },
  "remainingE2EBlocker": {
    "code": "PENDING_REQUEST_API_NOT_PAGINATED",
    "detail": "The current Live repository adapter explicitly wraps the full non-paginated backend response with hasMore=false. Expired-only multi-page draining is covered deterministically but cannot be credited against dev2 until the backend and datasource expose cursor metadata."
  },
  "sideEffects": {
    "fixtureRowsCreated": 0,
    "cleanupRequired": false
  }
}
