{
  "license": "CC BY 4.0",
  "recipe": {
    "slug": "browser-long-task-rate",
    "title": "Calculate Browser Long-Task Rate by Route",
    "testedWith": "Apache DataFusion 45.2.0",
    "lastReviewed": "2026-07-28"
  },
  "contract": {
    "tableName": "browser_task_events",
    "schema": [
      {
        "name": "timestamp_utc",
        "type": "Timestamp",
        "description": "Task completion time."
      },
      {
        "name": "route_template",
        "type": "Utf8",
        "description": "Stable page route."
      },
      {
        "name": "release",
        "type": "Utf8",
        "description": "Frontend build identifier."
      },
      {
        "name": "duration_ms",
        "type": "Float64",
        "description": "Observed main-thread task duration."
      },
      {
        "name": "interaction_related",
        "type": "Boolean",
        "description": "Whether the task overlapped a measured interaction."
      }
    ]
  },
  "query": "SELECT\n  route_template,\n  release,\n  COUNT(*) AS observed_tasks,\n  SUM(CASE WHEN duration_ms > 50 THEN 1 ELSE 0 END) AS long_tasks,\n  SUM(CASE WHEN duration_ms > 50 THEN duration_ms - 50 ELSE 0 END)\n    AS blocked_time_ms,\n  100.0 * SUM(CASE WHEN duration_ms > 50 THEN 1 ELSE 0 END)\n    / NULLIF(COUNT(*), 0) AS long_task_rate_pct\nFROM browser_task_events\nWHERE timestamp_utc >= now() - INTERVAL '7 days'\nGROUP BY route_template, release\nORDER BY blocked_time_ms DESC;",
  "fixtureKind": "schema-example",
  "inputRows": [
    {
      "timestamp_utc": "2026-07-28T10:00:00Z",
      "route_template": "/api/checkout",
      "release": "release_2026_07_1",
      "duration_ms": 12,
      "interaction_related": true
    },
    {
      "timestamp_utc": "2026-07-28T11:00:00Z",
      "route_template": "/api/search",
      "release": "release_2026_07_2",
      "duration_ms": 37,
      "interaction_related": false
    },
    {
      "timestamp_utc": "2026-07-28T12:00:00Z",
      "route_template": "/api/projects/:id",
      "release": "release_2026_07_3",
      "duration_ms": 24,
      "interaction_related": true
    }
  ],
  "illustrativeInputRows": [
    {
      "timestamp_utc": "2026-07-28T10:00:00Z",
      "route_template": "/api/checkout",
      "release": "release_2026_07_1",
      "duration_ms": 12,
      "interaction_related": true
    },
    {
      "timestamp_utc": "2026-07-28T11:00:00Z",
      "route_template": "/api/search",
      "release": "release_2026_07_2",
      "duration_ms": 37,
      "interaction_related": false
    },
    {
      "timestamp_utc": "2026-07-28T12:00:00Z",
      "route_template": "/api/projects/:id",
      "release": "release_2026_07_3",
      "duration_ms": 24,
      "interaction_related": true
    }
  ],
  "expectedOutput": {
    "columns": [
      "route_template",
      "release",
      "observed_tasks",
      "long_tasks",
      "blocked_time_ms",
      "long_task_rate_pct"
    ],
    "rows": [
      {
        "route_template": "/editor",
        "release": "web-103",
        "observed_tasks": 9200,
        "long_tasks": 644,
        "blocked_time_ms": 52180,
        "long_task_rate_pct": 7
      },
      {
        "route_template": "/dashboard",
        "release": "web-103",
        "observed_tasks": 15400,
        "long_tasks": 462,
        "blocked_time_ms": 23860,
        "long_task_rate_pct": 3
      }
    ]
  },
  "notes": [
    "The compact input rows demonstrate field names and JSON types; they are not claimed to generate the displayed aggregate by themselves.",
    "The expected output is deterministic synthetic review data for the documented output shape.",
    "Adapt time windows, thresholds, identities, and business definitions before operational use."
  ]
}