| 項目 | 內容 |
|---|---|
| Phase | Phase 1 / 5 — COMPLETE |
| 日期區間 | 2026-05-24 全日(早上 brainstorm/plan + 下午 Tasks 2-9 + 晚上 Tasks 11-12-14) |
| Branch(兩 repo 一致) | feature/ssp-oscal-alignment |
| 完成 Tasks | 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14(11 / 14) |
| 跳過 Tasks | 10(E2E)、13(套件進版+push)— 詳見下方「為何跳過」段 |
| 主專案 local commits | 15(全 local,未 push) |
| jedi-oscal local commits | 18(全 local,未 push) |
| 主專案 working tree | M pyproject.toml(Task 1 dev-only path dep,永遠不 stage,Task 13 才還原;併入 Phase 2 收尾) |
| jedi-oscal working tree | clean |
| Dev DB | 4 新 OSCAL 表 + RLS + 12 LA + 341 components + 12 FK linked;舊表 + 舊 M2M 全 DROP |
| 下一步 | Phase 2 — Import Pipeline 對接(6d 預估) |
✅ 把 OLD 單一 SspSystemImplementationItemEntity(implementation_type 區分 hardware/system/leveraged-authorization 3 族)拆成 OSCAL-correct 3 entity(LeveragedAuthorization / Component / InventoryItem + M2M join),落地到 DB + 套件 + 主專案 BE 全層。
✅ 12 leveraged_authorizations + 341 components(164 hw + 165 system + 12 service)migrate 完成且 verified。
✅ 18 個主專案 callers refactor 完成(含 6 個 write strategies + 3 個 context services + ssp_versioning clone logic)。
✅ jedi-oscal 套件 9 個舊 file 刪光、4 個 surgical clean,pytest 從 86 → 84 passed(-2 過時 type-validation tests)。
✅ 主專案 pytest 102 passed, 1 skipped, 0 failed。BE import smoke 9/9 OK。
✅ 舊表 oscal.ssp_system_implementation_items(394 rows) + 舊 M2M oscal.ssp_inventory_item_components(0 rows) 全 DROP,53 orphan dev test fixtures 一併清掉。
| # | Task | Status | Notes |
|---|---|---|---|
| 1 | 主專案 pyproject.toml path dep | ✅ 落地(dev-only, M pyproject.toml) | Task 13 還原前一直留 |
| 2 | jedi-oscal PR-1 LeveragedAuth | ✅ SHIPPED | 5 commits |
| 3 | jedi-oscal PR-2 Component | ✅ SHIPPED | 5 commits + partial index |
| 4 | jedi-oscal PR-3 InventoryItem + M2M | ✅ SHIPPED | 6 commits + 1 follow-up |
| 5 | 主專案 ParsedExcelEntityBundle restructure | ✅ SHIPPED | 95e9efd |
| 6 | DI container wire 3 services | ✅ SHIPPED | 2e6849f |
| 7 | DB Step 1 — 建 4 表 + RLS | ✅ SHIPPED | a9712a1 |
| 8 | DB Step 2 — migrate data | ✅ SHIPPED | 567efe7 |
| 9 | DB Step 3 — verification gates | ✅ SHIPPED | c5b43fb |
| 10 | E2E 測試 | ⏭ SKIPPED(user 拍板) | Phase 2 會重設計 confirm pipeline,現寫 throwaway |
| 11A | jedi-oscal 套件 cleanup + 主專案 DI 移除 | ✅ SHIPPED | jedi-oscal ebadfe8 / 主專案 2776d15 + f9e6de7 |
| 11B-1 | Domain write strategies refactor | ✅ SHIPPED | 8a81c22 + 5eaee30 (review fix) |
| 11B-2 | App services refactor(含 follow-up 3 BLOCKED 解決) | ✅ SHIPPED | 7d1d0a7 + 176c977 |
| 11B-3 | Tests refactor + backward-compat shims 清理 | ✅ SHIPPED | 94891eb |
| 12 | DROP 舊表 + 53 orphan + 舊 M2M | ✅ SHIPPED | af3b095 |
| 13 | jedi-oscal bump 0.0.18 → 0.1.0 + Nexus + 主專案 pin 還原 | ⏭ DEFERRED to Phase 1+2 ship | user 自決時機 |
| 14 | Mini-handoff(本文件) | ✅ SHIPPED | full changelog 延到 Phase 1+2 ship |
Phase 1+2 是同一 deploy unit(per design.md §3),Phase 2 會重設計 import confirm pipeline。此時間點寫 E2E test 也是 throwaway——pytest 102 + smoke 9/9 已涵蓋 unit + import smoke 層級;DB migration 已有 3 verification gate(Task 9)。E2E 留到 Phase 2 confirm pipeline 完工後一起寫。
Phase 1+2 綁定 deploy(避免「adapter 已輸出新 bundle 但 confirm path 還沒上」中間態),partial release 沒意義。繼續用 poetry path dependency 跑 Phase 2 開發,Phase 1+2 都 ship 時才 bump + push + 還原 pin。
6f04da7)| Commit | 摘要 |
|---|---|
ebadfe8 |
refactor(oscal): remove deprecated SspSystemImplementationItem (Task 11A) |
ac1d860 |
fix(oscal): harden InventoryItem M2M contract (PR-3 follow-up) |
2162af2 |
feat(oscal): add InventoryItemDomainService (PR-3 part 6) |
646cc38 |
feat(oscal): add InventoryItem repo + M2M write path (PR-3 part 5) |
1b22843 |
feat(oscal): add InventoryItemMapper + tests (PR-3 part 4) |
c358d8e |
feat(oscal): add OscalInventoryImplementedComponent M2M ORM (PR-3 part 3) |
9d0db75 |
feat(oscal): add OscalInventoryItem ORM (PR-3 part 2) |
1281121 |
feat(oscal): add InventoryItemEntity + QueryEntity (PR-3 part 1) |
29b3bf0 |
feat(oscal): add ComponentDomainService (PR-2 part 5) |
f498af1 |
feat(oscal): add Component repo + impl (PR-2 part 4) |
697a460 |
feat(oscal): add ComponentMapper + tests (PR-2 part 3) |
fdfd317 |
feat(oscal): add OscalComponent ORM with partial index (PR-2 part 2) |
157d2bc |
feat(oscal): add ComponentEntity + QueryEntity + enums (PR-2 part 1) |
a748205 |
feat(oscal): add LeveragedAuthorizationDomainService (PR-1 part 5) |
fed9970 |
feat(oscal): add LeveragedAuthorization repo + impl (PR-1 part 4) |
773c5eb |
feat(oscal): add LeveragedAuthorizationMapper (PR-1 part 3) |
bf12dc9 |
feat(oscal): add OscalLeveragedAuthorization ORM (PR-1 part 2) |
ab66af0 |
feat(oscal): add LeveragedAuthorizationEntity + QueryEntity (PR-1 part 1) |
d6fab20)| Commit | 摘要 |
|---|---|
af3b095 |
Task 12 — SQL step 4 DROP 舊表 + 舊 M2M |
f9e6de7 |
Task 11A 收尾 — chore stale comment update |
2776d15 |
Task 11A — 移除主專案 DI 舊 providers |
94891eb |
Task 11B-3 — 移 3 shims + migrate 11 tests |
176c977 |
Task 11B-2 follow-up — 3 context services props JSONB 收尾 |
7d1d0a7 |
Task 11B-2 — app services + project layer refactor |
5eaee30 |
Task 11B-1 review fix — LeveragedWriteStrategy tighten except scope |
8a81c22 |
Task 11B-1 — domain write strategies refactor |
af0ea33 |
docs — Phase 1 Tasks 2-9 SHIPPED handoff |
1f944e2 |
docs — design.md v1.1 → v1.2 §11 reconciliation |
c5b43fb |
Task 9 — SQL verification |
567efe7 |
Task 8 — SQL migrate data |
a9712a1 |
Task 7 — SQL create tables + RLS |
2e6849f |
Task 6 — DI wire 3 services |
95e9efd |
Task 5 — ParsedExcelEntityBundle restructure |
oscal.ssp_leveraged_authorizations rowsecurity=t 12 rows
oscal.ssp_components rowsecurity=t 341 rows (164 hw + 165 system + 12 service)
oscal.ssp_inventory_items rowsecurity=t 0 rows (Phase 2 import populates)
oscal.ssp_inventory_implemented_components rowsecurity=t 0 rows (M2M join)
舊表狀態:
oscal.ssp_system_implementation_items → DROPPED ✅oscal.ssp_inventory_item_components (OLD M2M) → DROPPED ✅FK linkage:12/12 service components 全綁回 leveraged_authorizations.uid。
| 項目 | 狀態 |
|---|---|
| design.md v1.2 + §11 reconciliation(11 條 deviations) | ✅ |
| implementation-plan-phase1.md + SHIPPED markers | ✅ |
| handoff(本文件) | ✅ |
| changelog | ⏸ 延後 — 跟 Phase 2 ship 一起 batch 寫(CLAUDE.md「收尾才 batch 寫」+ Phase 1+2 同一 deploy unit) |
| conversation-history JSONL extract | ⏸ 延後 — 同上 |
| analysis 文件 | ✅ design.md §11 已涵蓋本 session 重大決策(不另寫) |
SspImportTemplateAppService._build_info_systems 回傳 dict 把 implementation_type key 改成 component_type。Excel template 下游若依賴 "implementation_type" key,Phase 2 e2e 要驗。project_device_route 410-Gone 未實作(Task 11B-3 發現):tests/test_c3_scope_migration.py::test_gone_response_uses_grc_error_code 用 @pytest.mark.skip,需獨立任務實作 410 route。leveraged_authorization_uid 指向已刪 LA.uid)。Phase 4 FE 重設計時要處理。AbstractSspComponentWriteStrategy.write() sys_impl_main_id dead param(Task 11B-1 review minor):caller signature compat 保留,但實際內部不用。Phase 2 完成 import pipeline 後可從 caller chain 全刪。你接手 SSP OSCAL Alignment 開發。Phase 1 完整 SHIPPED(11/14 tasks,跳 Task 10 E2E + Task 13 進版)。請按以下順序讀文件:
1. docs/features/FR-028-2605-ssp-oscal-alignment/handoff/2026-05-24-phase1-COMPLETE-SUMMARY.md(本文件 — 5 分鐘)
2. docs/features/FR-028-2605-ssp-oscal-alignment/design.md §11 (11 條 spec/reality reconciliation)
3. docs/features/FR-028-2605-ssp-oscal-alignment/design.md §3 (5 phase 概覽) + §4「Phase 2 — Import Pipeline 對接」段
4. docs/features/FR-028-2605-ssp-oscal-alignment/implementation-plan-phase1.md SHIPPED markers(skim — 想清楚 Phase 1 留下的 followup)
開工前 pre-flight:
1. 兩 repo 都應 print `feature/ssp-oscal-alignment`:
git branch --show-current
git -C ~/Projects/Jedicogy/module/jedi-python-package/jedi-oscal branch --show-current
2. Dev DB 確認 Phase 1 final state 還在:
PGPASSWORD='jedi@123!' psql -h 192.168.50.188 -p 25432 -U cmmgr -d guidant_ai_dev -c "
SET app.is_super_admin='t';
SELECT
(SELECT count(*) FROM oscal.ssp_leveraged_authorizations) AS la,
(SELECT count(*) FROM oscal.ssp_components) AS comp,
(SELECT count(*) FROM oscal.ssp_inventory_items) AS inv,
EXISTS (SELECT 1 FROM information_schema.tables
WHERE table_schema='oscal' AND table_name='ssp_system_implementation_items') AS old_main_exists;"
預期: la=12, comp=341, inv=0, old_main_exists=f
3. 主專案 + jedi-oscal pytest 都應綠:102 + 84 passed
下個任務 — Phase 2「Import Pipeline 對接」(design.md §4):
- 2.1: ssp_excel_import_app_service 改走新 entity write path
- 2.2: docx import 對接(Stage 1 docx-import-parity 上接此處)
- 2.3: schema_version migrating logic(Phase 1+2 ship 時的中間 parse_jobs 處理)
開工模式: subagent-driven mode,每 task 派 implementer + spec reviewer + code quality reviewer(per superpowers:subagent-driven-development)。
Phase 1 跟 Phase 2 同一 deploy unit,收口要做:
Full changelog(Phase 1 + Phase 2 batch):
docs/changelog/2026-05-XX-feat-ssp-oscal-alignment-phase1-phase2.mdtype=feat, breaking=trueConversation history extraction:
# 把 2026-05-24(Phase 1 全部)+ Phase 2 開發日期一起跑
poetry run python scripts/extract_claude_sessions.py \
--date 2026-05-24 \
--topic ssp-oscal-alignment-phase1 \
--auto
# Phase 2 日期再跑一次存到 docs/conversation-history/<date>/ssp-oscal-alignment-phase1/ 跟 .../ssp-oscal-alignment-phase2/。
Task 13 完整執行(Phase 1+2 ship 時):
0.0.18 → 0.1.0 + commit + push + 推 Nexuspoetry update jedi-oscalPhase 1 + Phase 2 SUMMARY:總收口報告寫到 docs/features/FR-028-2605-ssp-oscal-alignment/handoff/<YYYY-MM-DD>-phase1-phase2-FINAL-SUMMARY.md,本 mini-summary 是子集。
Phase 1 Tasks 2-9 實作過程中跟 design.md §1-§8 原始 spec 有 11 條偏差(mostly ORM style / UUID type / repo interface pattern / DB schema reality 對不上原 spec assumptions),全部記在 design.md §11。最大的 trap §11.10:design.md §1.3 寫的 migration SQL 跟實際 DB schema 大幅偏離(假設的 8+ FedRAMP columns 不存在、tenant 解析要 4-table chain、discriminator 是 implementation_type 不是 category)— Phase 2 開工者先讀 §11.10 + §11.11,避免再踩坑。
| 用途 | 路徑 |
|---|---|
| Spec v1.2 + §11 reconciliation | docs/features/FR-028-2605-ssp-oscal-alignment/design.md |
| Implementation plan | docs/features/FR-028-2605-ssp-oscal-alignment/implementation-plan-phase1.md |
| Brainstorm 6 Topic 拍板 | docs/analysis/2026-05-24-ssp-oscal-alignment-phase1-brainstorm.md |
| 本 handoff | docs/features/FR-028-2605-ssp-oscal-alignment/handoff/2026-05-24-phase1-COMPLETE-SUMMARY.md |
| 早段 handoff(brainstorm 收尾 → Tasks 2-3 開工前) | docs/features/FR-028-2605-ssp-oscal-alignment/handoff/2026-05-24-phase1-task2-3-handoff.md |
| Tasks 2-9 SHIPPED handoff(中段) | docs/features/FR-028-2605-ssp-oscal-alignment/handoff/2026-05-24-phase1-tasks-2-9-shipped-handoff.md |
| SQL migration(Task 7-9 + 12) | scripts/sql/2026-05-24-ssp-oscal-alignment-*.sql 4 個檔 |
| 套件 root | ~/Projects/Jedicogy/module/jedi-python-package/jedi-oscal/ |
| 新 entities | jedi_oscal/domain/entity/base/oscal_{leveraged_authorization,component,inventory_item}_entity.py |