# STATUS.md — events / 城市活動蒐集器

最後更新：<日期>（extract 單筆 LLM 失敗改跳過；今早失敗的 run 手動接續跑完並發佈；來源 X 手動抓一次轉綠）

## 最近做完的事

- <日期> 08:00 的 run 在 ingest extract 階段被本機 LLM 一筆壞 JSON（未閉合字串）弄到 exit 1，collect 其實 18 來源全 ok。改 `ingest._extract()`：單筆 LLM 失敗記 `extract_skipped` 到 `logs/app.jsonl` 後跳過，不再讓整個 run 失敗（commit `<hash>`，163 測試全綠）。手動接續 `ingest --run-id <id>` → enrich → cast → `deploy/publish.sh` → digest 通知。`來源 X` 30 天間隔、上週失敗狀態一直殘留在每日提醒裡，手動 `collect --only` 一次（17 筆入庫）轉回 ok。
- <日期> 修三件：`來源 Y` 遇「No Content.」空清單改當零筆（連續四天讓 unit exit 2 的唯一原因）；`doctor --replay` 改寫暫存 DB、不再動 `source_runs`；`tests/test_enrich.py` 的 session 日期改成「今天＋30 天」。162 個測試全綠。公網鏡像用 `deploy/publish.sh --no-build` 補推。
- <日期> 文件整理（遷移）：`REPORT.md` 改為本檔＋`STATUS-ARCHIVE.md`；自動修復流程、營運觀察搬進 `README.md`；Git 工作流程與文件維護規則搬進 `AGENTS.md`；刪 `CLAUDE.md`、`.claude/`。
- <日期> `來源 Z`：改認 base64 命名的 event sitemap（commit `<hash>`）。
- <日期> 修正「1d 間隔」碰上 timer 隨機延遲整批來源被靜默跳過：`_is_due` 允許提早 10%。

## 一句話現況

功能面全部完成、每日 08:00 收集與每小時警報 timer 照跑。上週的來源問題已修好並生效；昨天改由本機 LLM 偶發壞 JSON 讓 run 失敗，已改成跳過單筆。**等明天 08:00 驗證 unit 轉綠、Cloudflare 自動部署恢復。**

- Repository：公開 GitHub repo，`master` 領先 origin 20 個 commit 未 push
- 正式報表：VPN 內 `http://<tailnet-ip>/events/`；公網 `https://<pages-name>.pages.dev/`
- 部署：Caddy + user-level systemd（`events.timer`、`events-alert.timer`）；**手動改報表後必跑 `deploy/publish.sh`**（見 `AGENTS.md`）
- 通知：活動 topic `<events-topic>`；失敗通知走共用的 `<alerts-topic>`（所有 project 集中這一個 topic，見 `~/projects/INFRA.md` §4）
- 本機 LLM：`http://localhost:8000/v1`（OpenAI 相容端點）

## 未完成

### 待明天早上驗證（修完還沒被排程跑過）

- 昨天的修改（extract 跳過單筆）只在手動接續時驗過；明天 08:00 那次是第一次完整由 timer 跑。若再失敗先看 `journalctl --user -u events.service -n 80` 與 `logs/app.jsonl` 的 `extract_skipped`。
- unit 失敗時 `ExecStartPost` 的 Cloudflare 部署不會跑；已手動 `deploy/publish.sh` 補推，之後靠 unit 轉綠自動恢復。
- 自動修復：昨天判定 not-fixed（原因在共用 llm.py／ingest.py，超出授權），沒動檔案；今天的人工 commit 已解除守門，若明天再失敗它會動手。

### 其他

- 20 個 commit 未 push 到 GitHub（使用者明講才 push）。
- 某大型市集若發布新的公開場次，可再驗收官方動態資料端點；在此之前不繞過站方設計或 robots。

### 選配擴充方向（目前沒有承諾時程）

- 屋台、食祭與地方酒類活動的一次／官方來源；目前 TAG 可用，但不為填滿分類而硬標。
- 售票平台的售票日／申請截止早期預警；只有在能維持低負載、可歸因與低雜訊時才啟用。
- 來源再擴充時，先排除 `README.md`「查過但不收的站」。

## 坑

- 程式與資料的陷阱都在 `README.md`「已知陷阱」，這裡只放現況相關的。
- 每日 08:00 與每小時警報會持續累積來源筆數中位數；來源改版時由 `source_health` 推到告警 topic。「來源仍異常」的每日提醒是前一天狀態的殘留，來源要等下一次成功抓取才會轉回 ok。
