# FR-145 交接日誌（LOG）

> **append-only**：每棒收工追加一個 block，既有 block 永不改。要更正舊 block 寫在新 block 的「推翻了什麼」。現況看同資料夾 `FR-145-STATE.md`。

## 第 1 棒 — 2026-10-17 17:10 — 首腦（分析決策／協調）

**commits**（全部未 push）
- BE：`6dd66461f`（雛形）→ `be8e18fe4`（討論稿）→ `35188c16f`（design＋開卡）→ `6ea7e136a`（卡 2 首腦修正）→ `ab3a9cf5d`／`15f2f72f3`（復核紀錄）→ `0c268a6e9`（memory）
- FE：`760d6648`（TipTap 工具列與排版重整）→ `a4fe5065`（卡 2 首腦修正）
- runner 的：卡 1 BE `b95c6eb6a`／FE `0378b001`；卡 2 BE `1f84d3bc6`／FE `fee81522`；卡 6 BE `30650bdd0`／FE `249ea078`；卡 7 FE `88ca7ca8`→`67e9e11c`

**Notion**：母卡 CM-2854；子卡 CM-2855～2860 一次建；驗收後追加 CM-2863。2855／2856／2860／2863 Done；2857 In progress（交棒時 runner 跑中）；2858／2859 Not started。

**做了什麼**
- 需求兩項 → 判定粒度在整輪、新開 FR-145；探脈（調查結果頁、FR-141／142／143 匯出、結案凍結、問卷）。
- 雛形五畫面三輪審查；討論稿 D1～D16；design.md 六卡；開卡。
- 派卡 1、2 平行 → 驗收通過（實打端點、查 DEV）；決策者看畫面提三點，首腦直接修 commit；開卡 7。
- 派卡 6、7 → 卡 6 通過；卡 7 退回一半再通過。
- 順手：TipTap 編輯器 CSS 重整（決策者點名很醜）。

**決策**（全部決策者拍板，細節 design.md D1～D16）
- 兩層報告（階段／總）而非一份：客戶要報告的時間點是「這輪做到哪」與「整案做完」。被排除：只綁專案一份；只有階段報告。
- 無缺失不建階段報告：內容與總報告重複。被排除：每輪都建。
- 自動建立不設建立鈕：前五章全是算的，沒有需要人決定的事。
- 分段鈕只剩待撰寫／已完成、沒報告的專案不列：「尚未結案」是專案狀態混進報告狀態。被排除：三態含尚未結案（第一版，決策者看不懂）。
- 分頁一律 DataTable 內建、分組清單用 `lazy`＋`totalRecords`＝專案數：平行的 FR-142.9／143.8 證明可行。被排除：外掛 `GroupedListPaginator`（卡 7 第一版，已刪）。
- 「定稿」：「發出」「定版」都被退（看不懂）。存檔與定稿分開不做一組：後果差太多。
- Word 與 PDF 都給、顧問自行修改、系統只記日誌：決策者「介入不了」。
- 編輯器沿用 TipTap 不換：現用非 PrimeVue Quill（那個已因 XSS 換掉），MIT。

**教訓**
- 開卡時把程式碼裡一行舊註解當前提沒驗，且派工前沒看同區域平行棒剛動過什麼 → 卡 7 做出第二套機制。記進 memory `feedback_card_analogy_requires_premise_check` 第二案。
- design.md 預估卡號（CM-2853 起）→ 建卡時已被平行 FR-144.4 用掉 → 三處改。卡號建完再回填。
- Playwright MCP 的 `addInitScript` 會留在整個 session，之後每頁都炸 `setAttribute of null`；開新 tab 驗才乾淨。雛形共用 `proto.css` 已有 `.menu` class，自取同名會撞。
- DEV 沒有已送出的改善計畫，兩張卡的「有改善計畫」路徑只能單測覆蓋——驗收要主動造資料，不要接受「打折」累積到最後。
- 卡 2 runner 的 26 檔在 `git add` 與 `commit` 之間被平行 session 的 commit 帶走（`1f84d3bc6`）；內容完整但 commit message 錯位。平行 runner 要在 add 後立刻 commit。

**推翻了什麼**
- 卡 7 第一版（`88ca7ca8`）的前提「DataTable 內建分頁會截子列」被 `2c79a437`（FR-142.9）推翻；已由 `67e9e11c` 改正。
- README 討論紀錄曾寫「卡 3～5 等 FR-143」：FR-143 六張卡當天全 Done，依賴已解除。

**留給下一棒**：等 CM-2857 回寫後驗收，先在 DEV 送出一份改善計畫把卡 1／6 欠的路徑一起驗；通過再派 2858。

---

## 第 2 棒 — 2026-10-17 17:50 — 首腦（分析決策／協調）

**commits**
- runner 卡 3：BE `824bffc80`（新模組 closing_report、五支端點、docx 範本、下載紀錄 readmodel、5 個 error code、事件 6196／6197）、`85e2f6ee8`（截圖）；FE `6ea3ecc1`（ClosingReportView＋四子元件、composable、i18n、歷史頁定稿標記）。
- 前一棒收尾後另一首腦 session 插了 `a43c5736a`（SPEC 結案報告頁重寫到現況）。
- 本棒：README／STATE／LOG 更新（本 commit）。BE 依決策者令 push 一次。

**Notion**：CM-2857 Done（卡尾首腦復核段）；母卡 append 一行。2858／2859 Not started。

**做了什麼**
- 接手讀序＋自檢＋pre-flight，等令。決策者令「驗卡 3 然後 push」。
- 驗收：開檔核守門／浮水印／日誌 payload／DI；跑 139 條測試綠；重啟 BE 實打五支端點走完 412→存檔→v1→409→修訂→草稿 PDF→v2→xlsx 400→auditor／viewer 權限→定稿中還原 409→修訂後還原 v1；查 system_logs 事件、歷史表；Word 開檔六章＋附件一橫式；讀模型對 DB findings；FE build 過、border-left 零命中。

**決策**（runner 改判，首腦認可，不回頭改 design）
- 統計單位＝評估目標（與稽核報告附件一致），稽核結果頁頂部以控制項計，兩邊數字本就不同——不是 bug。
- 路由不新增，沿用 report-tab-view 當入口依 report_type 分流，免改 ui_routes。
- 已定稿報告不可從歷史頁還原（409），要先修訂；舊 PUT /project-summary-report 對已定稿也擋 409。
- 封面「受稽單位」系統沒欄位，用稽核計畫概要的稽核單位頂替；要加屬 FR-141 範圍，等決策者裁。

**教訓**
- 驗收打舊歷史端點時，先開 route 檔看參數形狀（`histories` 是 POST body `report_uid`、還原是 `history_uid`），猜 GET query 白打兩輪。
- runner 截圖可能早於同 commit 的 i18n 改動（麵包屑仍舊字），畫面類驗收以決策者複測為準。

**推翻了什麼**
- STATE §4「FR-142 e2e 是否受影響」推測：已查，test repo 沒有 ar/export e2e，只有舊專案調查結果頁四檔，屬母卡收口 e2e 重寫。

**留給下一棒**：派 CM-2858；DEV 仍無已送出改善計畫，三條「有改善計畫」路徑欠端到端驗，全流程測試時造資料一次驗。

---

## 第 2 棒（續）— 2026-10-17 18:40 — 首腦：卡 4 驗收

**commits**：runner 卡 4 BE `8fe83c3df`／FE `17c51806`；本棒文件 commit。FE 之間插了別案批次刪除兩筆（`3d66f646`、`c7a91f45`），BE 插了 FR-147 雛形與 memory 三筆，都不是本案。

**Notion**：CM-2858 Done（卡尾首腦復核段）；母卡 append 一行；2859 Not started。

**做了什麼**：開檔核 `pick_version` 規則、`COALESCE(sha256, checksum)` 與結案凍結同源、三端點守門、定稿存包；155 條測試綠；重啟 BE 實打 manifest／draft zip（解壓 19 檔對契約、21 列路徑全在包內）／定稿 v6 存包／歷史重下載／v7 後 v6 位元組不變／404／auditor 200／viewer 403／下載紀錄。

**決策**（runner 定、首腦認可）：同一份內容多副本依序讀，停用後端讀不到自動換下一份；對照表最後寫保證路徑存在；同佐證只收一次，同名異內容加「 (2)」；上限 1 GB 進 env `CLOSING_REPORT_BUNDLE_MAX_BYTES`。

**教訓**：卡 4 核心「依凍結雜湊取舊版」在 DEV 根本打不到——全庫零筆帶 content-hash 的凍結紀錄（1199 在凍結機制上線前結案）。首腦驗收只走到「舊資料退回目前檔」分支，與 runner 自報一致。**DEV 資料老化讓新機制的主路徑沒有真資料可驗**，這類卡驗收前要先查「主路徑在 DEV 有沒有資料」，沒有就造，不能只在打折處寫一行。列為全流程測試必驗。

**留給下一棒**：派 CM-2859。全流程測試必驗三項：有改善計畫路徑（卡 1／3／6）、結案後換檔包內仍舊版（卡 4）、本專案問卷佐證轉 PDF（卡 4）。

---

## 第 2 棒（續）— 2026-10-17 19:20 — 首腦：派卡 5、版面修正、開卡 8

**commits**：FE `04f58f2f`（文件撐滿套 dark-card、字級回基準、下載紀錄改對話框）、`7a836ec4`（表格字級對齊 DataTable）；BE `0d22e0651`（memory＋skill 規則）、本棒文件 commit。

**Notion**：CM-2859 派出（In progress）；新建 CM-2873（卡 8，Word 排版）；母卡 append 追加卡一行。

**做了什麼**：決策者看卡 3 畫面三連點（留白、右欄下載紀錄、風格像另一個產品字太小），首腦直接修兩筆並 headless 截圖驗。再看 PDF 裁「差很多」，首腦實際轉圖核對：八欄等寬、日期四行、族群矩陣壓一格、缺失表項目欄塞整句、封面無版面、Normal 14pt——開卡 8，等卡 5 回來派。

**決策**：Word 排版另開卡不塞進卡 3 驗收（卡 3 功能全對，排版是獨立交付品質）；等卡 5 再派因同一支產生器。

**教訓**：runner 把雛形「文件紙面」整套搬進頁面 CSS——雛形是給決策者看結構的，不是視覺規格。固化成 memory `feedback_fe_page_no_custom_typography_or_paper_layout` 與 skill 一節；派 FE 卡固定帶一句。另：runner 的 Word 只驗「有六章」沒看排版，首腦驗收 Word 也只開 python-docx 數段落沒轉圖看——**Word／PDF 驗收要 `pdftoppm` 轉圖用眼睛看**。

**留給下一棒**：驗卡 5 時同時核對它沒把 `04f58f2f`／`7a836ec4` 改回去；卡 5 通過派 CM-2873。

---

## 第 2 棒（續）— 2026-10-17 19:50 — 首腦：卡 5 驗收

**commits**：runner 卡 5 BE `2da62a70a`／FE `8c1c30e7`；本棒文件 commit。

**Notion**：CM-2859 Done（卡尾首腦復核段）；母卡 append 一行。六張實作卡全 Done，剩 CM-2873（卡 8）。

**做了什麼**：開檔核 final 五支新檔與連續／最後涵蓋兩個算法；170 條測試綠；FE build 過且首腦版面修正保留；重啟 BE 實打 1548（三次稽核）與 1321（兩輪）兩份測試總報告：跨多次未改善對 DB 原始判定、定稿第 1 輪 v9 後第 5 章帶入、總報告 zip 結構與合併對照表輪次欄、`第1輪/` 子包與 v9 定稿包逐檔 md5 相同、1321 zip 有 `覆核輪/`、Word 七章、權限、412。

**決策**（runner 定、首腦認可）：跨多次未改善只算連續（沒稽跳過不打斷、稽了沒判打斷）；最終判定看「最後一次有稽到這條」不是最後一次稽核；各輪子包有定稿包就原封收、沒有就即時產、讀不到不讓整包失敗；子包不重放自己的對照表。

**教訓**：驗對照表「包內路徑」時路徑已含專案根目錄，我又拼了一層 root 得出 18 筆 missing，差點誤判；先印一筆 sample 再寫斷言。

**留給下一棒**：派 CM-2873；全流程測試必驗四項（有改善計畫路徑、結案後換檔包內仍舊版、本專案問卷佐證 PDF、覆核全過的最終通過日）；複測完收掉 id 112／113。

---

## 第 2 棒（續）— 2026-10-17 20:15 — 首腦：卡 8 驗收，八張卡全 Done

**commits**：runner 卡 8 BE `0e95b7166`；本棒文件 commit。

**Notion**：CM-2873 Done；母卡 append 一行「八張全 Done，進收口」。

**做了什麼**：核 commit 範圍只在 closing（FR-142 helper 零 diff）、兩份範本 Normal 12pt；174 條測試綠；重啟 BE 下載三份報告 PDF 轉圖逐頁看，欄寬／矩陣三子欄／封面／短日期／缺失表兩行全到位；下載 FR-142 稽核報告確認沒被帶動。

**決策**：本機轉出字型不一致（總報告楷體、階段報告明體）查到是三份範本東亞字型都沒指定繁中，LibreOffice 替代不穩；不算本卡問題、不擋驗收，記進 STATE 待辦另議。

**教訓**：「兩份報告字型不一樣」第一眼像卡 8 改壞範本，開 styles.xml 逐字比對才確認三份完全相同——範本類問題先 diff 範本本體再下判斷。

**留給下一棒**：母卡收口七項（STATE §3），逐項等令。

## 第 2 棒（續）— 2026-10-17 20:50 — 首腦：收口 ①SPEC ②手冊

**commits**：`ea82f2ab9`（SPEC 子頁＋hub 改寫＋nav＋site 產物＋手冊＋tracker）；本棒文件 commit。

**做了什麼**：決策者令「更新 spec 跟其他文件」。依 `writing-feature-specs` 拆分判準（報告頁是獨立畫面）把結案報告 SPEC 拆成清單 hub＋子頁「結案報告內容頁」13 節，事實從 route／service／FE 元件實掃；手冊新開 `closing-report-guide.md` 七段白話。`mkdocs build --strict` 過。

**決策**：拆 hub＋子頁而非在清單頁塞 §1.1／§6／§9——報告頁有十個功能、七支端點、三個 UC，塞進清單頁會超過 450 行且兩個畫面混寫。

**教訓**：`db_schema.json` dump 早於 FR-145 migration，兩張表新欄在 dump 裡沒有；spec 註明「以 migration 檔與 live 為準」。下次出包前 `scripts/deliverables/` 重產 dump 時這段註記可拿掉。

**留給下一棒**：收口剩 ③e2e（test repo 另開一棒）④出貨基線重產 ⑤還原 pin ⑥進版 ⑦母卡收 Done，逐項等令。

## 第 2 棒 收工 — 2026-10-17 21:10 — 首腦交棒給總驗收首腦

**commits**：本棒文件 commit（STATE 改寫成總驗收視角）。本案 BE 10 筆、FE 11 筆未 push。

**做了什麼**：決策者宣告「開發到一段落，等等開 FR-139～147 全專案總測試，由總驗收首腦統一收尾」。STATE §0 讀序改成「先讀手冊再讀 SPEC §12」、§3 改成「總測試要造的四條情境（改善計畫路徑／結案後換檔／問卷佐證／覆核全過）＋發版前欠的九件事表」、§9 短 prompt 改給總驗收首腦。

**決策**：收口 ③～⑨（e2e、出貨基線、還原 pin、進版、母卡 Done、push）不在本棒做，交總收尾統一處理——決策者原話「都測完會來做全部的收尾」。

**教訓**：pyproject path dependency 實查是四支（含 oscal-v2），前幾棒 STATE 一直寫三支——交接檔裡的數字每棒都要重查，不能沿用。

**留給下一棒**：§3.2 四條情境、§3.3 九件事。測完清 DEV 112／113 測試列。

---
