專案

一般

配置概況

動作

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 測試綠)

是由 Sashiba Chou20 天 前加入.

狀態:
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:DestinationOwnedDaysMissingDiagnosticanchor_node_ids

  • node_ids 子集(僅 is_owner_anchor=True),transient 診斷不入 persist;devil E2 核實三條抵達路徑完整涵蓋

3. D9:多筆長檔期 EventNode 擇日避讓

  • _select_event_day 優先序 3 兜底改「使用次數最少優先、同次數取最早」貪婪計數(day_selection_countsrun_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.md D-1 三選一(不急,可與其他事項一併回覆)

沒有任何資料可供顯示

動作

匯出至 PDF Atom