Merge pull request #220 from nnneeeooo-nnneeeooo/codex/include-raf-hawk-incident
Include RAF Hawk T2 crash in incident database
Full 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")