docs: ADR-092 附錄 A+B + LOGBOOK + MASTER §8 記錄四修與 C1-C4 全流程串接
- ADR-092: 附錄 A(B1-B4 四修 root cause + commit)+ 附錄 B(C1-C4 斷點修復表 + 架構鐵律) - LOGBOOK: 新增 2026-04-20 晚 C1-C4 章節(斷點清單 + commits + 驗收步驟) - MASTER §8: 追加 C1-C4 changelog(§3/§1.1 對齊 + 修復後行為說明) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1202,3 +1202,32 @@ CR 修補:
|
||||
- [ ] 生產 7 天監控(trust_score 更新、JSONL 累積、null 率)
|
||||
|
||||
**下一步:** 7 天生產觀察 Phase 3 退出條件(2026-04-22 檢查點)
|
||||
|
||||
---
|
||||
|
||||
## 2026-04-20 晚(台北)— C1-C4 全流程串接 — Playbook 自動修復鏈路保護
|
||||
|
||||
**觸發**:統帥要求全景盤查所有 AI 自動化節點後,發現 Playbook 鏈路有 3 個結構性斷點。
|
||||
|
||||
### 斷點清單 → 修復
|
||||
|
||||
| # | 斷點 | 根因 | 檔案 | 修復 |
|
||||
|---|------|------|------|------|
|
||||
| C1 | evolver 封存 yaml_rule playbooks → 自動修復鏈路斷 | `_archive_low_trust` / `_archive_dormant` 無 `YAML_RULE` guard | `playbook_evolver.py` | `if pb.source == PlaybookSource.YAML_RULE: continue` |
|
||||
| C2 | seeder 不復活已封存 yaml_rule | idempotency SQL 包含 DEPRECATED 記錄 | `playbook_seed_service.py` | SQL 加 `AND status != 'deprecated'` |
|
||||
| C3 | AI 新規則不即時建立 Playbook(等重啟) | `_append_rule_to_yaml` 成功後無 seeder 呼叫 | `alert_rule_engine.py` | 加 `create_task(seed_playbooks_from_rules())` |
|
||||
| C4 | watchdog 不偵測鏈路斷裂 | W-4 缺失 | `ai_slo_watchdog_job.py` | 加 `_count_approved_playbooks()` W-4;0 → TYPE-8M |
|
||||
|
||||
### Commits
|
||||
|
||||
| commit | 說明 |
|
||||
|--------|------|
|
||||
| `80aea20` | C1-C4 全流程串接(本機) |
|
||||
| `de2d34d` | push to Gitea(rebase 含 ADR-092 四修 `156a52f`)|
|
||||
|
||||
### 下一步驗收
|
||||
|
||||
1. evolver 週期後 → yaml_rule playbooks 仍 APPROVED(C1 保護)
|
||||
2. 重啟後 → 被封存 yaml_rule playbooks 復活(C2 seeder 修復)
|
||||
3. AI 自動生成新規則 → 立即出現對應 APPROVED Playbook(C3 接線)
|
||||
4. Watchdog W-4 → APPROVED 數量為 0 時 TYPE-8M 告警(C4 感知)
|
||||
|
||||
@@ -132,3 +132,43 @@ Grade: mature(90+) / in_progress(70-90) / starter(50-70) / initial(<50)
|
||||
- ADR-081 PreDecisionInvestigator + EvidenceSnapshot
|
||||
- ADR-083 學習閉環重建
|
||||
- ADR-090 監控盲區治理 + 自動化覆蓋矩陣(11 張 + 8 張新表)
|
||||
|
||||
---
|
||||
|
||||
## 附錄 A:2026-04-20 四修(B1-B4)— 全流程斷鏈緊急修復
|
||||
|
||||
**觸發**:統帥截圖 Telegram 顯示「採納失敗」+ 兩天無任何告警。
|
||||
**指令**:全景、全流程、全節點、全架構比對,找到所有斷點再修。
|
||||
|
||||
### Root Cause 鏈
|
||||
|
||||
| 症狀 | 斷點 | 根因 |
|
||||
|------|------|------|
|
||||
| Playbook 學習失敗 163次/48h | `playbook_service.update_with_validation` | `evolver` 傳 `.value`(str)→ `setattr` 不觸發 Pydantic → `.value` 炸 |
|
||||
| Telegram 永久靜默 2 天 | `approval_db.find_by_fingerprint` | PENDING = 「已發 TG」謊言;TG 失敗後 approval 永 PENDING → 永遠收斂跳過 |
|
||||
| 採納變更失敗 | `telegram_gateway._handle_drift_action` | 呼叫 `DriftAdoptService.adopt_drift()` 但方法不存在(AttributeError) |
|
||||
| AI 無法感知自身故障 | main.py 無 background watchdog | MASTER §1.1 盲區:SLO 計算只是 API endpoint |
|
||||
|
||||
### 修復(6 檔 / 230 行 / commit 156a52f)
|
||||
|
||||
1. **B1** `playbook_service.py` — `update_with_validation` setattr 前強制 enum 轉型
|
||||
2. **B2a** `approval_db.py` — `find_by_fingerprint` debounce 窗外 PENDING 必須 Redis `tg_sent:{fp}` 確認;新 `mark_telegram_confirmed()`
|
||||
3. **B2b** `webhooks.py` — `_push_to_telegram_background` 成功後 `setex tg_sent:{fp}` 24h;3 call site 傳 fingerprint
|
||||
4. **Drift** `drift_adopt_service.py` — 新 `adopt_drift(report_id)` wrapper
|
||||
5. **B3** `jobs/ai_slo_watchdog_job.py` — 新建:每 15 分鐘 W-1/W-2/W-3 → TYPE-8M
|
||||
6. **B3** `main.py` lifespan 註冊 watchdog loop
|
||||
|
||||
---
|
||||
|
||||
## 附錄 B:2026-04-20 C1-C4 — Playbook 鏈路結構性斷點修復
|
||||
|
||||
**觸發**:統帥全景盤查後,發現 Playbook 自動修復鏈路有 3 個結構性斷點。
|
||||
|
||||
| # | 斷點 | 根因 | 修復 | commit |
|
||||
|---|------|------|------|--------|
|
||||
| C1 | evolver 封存 yaml_rule playbooks | 無 `YAML_RULE` source guard | `playbook_evolver.py` 兩處加 `if source == YAML_RULE: continue` | de2d34d |
|
||||
| C2 | seeder 不復活 DEPRECATED yaml_rule | idempotency SQL 包含 DEPRECATED | `AND status != 'deprecated'` | de2d34d |
|
||||
| C3 | AI 新規則不即時建立 Playbook | `_append_rule_to_yaml` 後無 seeder 呼叫 | `create_task(seed_playbooks_from_rules())` | de2d34d |
|
||||
| C4 | watchdog 不偵測鏈路斷裂 | W-4 缺失 | `_count_approved_playbooks()`;為 0 → TYPE-8M | de2d34d |
|
||||
|
||||
**架構鐵律**:`PlaybookSource.YAML_RULE` playbooks 是自動修復鏈路的「基礎設施」,evolver 的 trust-based 退場邏輯不得觸及此類 playbooks。
|
||||
|
||||
@@ -1695,3 +1695,22 @@ Phase 6 完成後
|
||||
**MASTER §1.1 自主化北極星對齊**:B3 watchdog 是「系統必須能感知自身故障」的首個 background 閉環,填補 Phase 6 僅有 API endpoint 的空缺。
|
||||
|
||||
**下一步驗收**:等真實告警→TG卡片出現;等採納→成功;等 15 分鐘→Watchdog日誌;等 evolver 週期→pg_upsert_failed=0。
|
||||
|
||||
---
|
||||
|
||||
### 2026-04-20 晚 (台北) — C1-C4 全流程串接 — Playbook 鏈路保護(commit de2d34d)
|
||||
|
||||
**觸發**:統帥全景盤查 AI 自動化節點後,發現 Playbook 自動修復鏈路有 3 個結構性斷點。
|
||||
|
||||
**MASTER §3(自動修復 + Playbook 演化)對齊**:
|
||||
- §3.4 evolver 不得封存由 yaml_rule seeder 建立的 APPROVED playbooks
|
||||
- §3.5 seeder 必須在重啟時復活被 evolver 誤封的 yaml_rule playbooks
|
||||
- §3.6 AI 自動生成規則必須立即建立對應 Playbook(不等重啟)
|
||||
- §1.1 watchdog 必須感知 APPROVED playbook 數量為 0 的鏈路斷裂
|
||||
|
||||
| 修復 | 結構斷點 | 修復後行為 |
|
||||
|------|---------|-----------|
|
||||
| C1: `playbook_evolver.py` YAML_RULE guard | evolver 封存 seeder playbooks | yaml_rule source 永不被 evolver 封存 |
|
||||
| C2: `playbook_seed_service.py` SQL 排除 DEPRECATED | 重啟不復活 DEPRECATED | `status != 'deprecated'` → 重啟自動復活 |
|
||||
| C3: `alert_rule_engine.py` 呼叫 seeder | AI 新規則等重啟才有 Playbook | 成功寫入 yaml 後立即 `seed_playbooks_from_rules()` |
|
||||
| C4: `ai_slo_watchdog_job.py` W-4 | 鏈路斷裂無感知 | `approved_count == 0` → TYPE-8M 自健診 |
|
||||
|
||||
Reference in New Issue
Block a user