{
 "flight": {
  "id": 33019,
  "agent": "github-copilot",
  "state": "closed",
  "title": "airspec: Show the context code around shouldBe matchers",
  "number": 3950,
  "source": "aidev",
  "commits": 3,
  "debrief": "GitHub Copilot opened a feat PR in wvlet/airframe to show code context around shouldBe matchers in AirSpec assertion failures. The change spans seven files, 183 additions and 25 deletions, across three commits. It drew one review with zero change requests and one review comment. Closed unmerged after human review, it is a burn.",
  "outcome": "burn",
  "signals": [
   "aidev:Copilot"
  ],
  "index_ok": true,
  "additions": 183,
  "closed_at": "2025-06-02T19:35:44+00:00",
  "deletions": 25,
  "merged_at": null,
  "opened_at": "2025-06-02T18:55:31+00:00",
  "task_type": "feat",
  "body_chars": 2538,
  "confidence": "dataset",
  "updated_at": "2026-11-03T22:06:15.966872+00:00",
  "enriched_at": null,
  "body_excerpt": "Enhanced AirSpec assertion failure messages to show the actual code context instead of generic error messages.\n\n## Problem\nPreviously, AirSpec assertion failures showed generic messages that were hard to understand:\n```scala\nplan shouldNotBe null\n\n// Current error message:\nfailed: null should not be",
  "review_count": 1,
  "files_changed": 7,
  "hours_to_merge": null,
  "metrics_source": "aidev_commit_sum",
  "change_requests": 0,
  "og_generated_at": "2026-11-03T22:06:15.966872+00:00",
  "reviewer_excerpt": null,
  "review_comment_count": 1,
  "reviewer_excerpt_url": null
 },
 "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": "reviewed",
   "actor_login": null
  },
  {
   "at": "2025-06-02T19:35:44+00:00",
   "url": null,
   "kind": "closed",
   "actor_login": "xerial"
  }
 ],
 "related": [
  {
   "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
  },
  {
   "agent": "github-copilot",
   "state": "merged",
   "title": "Fix LazyCodec recursive reference resolution to prevent infinite recursion",
   "number": 3946,
   "outcome": "merged_clean",
   "index_ok": true,
   "additions": 285,
   "deletions": 69,
   "merged_at": "2025-06-02T19:08:00+00:00",
   "opened_at": "2025-05-31T15:13:20+00:00",
   "task_type": "fix",
   "files_changed": 3,
   "hours_to_merge": 51.91
  }
 ],
 "pr_url": "https://github.com/wvlet/airframe/pull/3950",
 "page": "https://agentriders.com/logs/wvlet/airframe/3950/"
}