動作
Feature #366
進行中
SC
ARCH-1 Stage B 工程批:serializer lat/lng 快取修復+D5/D9 擇日避讓+devil E1/E3 雙防線修復(352 測試綠)
Feature #366:
ARCH-1 Stage B 工程批:serializer lat/lng 快取修復+D5/D9 擇日避讓+devil E1/E3 雙防線修復(352 測試綠)
狀態:
New
優先權:
Normal
被分派者:
-
開始日期:
2026-07-13
完成日期:
完成比例:
0%
預估工時:
概述
ARCH-1 Stage B 工程批:serializer lat/lng 快取修復+D5/D9+devil E1/E3 修復¶
背景¶
Feature #365(Stage B 演算法細化批)收尾時的 5 前置調查發現:serializer _strip_destination_vhard() 無條件剔除 Destination.lat/lng,與 node 層「保留 ≤30 天快取(帶 geo_cached_at)」不一致——system-architect 已定性為實作缺口(data-model §3 DM-S1 L59 規格自始正確,實作未落實)。同時 devil 前輩報告排定下一棒 D5(診斷欄位補強)、D9(多筆長檔期 EventNode 系統性堆積最早重疊日)、D4(打包業主不實作)。
變更內容¶
1. serializer/loader Destination lat/lng 快取修復(DM-S1 L59 實作缺口)¶
-
serializer.py_strip_destination_vhard():改比照 node 層規則 4 保留 lat/lng 現值(帶 geo_cached_at),不再無條件佔位化 -
loader.py新增_clear_expired_destination_geo():載入時依 geo_cached_at 判過期(>30 天或缺失→lat/lng 清 None);舊格式佔位 dict 向後相容維持
2. D5:DestinationOwnedDaysMissingDiagnostic 補 anchor_node_ids
¶
-
node_ids子集(僅is_owner_anchor=True),transient 診斷不入 persist;devil E2 核實三條抵達路徑完整涵蓋
3. D9:多筆長檔期 EventNode 擇日避讓¶
-
_select_event_day優先序 3 兜底改「使用次數最少優先、同次數取最早」貪婪計數(day_selection_counts由run_stage_b維護、EventNode 迴圈改 node_id 字典序保 determinism);優先序 1/2 語義不變;docstring 補系統性前傾/分散揭露
4. devil 挑戰修復輪(報告 docs/research/devil-advocate/2026-07-13_serializer-d5-d9-challenge.md,無致命項)¶
-
E1(成立顯著,C-7 相關):
trip_io.save()走裸Trip.model_validate不經 loader 遷移鏈,過期座標會被反覆持久化 → 採 defense-in-depth 雙防線:serialize 端補防禦性過期檢查;過期判準單源化為common.is_geo_expired共用純函式(GeoRef.is_lat_lng_expired/loader/serializer 三處委派同一函式,消除漂移;原is_lat_lng_expired全專案零呼叫) - E3(成立顯著):D9 初版計數只在優先序 3 維護,優先序 2(地理相容)選日不遞增 → 混合優先序仍疊同一天;修復=優先序 2 選定後同樣遞增計數(自身語義不變)
- E2/E4 通過挑戰(無需動作)
5. D4 打包業主(不實作)¶
- 新增
docs/owner-tracking/2026-07-13_owner-decision-package-anchor-overreach-fairness.md:D4(anchor 超距 fallback 是否套 C2 輪流)與既有 §4.5-a 超距語義合併三選一詢問(維持現狀/硬塞+分散/明確排除),AI 團隊建議傾向 (b) -
tree/delayed/s-1子問題 (b) 選項表拆 A1/A2+D4 註記;00-index 修訂歷史一行;不開新 tree 節點(lesson 12:既有延後項下位選項細化)
6. 規格收口(system-architect)¶
-
architecture.md新增「devil E1/E3 挑戰修復追記(2026-07-13 第二輪)」:E1 雙防線裁定(含被否決替代方案「單防線+docstring 假設」與否決理由)、D5/E2、D9+E3、E4 不成立記錄;成熟度不變 - 修正兩份 test-plan 共四段 qa 追記的 provenance 句(原誤稱「architect 代為落檔」,如實改為「qa-engineer 產出並落檔;architect 事後審核定稿」)
7. qa 兩輪簽核(附機械證據)¶
- 第一輪:對照 test-plan(DM-S1 既有兩測試語義隨修復翻轉核實)+補 4 條真 round-trip(save→檔案→load 全鏈,含恰 30/31 天邊界)+1 條 D9 第二輪平手;343 綠
- 複核輪:揪出前輪 4 條 round-trip 因 save/load 共用凍結時刻對 E1 全盲,核實新測試「直接 save() 後逕讀磁碟 JSON」真正關閉空隙;補共用判準兩端一致性 6 條;352 綠
驗收標準¶
-
python -m pytest tests/ -q→ exit 0,352 passed(基線 331 → 343 → 352,主協調者三度獨立重跑複現) - devil E1 場景:45 天前 geo_cached_at 的 Trip 直接 save()(不經 load)→ 磁碟 JSON lat/lng 為 None
- devil E3 場景:有 geo+缺 geo 混合事件候選集重疊 → 不疊同一天
- 恰 30 天(保留)/恰 31 天(清除)邊界,loader/serializer 兩端同判準
- 全程 零升 、無新 ADR、無新 constraint;D4 待業主三選一決策
待業主¶
-
docs/owner-tracking/2026-07-13_owner-decision-package-anchor-overreach-fairness.mdD-1 三選一(不急,可與其他事項一併回覆)
沒有任何資料可供顯示
動作