diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index b8baa4c3..6c7fc4ea 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,63 @@ +## 2026-05-19 | T63 Recurrence Work Item Handoff + Drift Escalation Dedup + +**背景**:T62 已完成 recurrence work item 的 safe preview / dry-run,但 Operator 仍需要一個明確的「交接」節點,讓 `run_completed_no_repair` 類工作項可留下「已轉 Ticket proposal / 人工接手」證據,而不是停在 dry-run。同步插隊處理 production Telegram P0:`ConfigDriftAutoAdoptBlocked` 每小時換 report_id 重複升級,且 PR #145 已建立但為零 files / 零 commits,不能真正更新 Git baseline。 + +**修正**: +- 新增 `POST /api/v1/platform/events/dossier/recurrence/work-item/handoff`: + - 依 recurrence read model 與 dry-run contract 產生 `awooop_recurrence_work_item_handoff_v1`。 + - `handoff_kind=ticket_proposal` 預設只記錄交接提案,不建立外部 Ticket。 + - 明確回傳 `writes_incident_state=false`、`writes_auto_repair_result=false`、`writes_ticket=false`、`creates_external_ticket=false`。 + - 以 timeline / alert_operation_log 作為 history sink;本輪 production smoke 至少寫入 timeline event。 +- Work Items 頁的「重複告警工作項」新增「交接」按鈕與結果卡: + - 顯示交接種類、交接狀態、外部 Ticket 是否建立、history 是否寫入。 + - 補 zh-TW / en i18n。 +- Config Drift P0 止血: + - `ConfigDriftAutoAdoptBlocked` emergency escalation 去重由 `report_id` 改為 stable drift fingerprint,TTL 24h,避免同一漂移每小時換 report_id 就重新 P0 升級。 + - `DriftAdoptService` 掃描 baseline 由 `k8s/*.yaml` 改為 `k8s/**/*.yaml`。 + - 找不到可 commit 的 YAML 時不再建立零 diff 承認 PR,避免「看起來已有 PR、實際沒有 baseline 變更」的假閉環。 + +**local verification**: +- `python3 -m py_compile apps/api/src/services/channel_event_dossier_service.py apps/api/src/api/v1/platform/events.py apps/api/src/services/emergency_escalation_service.py apps/api/src/services/drift_adopt_service.py apps/api/tests/test_channel_event_dossier_service.py apps/api/tests/test_emergency_escalation_service.py`:pass。 +- `DATABASE_URL=postgresql+asyncpg://awoooi:awoooi@localhost:5432/awoooi PYTHONPATH=apps/api pytest apps/api/tests/test_channel_event_dossier_service.py apps/api/tests/test_emergency_escalation_service.py -q`:14 passed。 +- `DATABASE_URL=... PYTHONPATH=apps/api ruff check --select F,E9,I ...`:pass。 +- `node -e "JSON.parse(...zh-TW.json); JSON.parse(...en.json)"`:pass。 +- `pnpm --dir apps/web run typecheck`:pass。 +- `pnpm --dir apps/web exec next lint --file src/app/[locale]/awooop/work-items/page.tsx`:pass。 +- `NEXT_PUBLIC_API_URL=https://awoooi.wooo.work pnpm --dir apps/web run build`:pass with existing Sentry setup warnings。 +- `git diff --check`:pass。 + +**production verification**: +- `fb9b0b3b feat(awooop): record recurrence handoff proposals` 與 `0367dde6 fix(drift): dedupe blocked auto-adopt escalations` pushed to Gitea main。 +- Gitea Code Review `1806` success;CD `1805` success;deploy marker `12fa9775 chore(cd): deploy 0367dde [skip ci]`。 +- CD log:tests passed;ArgoCD `Synced + Healthy`;API / Web / Worker rollout success。 +- Health:`https://awoooi.wooo.work/api/v1/health` → `status=healthy`、`mock_mode=false`、`environment=prod`。 +- Handoff API:`work_item_id=incident:INC-20260517-F25B4A` → + - `schema_version=awooop_recurrence_work_item_handoff_v1` + - `mode=ticket` + - `handoff_kind=ticket_proposal` + - `handoff_status=recorded` + - `allowed=true` + - `safety_level=handoff_record_only` + - `writes_incident_state=false` + - `writes_auto_repair_result=false` + - `writes_ticket=false` + - `creates_external_ticket=false` + - `next_step=operator_review_ticket_preview` + - history `recorded=true`、`timeline_event_id=bd883803-64aa-4f1f-a13d-351c0b0b54a9`。 +- Frontend Playwright smoke:`/zh-TW/awooop/work-items?project_id=awoooi&work_item_id=incident%3AINC-20260517-F25B4A&incident_id=INC-20260517-F25B4A` 顯示導航、focused work item、交接按鈕;點「交接」後顯示「已寫入歷史」、`外部 Ticket 建立:false`、`交接:Ticket 提案`、`incident=false`;`Application error=false`,console errors=`0`。 +- Drift live evidence: + - production `/api/v1/drift/reports` 最新仍是 `5aa66aa6` / `awoooi-prod` / `HIGH=1` / `MEDIUM=32` / `INFO=23` / `status=pending`,代表漂移本身仍需處理,不能宣稱已修復。 + - Gitea PR #145 `state=open`、`merged=false`、`head_sha=00289938...`、`base_sha=12fa9775...`;先前 files/commits API 皆為 0,證實該 PR 不是實際 baseline 修補。 + +**目前整體進度**: +- AwoooP observability / truth-chain 可回看:約 98.3%。 +- 來源告警入庫、重複發生、Sentry / SignOz 與修復結果可見性:約 98.4%。 +- Telegram callback detail/history 可追溯:約 96%。 +- AI 自動修復閉環:約 97.1%;T63 完成「dry-run → 交接提案 → history」節點,但沒有宣稱 `DockerContainerUnhealthy` 已真正自動修復。 +- Config Drift 治理:約 88%;P0 重複升級已止血,但真正閉環仍需 Drift fingerprint FSM、實際 YAML patch / Ansible check-mode / PR merge 後狀態回寫。 +- 前端 AI 自動化管理介面產品化:約 97.5%。 +- 完整 AI 自動化管理產品化:約 92.8%。 + ## 2026-05-18 | T62 Recurrence Work Item Safe Preview / Dry-run **背景**:T61 已把 `run_completed_no_repair` 轉成 open recurrence work item,但 Operator 仍只能看到「要建立修復 Ticket」,不能在前端確認下一步會怎麼做、會不會寫 incident / auto-repair / ticket、dry-run 是否有留下 history。這會讓 Telegram / AwoooP 仍像黑盒,無法清楚回答「現在跑到哪個流程階段」。 diff --git a/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md b/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md index d312d7f4..490af948 100644 --- a/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md +++ b/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md @@ -2211,6 +2211,16 @@ Phase 6 完成後 - 邊界:T62 仍不宣稱 `DockerContainerUnhealthy` 已真正 AI 自動修復;它完成的是「可操作前的安全預覽 / 乾跑 / history」。下一段才可設計受控 ticket apply、reverify、replay 或人工接手流程。 - 目前進度更新:AwoooP truth-chain 可回看約 98%;AI 自動修復閉環約 96.8%;完整 AI 自動化管理產品化約 92%。 +**T63 Recurrence handoff proposal + drift escalation dedup production verified(2026-05-19 台北)**: +- 觸發:T62 完成 safe preview / dry-run 後,仍缺「交接」節點,Operator 只能知道下一步可做 Ticket preview,不能留下已轉人工/提案的 history。同步 production Telegram 出現 `ConfigDriftAutoAdoptBlocked` P0 每小時重複升級;查證 PR #145 為 open 但 files/commits 為 0,不能更新 Git baseline。 +- 修正:新增 `POST /api/v1/platform/events/dossier/recurrence/work-item/handoff`,產生 `awooop_recurrence_work_item_handoff_v1`。預設 `handoff_kind=ticket_proposal`,只記錄交接提案與 history,不建立外部 Ticket、不修改 incident、不寫 auto-repair result。 +- UI:`/awooop/work-items` 的 recurrence work item 卡片新增「交接」按鈕與結果卡,顯示交接種類、交接狀態、外部 Ticket 是否建立、history 是否寫入;所有新文案走 zh-TW / en i18n。 +- Drift 止血:`ConfigDriftAutoAdoptBlocked` emergency escalation 去重從 volatile `report_id` 改成 stable drift fingerprint,TTL 24h;`DriftAdoptService` 掃描 baseline 從 `k8s/*.yaml` 改成 `k8s/**/*.yaml`,且找不到可 commit YAML 時不再建立零 diff 承認 PR。 +- Production deploy:`fb9b0b3b feat(awooop): record recurrence handoff proposals` + `0367dde6 fix(drift): dedupe blocked auto-adopt escalations` 已推 Gitea main;Code Review run `1806` success;CD run `1805` success;deploy marker `12fa9775 chore(cd): deploy 0367dde [skip ci]`。 +- Production evidence:health healthy;handoff API 對 `incident:INC-20260517-F25B4A` 回 `handoff_status=recorded`、`writes_incident_state=false`、`writes_auto_repair_result=false`、`writes_ticket=false`、`creates_external_ticket=false`、`timeline_event_id=bd883803-64aa-4f1f-a13d-351c0b0b54a9`。Playwright production smoke 確認 Work Items 頁導航與 focused work item 仍可見,點「交接」後顯示「已寫入歷史」、`外部 Ticket 建立:false`、`交接:Ticket 提案`、console errors=0。 +- 邊界:T63 仍不宣稱 `DockerContainerUnhealthy` 已真正 AI 自動修復,也不宣稱 Config Drift 已解決。Drift live report `5aa66aa6` 仍是 `pending`,PR #145 仍 open / unmerged;下一段需做 Drift fingerprint FSM、實際 YAML patch 或 Ansible check-mode/diff/apply、PR merge 後狀態回寫。 +- 目前進度更新:AwoooP truth-chain 可回看約 98.3%;AI 自動修復閉環約 97.1%;Config Drift 治理約 88%;完整 AI 自動化管理產品化約 92.8%。 + --- ### 2026-04-20 晚 (台北) — C1-C4 全流程串接 — Playbook 鏈路保護(commit de2d34d)