{
  "sha": "101e0acdaf4b7e255d3ea90af99a1b708085e61e",
  "message": "Merge pull request #220 from nnneeeooo-nnneeeooo/codex/include-raf-hawk-incident\n\nInclude RAF Hawk T2 crash in incident database",
  "author": {
    "login": "nnneeeooo-nnneeeooo",
    "name": "",
    "email": ""
  },
  "committer": {
    "login": "web-flow",
    "name": "",
    "email": ""
  },
  "created_at": "2026-09-24T04:11:23Z",
  "files": [
    {
      "filename": "data/incidents.json",
      "previous_filename": "",
      "status": "modified",
      "additions": 23,
      "deletions": 0,
      "changes": 23
    },
    {
      "filename": "data/stats.json",
      "previous_filename": "",
      "status": "modified",
      "additions": 2,
      "deletions": 2,
      "changes": 4
    },
    {
      "filename": "pipeline/CONTRACTS.md",
      "previous_filename": "",
      "status": "modified",
      "additions": 3,
      "deletions": 2,
      "changes": 5
    },
    {
      "filename": "pipeline/build.py",
      "previous_filename": "",
      "status": "modified",
      "additions": 4,
      "deletions": 4,
      "changes": 8
    },
    {
      "filename": "pipeline/write.py",
      "previous_filename": "",
      "status": "modified",
      "additions": 5,
      "deletions": 9,
      "changes": 14
    }
  ],
  "diff": "@@ -1,4 +1,27 @@\\n [\\n+  {\\n+    \"date\": \"2026-09-23\",\\n+    \"sev\": \"acc\",\\n+    \"aircraft\": \"BAE Systems Hawk T2\",\\n+    \"operator\": \"Royal Air Force\",\\n+    \"phase\": {\\n+      \"zh\": \"訓練飛行\",\\n+      \"en\": \"Training flight\"\\n+    },\\n+    \"location\": {\\n+      \"zh\": \"威爾斯北部安格爾西島 Pencarnisiog（RAF Valley 附近）\",\\n+      \"en\": \"Pencarnisiog, Anglesey, North Wales (near RAF Valley)\"\\n+    },\\n+    \"desc\": {\\n+      \"zh\": \"一架皇家空軍Hawk T2高級教練機在安格爾西島附近墜毀；兩名飛行員彈射逃生，警方稱兩人傷勢被認為輕微；皇家空軍已展開調查。\",\\n+      \"en\": \"A Royal Air Force Hawk T2 advanced trainer crashed near Anglesey; both pilots ejected and were thought to have minor injuries; the RAF has opened an investigation.\"\\n+    },\\n+    \"status\": \"open\",\\n+    \"sources\": [\\n+      \"AeroTime\"\\n+    ],\\n+    \"articleId\": \"a-20260923-1632-raf-hawk-t2-trainer-crashes-in-wales-bot\"\\n+  },\\n   {\\n     \"date\": \"2026-09-20\",\\n     \"sev\": \"acc\",\\n@@ -1,6 +1,6 @@\\n {\\n-  \"updatedUtc\": \"2026-09-24T02:19Z\",\\n-  \"seriousThisWeek\": 1,\\n+  \"updatedUtc\": \"2026-09-24T04:08Z\",\\n+  \"seriousThisWeek\": 2,\\n   \"flightAwareStatus\": \"unconfigured\",\\n   \"flightAwareUpdatedUtc\": \"2026-09-24T02:18Z\"\\n }\\n@@ -220,8 +220,9 @@ Most recent first, max 10 kept:\\n \\n ## data/incidents.json  (written by write.py, read by build.py)\\n \\n-Most recent first, max 60 kept. Only safety-category events that describe an\\n-actual occurrence (ICAO Annex 13):\\n+Most recent first, max 60 kept. Include source-supported actual civil and\\n+military/state-aircraft occurrences regardless of the article's editorial\\n+category. Apply ICAO Annex 13 classifications where applicable:\\n \\n ```jsonc\\n [\\n@@ -127,11 +127,11 @@ def static_asset_version() -> str:\\n                       \"event_photo\": \"事件現場照片\"},\\n         \"photoSource\": \"照片來源\",\\n         \"incKicker\": \"Incident Database\", \"incTitle\": \"事故資料庫\",\\n-        \"incSub\": \"自動彙整全球民航事故與事件，資料來自各國調查機關與專業追報來源，每小時更新。\",\\n+        \"incSub\": \"自動彙整全球民航與軍用航空事故及事件，資料來自各國調查機關與專業追報來源，每小時更新。\",\\n         \"incCountLabel\": \"筆紀錄\",\\n         \"incWeeklySerious\": \"本週嚴重事件\",\\n         \"incReadEvent\": \"閱讀事件\",\\n-        \"incNote\": \"* 分級依 ICAO Annex 13：事故（Accident）、嚴重事件（Serious incident）、事件（Incident）。\",\\n+        \"incNote\": \"* 分級於適用時參考 ICAO Annex 13；軍用及其他國家航空器依公開資料分類。\",\\n         \"thDate\": \"日期\", \"thSev\": \"等級\", \"thType\": \"機型\", \"thOp\": \"營運人\",\\n         \"thPhase\": \"飛行階段\", \"thLoc\": \"地點\", \"thDesc\": \"摘要\", \"thStatus\": \"狀態\", \"thSrc\": \"來源\",\\n         \"srcKicker\": \"Data Sources\", \"srcTitle\": \"資料來源\",\\n@@ -259,11 +259,11 @@ def static_asset_version() -> str:\\n                       \"event_photo\": \"Photo from this event\"},\\n         \"photoSource\": \"Photo source\",\\n         \"incKicker\": \"Incident Database\", \"incTitle\": \"Incident database\",\\n-        \"incSub\": \"Automatically aggregated civil-aviation accidents and incidents, from state investigators and specialist trackers. Updated hourly.\",\\n+        \"incSub\": \"Automatically aggregated civil and military aviation accidents and incidents, from state investigators and specialist trackers. Updated hourly.\",\\n         \"incCountLabel\": \"records\",\\n         \"incWeeklySerious\": \"Serious events this week\",\\n         \"incReadEvent\": \"Read event\",\\n-        \"incNote\": \"* Classes per ICAO Annex 13: Accident, Serious incident, Incident.\",\\n+        \"incNote\": \"* ICAO Annex 13 classifications apply where relevant; military and other state-aircraft events follow public-source classification.\",\\n         \"thDate\": \"Date\", \"thSev\": \"Class\", \"thType\": \"Aircraft\", \"thOp\": \"Operator\",\\n         \"thPhase\": \"Phase\", \"thLoc\": \"Location\", \"thDesc\": \"Summary\", \"thStatus\": \"Status\", \"thSrc\": \"Sources\",\\n         \"srcKicker\": \"Data Sources\", \"srcTitle\": \"Sources\",\\n@@ -511,10 +511,11 @@ def simplified_chinese_error(draft: dict) -> str | None:\\n   body paragraphs do not by themselves make the story mil.\\n - flash is one line in each language; zh at most 40 characters. hot=true only\\n   for breaking safety events.\\n-- incident is non-null only when cat=\"safety\" and the story is an actual ICAO\\n-  Annex 13 occurrence. Include supported date (YYYY-MM-DD), sev acc/ser/inc,\\n-  source-stated aircraft and operator, bilingual phase/location/desc, and\\n-  status open/closed/prelim.\\n+- incident is non-null only for a source-supported actual aviation occurrence,\\n+  including military/state-aircraft events, regardless of the article's\\n+  editorial category. Apply ICAO Annex 13 classifications where applicable.\\n+  Include supported date (YYYY-MM-DD), sev acc/ser/inc, source-stated aircraft\\n+  and operator, bilingual phase/location/desc, and status open/closed/prelim.\\n \\n SELF-CHECK: (1) every title/summary element binds to listed facts; (2) every\\n new-event title and summary has current SOURCE support; (3) no unstated\\n@@ -1779,11 +1780,6 @@ def build_incident(draft: dict, group: dict, article_id: str):\\n     incident = draft.get(\"incident\")\\n     if not isinstance(incident, dict):\\n         return None\\n-    if draft.get(\"cat\") != \"safety\":\\n-        # CONTRACTS.md: incidents.json holds safety-category occurrences only.\\n-        print(f\"write: dropping incident row from non-safety article \"\\n-              f\"{article_id}\")\\n-        return None\\n     names = []\\n     for item in group.get(\"items\", []):\\n         name = item.get(\"source\")"
}
