7.0 KiB
7.0 KiB
Current Work Items
用途
只記這一輪正在做的事情。方向看 ROADMAP,分階段交付看 EXECUTION_PLAN。
規格重置(2026-03-22)
這輪以你最新決策為準:
- 實驗抓取:URL 規則 + 裝置限制
- 建立 Experiment 同步建立原始 Variant
- 移除
is_control - 移除
variant_changes.enabled - key 改系統生成:
EX+timestamp/VA+timestamp - Variant 移除
status,使用者只調name/traffic_weight
目前進行中
A. 文件與契約(✅ 完成)
SYSTEM_SPEC_MASTER已寫入 6 條新規格EXPERIMENT_SYSTEM_SPEC已更新為新流程API_CONTRACT_MASTER已更新欄位約束docs/MIGRATION_NOTE.md已建立:is_control/variants.status/variant_changes.enabled移除策略與 DB 清理建議
B. Backend 實作調整(✅ 完成)
domain/keys.py新建:generate_experiment_key()/generate_variant_key()→EXxxxxxx/VAxxxxxxExperimentCreate移除experiment_key欄位;service 層改為系統生成VariantCreate移除variant_key欄位;service 層改為系統生成- 建立 Experiment 時自動建立「原始版本」Variant
domain/admin.pyVariant 移除status、is_controldomain/editor.pyVariantChange 移除enableddomain/editor_builder.py移除 enabled 過濾schemas/admin.pyVariantRead / VariantCreate / VariantUpdate 同步更新repositories/directus/variants.pydefault_fields移除 status / is_controlrepositories/directus/variant_changes.pydefault_fields移除 enabled(修復 CORS/500 bug)schemas/editor.pyEditorChangeRead/EditorChangeWrite已移除enabledapplication/admin/releases.py移除 enabled / is_control 依賴;加 archive_release()application/editor/service.pybuild_preview 移除 enabled=item.enabled- Variant 流量權重加總 = 100 驗證(
_assert_weights_sum_100) repositories/directus/activity.py新建:Directus built-in/activity查詢application/admin/activity.py新建:ActivityService.list_for_experiment()api/admin/experiments.py加GET /{id}/activity端點api/admin/releases.py加POST /{id}/archive端點
C. Frontend 實作調整(✅ 完成)
VariantFormDialog.vue簡化為只保留name+traffic_weightvariant-view-model.js移除status、isControl、buildVariantStatusTagexperiment-view-model.jsmapVariantItem移除status、isControl;mapReleaseItem加versionNoexperiment/detail.vue改寫為 5 tab 設計(實驗設定 / 變體列表 / 版本列表 / 目標設定 / 操作紀錄)variant/detail.vue移除狀態/角色 metric card;完整 change set 摘要已存在use-variant-detail-page.js移除roleLabel、variantStatusTaguse-experiment-detail-page.js完整重寫:含 activityLog、release lifecycle、experiment settingsrelease-api.js加archiveRelease()experiment-api.js加listActivity()dashboard/home.vue已有真實實驗統計摘要- 清理未使用的
openFirstVariantEditor/statusTypeMap從 composable return
D. 驗證清單(規劃項)
- 建立實驗後自動產生原始 Variant 的 E2E 測試
- Key 自動生成格式測試:
EX+timestamp/VA+timestamp - URL + device targeting 命中測試
- Release build / publish / rollback / archive 回歸測試
- Directus Activity log 在真實環境顯示正常
E. Runtime 實作修正(✅ 完成)
domain/runtime.py移除RuntimeVariantCandidate.is_controlschemas/runtime.py移除RuntimeVariantCandidateInput.is_controlapplication/runtime/assignment.pybootstrap()移除 variantfilter[status]查詢(variants 已無 status 欄位)application/runtime/assignment.py移除所有is_control=variant.is_control引用application/runtime/assignment.py_matches_targeting()實作完整 URL rule 匹配:contains/equals/starts_with/regex四種 operatordevice_targets裝置限制(mobile / tablet / desktop via user-agent 偵測)- 空 url_rules 時 fallback 到
base_urlstartswith 檢查
F. Staging 真實環境驗證(✅ 完成,2026-03-23)
- Auth flow:
/api/auth/me→ 確認 is_admin + 完整 permissions - Site 查詢:
ose-demo-localsite 可讀 - Experiment 建立:key 自動生成(
EX1774195099342) - 原始版本 Variant 自動建立(
VA1774195099525,weight=50) - 第二個 Variant 建立(weight=50,總計=100)
- 權重驗證:嘗試新增 weight=1 的第三個 variant → 正確回傳 400
- Variant change 儲存:
replace_text操作可寫入 - Release build:
runtime_payload格式正確,operations 包含 selector + action + payload - Publish / Rollback / Archive 鏈路全部可跑
- Experiment 設為 running + targeting_config 儲存
- Runtime bootstrap:URL rule 命中正確(
example.com✓,other-site.com→ 0 candidates ✓) - Activity log:6 筆操作紀錄正確回傳(建立/更新/版本/變體)
G. Code Review 待修(✅ 完成,2026-03-23)
P0Release lifecycle 修正:publish()先 unpublish 同實驗其他 published release,rollback()會回退到較早版本。P0Editor preview API 契約對齊:前端buildPreview()改送items(原為changes),與BuildPreviewRequest.items一致。P0save_changes()改為完整覆蓋語意:先刪除 DB 中不在 request items 的舊 change,再 upsert。P1移除variant_changes.enabled:EditorChangeRead/EditorChangeWriteschema 刪除欄位;frontendeditor-workspace-model.js同步清除。P1建立 Experiment 時前端不再送experiment_key(ExperimentFormDialog移除autoFillKey、_auto_key、_generated_key)。P1Runtime bootstrap 改為從 release snapshot 讀取traffic_weight/variant_key,避免即時 variant 異動造成分流不一致。P1Editor bridge snippethandleMessage加event.source === window.parent驗證;EditorCanvasFrame捕捉event.origin並存入canvasOrigin,postMessage 改用具體 targetOrigin(fallback"*")。P1Release rollback 邊界條件補強:只允許 rollbackpublishedrelease,並在 publish/rollback 後保證同一 experiment 僅有一個published。P2補自動化測試:Backend API 契約、Editor flow、Runtime targeting/assignment、Release lifecycle 回歸。P2文件狀態一致化:ROADMAP、CURRENT_WORK_ITEMS、VALIDATION_EXECUTION_LOG的完成狀態同步。
系統狀態
Phase A–G 主線已完成(2026-03-23),目前剩餘:2 項 P2 強化。
目前系統可運作;P1/P2 完成後可進一步提高一致性與可回歸性。
延後項目
- 大型 UI polish
ose-card深度重構conutdown-timer深度重構