這份是 living 檔:每棒就地 Edit,只描述「此刻」。歷史脈絡看同資料夾的
fr141-LOG.md。
| 項目 | 值 |
|---|---|
| 最後更新 | 2026-10-16 22:00(決策者裁示當全部驗過;三 repo 已 push;母卡+全部子卡 Done;套件未發版、主專案未進版) |
| branch | BE/FE/套件都在 feature/FR-139(主工作樹)。feature/FR-141 三 repo 皆保留,已全數併入,不要再在它上面開發 |
| 合併 commit | BE 75d3af54d、FE c4b0a359、套件 e3be08aa;已 push 到 origin/feature/FR-139(BE 30b0f8363、FE ba0aa033、套件 3b94ad67,套件分支已設追蹤) |
| 母案卡 | CM-2799 https://app.notion.com/p/FR-141-Excel-3fa346da4cd081dc86f3fd725ee2707f (Done,2026-10-16) |
| 子卡 | 雛形 CM-2800;實作 CM-2802~2810、CM-2814,全部 Done |
| 下一棒 | 無。收口待辦(§3)等 FR-140 收口後與套件發版一起做 |
| Notion 回寫規範 | docs/claude/notion-issue-tracker.md |
決策者原話(2026-10-15):「稽核計畫的功能需要整個重新調整……需要再多一塊稽核計畫的文字表單,內容如下面文件內 1-6 大點……這份儲存後要可以匯出類似範例搞格式的 docx or pdf」「目前的稽核計畫很難填寫,而且也不能 by ao 去寫是 by 控制項,需要改成可以 by AO 去填寫,要可以提供 Excel 匯出匯入」「畫面不要用舊的,舊的真的很難用」「一份 Excel 不同 Sheet 分兩頁……這樣就不用分兩種匯入」。
做出來長什麼樣:稽核計畫頁整個換掉,兩個頁籤——
資料存法:照 OSCAL 評估計畫標準欄位——六段文字進新表 oscal.ap_terms_and_conditions;一條 AO 一個 activity(control-objective-selections 帶 part_id);受評對象進 task 的 associated_activities[].subjects;本計畫新增的受評人員存 AP metadata party、角色 assessed。
不在本案:評估結果(AR)改逐 AO 判定與 Excel 的「佐證、結果」兩欄 → 已另開 FR-142(CM-2818)。
docs/features/FR-141-2610-audit-plan-ao-worksheet-and-report-export/design.md「分工概述」「決策定案」兩節全讀python3 scripts/notion_case.py get CM-2799 讀母卡最後一段「合併前現況」與「合併後決策者複測清單」fr141-LOG.md 最後 2 個 blockprototype/index.html(假資料,實作後新增的 B4 選單名、B5 受評人員新增不在雛形裡)| 項目 | 狀態 |
|---|---|
| 程式 | 在 feature/FR-139,三 repo 已 push(BE 14c7c5d75 起、FE ba0aa033、套件 3b94ad67);新端點 overview/objectives/export/xlsx-imports、report-title、assessed-people;舊 PUT /ap/<uid>/tasks 已移除 |
| worktree | 三個 repo 的 FR-141 worktree 都已移除;8001、5181 已停;worker(RUN_MODE=worker)沒動 |
| 測試 | 守衛+FR-141 相關 149 passed;FE npm run build:DEV 過 |
| manifest | 衝突兩邊列都留,check_migration_manifest.sh 通過 |
| DB(DEV 共用) | 已套:2026-10-16-fr141-ap-terms-and-conditions.sql(主線)、2026-10-16-fr141-audit-method-examine-label.sql(seed,「檢視」→「檢視/現場觀察」) |
| Notion | 母卡 CM-2799 與子卡 CM-2800、2802~2810、2814、2835 全部 Done |
| 文件 | SPEC〈稽核計畫填寫頁〉docs/spec-site/current/audit-execution/ap-authoring.md、使用手冊 docs/user-manual/audit-plan-guide.md、design.md「實作後改判」節、README 均已更新 |
| 卡 | 做什麼 | 狀態 |
|---|---|---|
| CM-2802 A1 | 計畫概要存得起來(terms 新表+overview API) | ✅ Done |
| CM-2803 A2 | 新頁殼+計畫概要頁籤+稽核次麵包屑 | ✅ Done |
| CM-2804 A3 | 報告稿 docx/pdf 匯出 | ✅ Done |
| CM-2805 A4 | docx 匯入寫進計畫概要 | ✅ Done |
| CM-2810 A5 | docx 匯入不再改寫行程(修 A4×B1 衝突) | ✅ Done |
| CM-2806 B1 | 逐 AO 存+AR 讀方法逐 AO | ✅ Done |
| CM-2807 B2 | 評估目標頁籤+刪舊頁與舊 /tasks | ✅ Done |
| CM-2808 B3 | Excel 匯出匯入+同畫面預覽 | ✅ Done |
| CM-2809 B4 | 第 2 次內稽/覆核輪範圍含未判定+承襲+「檢視/現場觀察」 | ✅ Done |
| CM-2814 B5 | 受評人員當場新增(存本計畫名單) | ✅ Done |
現況:決策者 2026-10-16 晚裁示「當我都驗過」,母卡與子卡已 Done,三 repo 已 push。決策者裁示先不發套件、不進版。
剩下的收口待辦(等決策者下令,FR-140 收口後一起):
115c8e3e1);SPEC 頁 ap-authoring.md 改寫、新寫使用手冊「稽核計畫使用指南」、README 與需求站 HTML 更新 → ✅ CM-2835 完成(54a600127),首腦復核過、Done;新使用手冊 docs/user-manual/audit-plan-guide.md。⚠️ 這節是建議清單,不是執行授權。接手方讀完盤點完即停,等決策者發令。
a927edd4),待決策者畫面複測。原因:fetchPdfUrl 沒帶 meta.withHeaders,攔截器直接回 Blob,程式卻解構 { data } 拿到 undefined,包成內容「undefined」的假 PDF。以下為原始紀錄::匯出對話框按「預覽」→ 前端 useApExportDownload.fetchPdfUrl 打 GET /ap/<uid>/export?format=pdf,拿 blob 包成 application/pdf 放進 ApReportExportDialog.vue 的 iframe。後端 log 那次 export 沒有任何錯誤(log/app.log 約 71796 行,req-fc89d098),所以問題在瀏覽器端。待查假設(都未驗):① axios 攔截器在 responseType: blob 時把回應包成信封,blob 不是 PDF;② meta: { withHeaders: true } 沒帶,回的是 data 而非 blob(下載用的 download() 有帶);③ 前門 CSP 擋 blob: 的 frame-src;④ LibreOffice 轉檔慢、對話框沒 loading。先開瀏覽器看 console 與 network,本棒瀏覽器工具整晚不可用所以沒查。70be6a8cc),登入狀態實打 docx 7/7 有值、PDF 正常。以下為原始紀錄::app/flow_control/service/ap_report_export_service.py 約 213 行,附件表每列稽核人員取 o.get("auditors"),只有該 AO 個別覆寫時才有值;沿用計畫概要名單時 auditors 為 null,格子就空白。修法:null 時改用計畫概要的稽核人員名單(畫面的 effectiveAuditors 同一規則)。修完匯出 Word 與 PDF 都要開檔確認,Excel 匯出要檢查是否同樣規則(Excel 空白=沿用是刻意設計,不要跟著改)。299a69b0d 新端點 return_response 少帶 status,一打就 500,決策者打開頁面才發現;只驗了未登入 401。之後新端點必須用登入狀態實打一次(瀏覽器或 test client)才算驗過。pyproject.toml 仍 pin jedi-oscal-v2==2.6.0:主 venv 目前是 editable 指主套件目錄(.venv/lib/python3.11/site-packages/jedi_oscal_v2.pth),所以 8000 吃得到新碼;有人在主工作樹跑 poetry install/update 就會換回 Nexus 2.6.0,計畫概要(terms)與逐 AO 會 500。驗證:.venv/bin/python -c "import jedi_oscal_v2,os;print(os.path.dirname(jedi_oscal_v2.__file__))" 應指 jedi-python-package/jedi-oscal-v2/...。test_fr132_t42_route_capability_mounts.py::...[api/flow_engine/routes/flow_engine_route.py]——FR-140.14(c496961a2)在 flow_engine_route 加了 route 沒登記附錄 A。已轉告 FR-140 首腦。test_error_code_mirror_parity(主專案錯誤碼比 jedi_compliance_audit 鏡像多;FR-141 前就紅),發套件時補鏡像。ap_overview_app_service.py 與 assessment_plan_app_service.py 直接 PartyRepoImpl() 未經 DI;套件兩處過期註解(audit_round_app_service.py、audit_round_pass_app_service.py 提到已刪的 set_tasks/_backfill_scope_from_tasks);list_ap_parties 不分角色,docx 匯入比對稽核單位用全量名單 → 改只比 organization。cd ~/Projects/Billows/Audit-Manager/compliance-manager-be
git branch --show-current # feature/FR-139
git log --oneline -1 75d3af54d # FR-141 合併 commit 存在
.venv/bin/python -c "import jedi_oscal_v2,os;print(os.path.dirname(jedi_oscal_v2.__file__))" # 要指主套件目錄
lsof -iTCP:8000 -sTCP:LISTEN -t # 8000 在跑
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8000/api/1.0/ap/x/overview # 401=路由在
curl -s -o /dev/null -w "%{http_code}\n" -X PUT http://localhost:8000/api/1.0/ap/x/tasks # 404=舊路徑已移除python main.py);worker 另一支行程(RUN_MODE=worker);log log/app.log。.env.development.local 指 8000)。localhost:5432,連線看 .env(DB_HOST/DB_PORT/DB_NAME/DB_PASSWORD),帳號 cmmgr。7cd12add-286d-4283-9e52-cdf3f5d2b450,決策者 10/16 晚新開)。1547 已軟刪。1321 為覆核輪範例。00_Compliance Manager/01_稽核文件/AirAsia實際稽核檔案/AP稽核計畫匯入測試檔案/(報告稿 docx、稽核紀錄 xlsx)。git add 自己的檔;不要跑會改整棵工作樹的 git 指令。pyproject.toml 有 FR-140 三支套件 path 設定未 commit(刻意),不要 stage、不要還原。log/app.log。__pycache__(見 closing-and-handoff skill)。接手 FR-141(稽核計畫重做)測試棒。先讀 docs/features/FR-141-2610-audit-plan-ao-worksheet-and-report-export/handoff/fr141-STATE.md(🧭 WHY、§0 讀序、§1~§4),再讀同資料夾 fr141-LOG.md 最後 2 個 block,並 python3 scripts/notion_case.py get CM-2799 看母卡「合併後決策者複測清單」。
回答 §0.4 冷接自檢 4 題,跑 §5 pre-flight 唯讀盤點。
讀取與盤點完成後不做任何事——不派工、不跑測試、不改檔,回報現況後等我下指令才開始作業。