{
 "flight": {
  "id": 18396,
  "agent": "github-copilot",
  "state": "merged",
  "title": "airframe-control: Add RateLimiter with token bucket algorithm",
  "number": 3942,
  "source": "aidev",
  "commits": 6,
  "debrief": "GitHub Copilot opened a pull request adding a RateLimiter to airframe-control, using a token bucket algorithm. It spans seven files, 967 additions and 279 deletions, across six commits. Two reviews were filed; one comment reads \"Compilation is failing in Scala.js. Fix the error\". The PR merged clean with zero change requests after 1.71 hours.",
  "outcome": "merged_clean",
  "signals": [
   "aidev:Copilot"
  ],
  "index_ok": true,
  "additions": 967,
  "closed_at": "2025-05-31T07:11:35+00:00",
  "deletions": 279,
  "merged_at": "2025-05-31T07:11:35+00:00",
  "opened_at": "2025-05-31T05:29:01+00:00",
  "task_type": "feat",
  "body_chars": 3083,
  "confidence": "dataset",
  "updated_at": "2026-11-04T02:37:39.768917+00:00",
  "enriched_at": null,
  "body_excerpt": "This PR implements a `RateLimiter` for airframe-control using a token bucket algorithm to control the rate of operations. This addresses the need for rate limiting and retry budget control mentioned in the issue.\n\n## Features\n\n### Core Functionality\n- **Token bucket algorithm** with configurable per",
  "review_count": 2,
  "files_changed": 7,
  "hours_to_merge": 1.71,
  "metrics_source": "aidev_commit_sum",
  "change_requests": 0,
  "og_generated_at": "2026-11-04T02:37:39.768917+00:00",
  "reviewer_excerpt": "Compilation is failing in Scala.js. Fix the error",
  "review_comment_count": 1,
  "reviewer_excerpt_url": "https://github.com/wvlet/airframe/pull/3942#pullrequestreview-2883496746"
 },
 "repo": {
  "name": "airframe",
  "owner": "wvlet",
  "stars": 666,
  "license": "Apache-2.0",
  "full_name": "wvlet/airframe",
  "primary_language": "Scala"
 },
 "author": {
  "login": "Copilot",
  "name": null,
  "github_profile": "https://github.com/Copilot",
  "page": null
 },
 "claim": null,
 "events": [
  {
   "at": null,
   "url": null,
   "kind": "committed",
   "actor_login": "copilot-swe-agent[bot]"
  },
  {
   "at": null,
   "url": null,
   "kind": "committed",
   "actor_login": "copilot-swe-agent[bot]"
  },
  {
   "at": null,
   "url": null,
   "kind": "committed",
   "actor_login": "copilot-swe-agent[bot]"
  },
  {
   "at": null,
   "url": null,
   "kind": "committed",
   "actor_login": "copilot-swe-agent[bot]"
  },
  {
   "at": null,
   "url": null,
   "kind": "reviewed",
   "actor_login": null
  },
  {
   "at": null,
   "url": null,
   "kind": "committed",
   "actor_login": "copilot-swe-agent[bot]"
  },
  {
   "at": null,
   "url": null,
   "kind": "committed",
   "actor_login": "copilot-swe-agent[bot]"
  },
  {
   "at": "2025-05-31T06:10:45+00:00",
   "url": null,
   "kind": "labeled",
   "actor_login": "github-actions[bot]"
  },
  {
   "at": "2025-05-31T07:11:35+00:00",
   "url": null,
   "kind": "merged",
   "actor_login": "xerial"
  },
  {
   "at": "2025-05-31T07:11:36+00:00",
   "url": null,
   "kind": "closed",
   "actor_login": "xerial"
  },
  {
   "at": "2025-06-02T19:38:20+00:00",
   "url": null,
   "kind": "labeled",
   "actor_login": "xerial"
  }
 ],
 "related": [
  {
   "agent": "github-copilot",
   "state": "closed",
   "title": "airspec: Show the context code around shouldBe matchers",
   "number": 3950,
   "outcome": "burn",
   "index_ok": true,
   "additions": 183,
   "deletions": 25,
   "merged_at": null,
   "opened_at": "2025-06-02T18:55:31+00:00",
   "task_type": "feat",
   "files_changed": 7,
   "hours_to_merge": null
  },
  {
   "agent": "github-copilot",
   "state": "merged",
   "title": "Add IO.copy(InputStream, OutputStream) method to airframe-control",
   "number": 3949,
   "outcome": "merged_clean",
   "index_ok": true,
   "additions": 177,
   "deletions": 57,
   "merged_at": "2025-06-02T19:25:19+00:00",
   "opened_at": "2025-06-02T17:25:50+00:00",
   "task_type": "feat",
   "files_changed": 3,
   "hours_to_merge": 1.99
  },
  {
   "agent": "github-copilot",
   "state": "merged",
   "title": "fix: Ensure onMount called only after element is available by ID",
   "number": 3947,
   "outcome": "merged_clean",
   "index_ok": true,
   "additions": 137,
   "deletions": 65,
   "merged_at": "2025-06-02T18:51:15+00:00",
   "opened_at": "2025-05-31T15:16:27+00:00",
   "task_type": "fix",
   "files_changed": 4,
   "hours_to_merge": 51.58
  }
 ],
 "pr_url": "https://github.com/wvlet/airframe/pull/3942",
 "page": "https://agentriders.com/logs/wvlet/airframe/3942/"
}