使用方式:把下方「交接 prompt 本體」整段貼到新 session 即可接手。 前置狀態:A4 Session E BE shipped(T6 / T7 / T8 三 commit + 1 docs 收尾 commit);working tree 乾淨(除 pre-existing pyproject.toml dev-path + 2 zip)。
我要進 SSP 匯入匯出 Phase 2 / A4 Session F — T9 + T10 + T11(unit/integration test 補齊 + cucumber regression + 收尾 SUMMARY)。
執行策略
========
Session F 是 A4 task arc 的收口 session。重點:
1. T9 BE unit + integration test 補齊(plan §Task 9 要求 ~110-140 個 A4 test;Session E 累計 ~155 個已超過下限,視 acceptance 缺哪幾種 boundary case 補齊)
2. T10 cucumber regression(跨 repo — compliance-manager-test)
3. T11 收尾:design §11 補齊(如有 T9/T10 階段新偏差)+ tracker README + 對話歷史 dump(task arc 收口)+ summary 報告
可以用 subagent 平行 T9(unit test 補齊)跟 T10(cucumber,跨 repo)— 兩段完全獨立。T11 收尾必須 sequential 等 T9/T10 ship 後。
前置狀態
========
Branch: feature/ssp-import-export-phase2(BE,48 commits 未 push 待 user 手動推)
A4 Session 進度:
- Session A (design-A4.md) shipped:1de5f51
- Session B (implementation-plan-A4.md) shipped:57bcb2e
- Session C T0+T1+T2 (base + 5 reconciler skeleton + orchestrator + DI) shipped:57a9567 + 72ef229
- Session D T3+T4+T5 (reconciler full algo + A3 retroactive + A2 §15.3 整併) shipped:7c2b860 + 8936aab + 9d7c102
- Session E T6+T7+T8 (SSP shell + 5 WriteStrategy + 8-step pipeline) shipped:40c4a12 + 579eb76 + 78118eb
- Session E 收尾 docs shipped:<E.收尾 commit hash 待填>
A4 BE 累計 8 個 feat commit + 1 個 docs 收尾 commit;test 累計 250+ a4 test 全綠(含 a3 67 + a2 ssp_excel 29)。
jedi-oscal 仍 path-dep;pyproject.toml dev-path 改動仍未 commit(feature 整體完工後 user 拍板才一次性 bump 版本)。
design §11.1.10-11.1.16 已補 Session E 7 條偏差紀錄(E1: GRC_412066→412026 / E2: SspSysImpl link 走 scope_type/scope_id / E3: DI 名 main / E4: ModuleFrame 無 oscal_profile_id → profile_domain 兩段式 / E5: base class 加速策略 / E6: by-key 對齊 helper / E7: dep 從 11→12)。
Session F 範圍
==============
T9 — Unit + Integration Test 補齊(implementation-plan-A4.md §Task 9)
目標:補到 design §8 acceptance(A4 累計 ~110-140 個 test)。Session E 累計 ~155 個已過下限,但缺幾種 boundary case:
- 9.1 reconciler 邊界 case:
- Device:雙欄不同 ip / IP 空 / multiple match / 純 fallback 三階段排序
- InfoSystem:system_owner_label 解析失敗仍 set matched_info_system_id / abbr 配對 / name 空
- Leveraged:candidate cache lifecycle / fuzzy 多 candidate 取第一 / suffix 無剔除 → UNMATCHED
- CatalogControl / AssessmentObjective:catalog_id missing / parent 配不到 AO unmatched
- 9.2 WriteStrategy 邊界 case:5 strategy 各加 3 個(batch 寫入 / domain service exception swallow / empty list 不 fail)
- 注意:Session E 寫 T7 時,Device/InfoSys/Leveraged 共用 base class 已涵蓋 batch + exception 在 test_a4_write_strategy_base.py,subclass 不需重測;Control/AO 跨兩張獨立 table 才需個別補
- 9.3 integration test:5 個 entity 從 Excel → reconcile → write 全鏈跑通(mock 各層)
- 注意:Session E test_a4_write_all_data_pipeline.py 已有 4 個 pipeline test(superset / update / skip when dep None / AO sci_id 注入)— 9.3 補的是「Excel → reconciler → write 端到端」整段串通的全鏈整合,比 pipeline test 更上層
Commit:`test(oscal): A4 T9 unit + integration tests`
T10 — Cucumber Regression(compliance-manager-test repo)
跨 repo work — 在 `~/Projects/Billows/Audit-Manager/compliance-manager-test/` 開 branch。
新建 `features/regression/module-frame/06-ssp-excel-import-entity-match.feature` 含 5 scenarios:
- control_id 對到 catalog 內 control (exact)
- device matched_device 下拉選定 (user_selected)
- info_system name 對到 tenant entity (exact)
- leveraged provider fuzzy 對到 Party (fuzzy_name_prefix)
- AO objective_id 父 control 配到後自身配到 (exact)
step + page object 沿 A3 cucumber regression pattern(compliance-manager-test/feature/a3-ssp-party-match-regression 已 ship 在 commit 27e52fe)。
Cucumber 跑通 → ship。Env 未配齊(需 fixture seed device/info_system/Party)允許 partial ship — 沿 A1/A2/A3 partial ship 先例。
Commit (test repo):`test(compliance-manager-test): A4 T10 cucumber entity match regression`
T11 — A4 task arc 收尾(implementation-plan-A4.md §Task 11)
完整收尾流程(按 CLAUDE.md「做 summary 觸發完整收尾」):
1. 跑全 pytest 確認 0 regression(Session E 已驗,T9 ship 後再驗一次)
2. 規範文件齊全度:
- changelog:Session E 已寫 `docs/changelog/2026-05-20-feat-ssp-excel-import-phase2-a4-write-pipeline.md`;T9/T10 可合併補一個 `2026-05-XX-test-a4-tests-and-cucumber.md` 或併入 final 收尾 changelog
- design §11.1:Session E 已補 7 條(11.1.10-11.1.16);T9/T10 若有新偏差再補 11.1.17~
- issue:若 T9/T10 發現新 root cause bug,開 `docs/issues/pending/<...>.md`
3. 對話歷史歸檔(cross-session task arc 收口):
- `docs/conversation-history/<YYYY-MM-DD>/ssp-import-export-phase2-A4/` 目錄
- 依 phase 拆 `part-NN-of-NN-<sub-topic>.md`(A 設計 / B plan / C reconciler / D reconciler-details / E write-pipeline / F test-cucumber)
- **不做格式化 / 不過濾 / 不二次加工** — 使用者匯出的原始對話直接寫入
4. 產 SUMMARY 報告 → `docs/features/FR-011.2-2605-ssp-import-export-phase2/handoff/2026-05-XX-a4-SUMMARY.md`
- commits 清單(A4 全 phase 8+ commits)+ test 累計 / 改動範圍 / 行為差異
- 規範文件清單(changelog / design §11 / tracker / cucumber feature)
- 已知 follow-up(A5 phase / F-A4-cucumber-extra / F-A4-refactor)
- 部署 handover:jedi-oscal 仍 path-dep;feature 整體 ship → user 拍板 → bump jedi-oscal 版本 → 推 Nexus → 主專案 pin 新版本
5. Tracker README.md 更新:
- A4 row 狀態改 **「BE shipped ✅ + Cucumber 視 env 配齊」**(Session E 已標 BE shipped;T10 ship 後再標 cucumber 段)
- 整段 task arc 收口在 ledger
Session F 三 task 全 ship 後,產 handoff F→A5 prompt(如果接 A5;或者整個 A4 收口進 archived 狀態)。
開工 SOP
========
第一步:必讀文件(順序)
1. 本 handoff prompt(你正在看)
2. docs/features/FR-011.2-2605-ssp-import-export-phase2/implementation-plan-A4.md §Task 9 / §Task 10 / §Task 11
3. docs/features/FR-011.2-2605-ssp-import-export-phase2/design-A4.md §11.1.10-11.1.16(Session E 落地偏差)
4. docs/changelog/2026-05-20-feat-ssp-excel-import-phase2-a4-write-pipeline.md(Session E 完整 ship 紀錄)
5. A3 cucumber pattern 參考:compliance-manager-test commit 27e52fe(branch feature/a3-ssp-party-match-regression)
6. tests/test_a4_*.py 既有 9 個 test file 看 boundary case 覆蓋現況
讀完後給「我看完了,準備 T9 開工」確認。
第二步:T9 開工(可走 subagent 平行)
不要 subagent 平行:T9 只動 tests/,全在主 session 順做更快(每個 test 1-2 個 file,加上不需 reconciler 演算法的細節 context)。
要 subagent 平行:T9 + T10 兩條獨立工作 — T9 在主 repo / T10 跨 repo。可以 dispatch 2 個 subagent 同時做。
但 T9 跟 T10 都有 user 拍板的步驟(feature 寫法 / commit message 樣板),subagent 平行需先把 prompt 寫清楚。建議:**T9 順做(30-60 min)→ T10 平行(subagent dispatch 給 compliance-manager-test repo)→ T11 收尾**。
第三步:T10 開工(跨 repo)
切 cd ~/Projects/Billows/Audit-Manager/compliance-manager-test/,工作完整指引在 plan §Task 10。
切回 BE:cd ~/Projects/Billows/Audit-Manager/compliance-manager-be/。
第四步:T11 收尾
按上方收尾 5 步驟做。
鐵律(沿用 A0.1 + A1 + A2 + A3 + A4 全部)
==========================================
1. 顯式 git add <file>,禁 -am / -A — commit 前 git status --short 確認
2. jedi-oscal 維持 path-dep,不 bump 版本不推 Nexus(feature 整體完工才 bump)
3. pyproject.toml dev-path 改動不該 commit
4. BE 重啟必 lsof -ti:8000 | xargs kill -9(T9 補 test 不需重啟;T10/T11 cucumber 跑 e2e 才需要)
5. 改 BE service code 後必提醒 user 重啟 — BE 沒 hot reload
6. DDD 嚴格分層 — Route 不碰 DB,App Service @transaction
7. 不寫 docstring / 註解除非真有 non-obvious 的 why
8. Test 用 mock 包 logger 避開 jedi DBLogHandler 撞 SessionLocal=None;@transaction 用 patch_session_scope
- patch path: `app.oscal.service.ssp_excel_import_app_service.logger`
9. T9/T10 若發現新偏差 → 補 design §11.1.17~
10. 跨 repo 切換時提醒 user:cucumber 在 compliance-manager-test repo,commit / branch 分開
11. 重大決策 → docs/analysis/YYYY-MM-DD-<topic>.md
12. 重型 bug / 跨域問題 → docs/issues/pending/YYYY-MM-DD-<title>.md
13. Handoff 文件統一放 docs/features/<feature>/handoff/
14. 階段性 commit 不用問
15. Subagent dispatch prompt 必加「git add 顯式檔名,禁用 -am」
16. 套件異動需 user 拍板(jedi-* 加欄位 / 改 service 簽章前必先提)
Session F 預估規模
==================
- T9: 0.5d(~20-30 個 boundary case 補齊;累計 a4 ~155 → ~180 個)
- T10: 0.5-1d(5 scenarios feature + step + page object;跨 repo work)
- T11: 0.5d(changelog / design §11 / 對話歷史 / SUMMARY / tracker 更新)
總計:~1.5-2d / 3 commit (BE T9) + 1 commit (test repo T10) + 1 commit (BE T11 docs)。
不在 Session F 範圍
====================
- A5 phase(預覽 UI + Confirm 寫入;用 Session E ship 的 _update_parsed_result_with_reconcile 回填的 matched_*_id / match_method)
- jedi-oscal 版本 bump + Nexus 發版(user 拍板才做)
- BE / FE / test 跨 repo merge 到 main(user 手動推)
謝謝。
本 handoff prompt commit 後,新 session 接手即可: