FR-145 交接日誌(LOG)

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

§1

第 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

第 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 仍無已送出改善計畫,三條「有改善計畫」路徑欠端到端驗,全流程測試時造資料一次驗。


§3

第 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)。


§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。


§5

第 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。


§6

第 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),逐項等令。

§7

第 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,逐項等令。

§8

第 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 測試列。