動作
Feature #446
進行中
SC
ADR-018 全鏈落地:D-main 舊式 transit 路徑納入等待帳與工作帳(設計→devil→實作→qa 錨點,1635 綠)
Feature #446:
ADR-018 全鏈落地:D-main 舊式 transit 路徑納入等待帳與工作帳(設計→devil→實作→qa 錨點,1635 綠)
狀態:
New
優先權:
Normal
被分派者:
-
開始日期:
2026-08-12
完成日期:
完成比例:
0%
預估工時:
概述
ADR-018 全鏈落地:D-main 舊式 transit 路徑納入等待帳與工作帳¶
背景¶
ADR-017 第六則 C1-b 核出:D-main 舊式備援路徑(stage_d.py:861 分支 → get_transit_segment())無任何預算參數,三道閘全部短路——單次呼叫至多無閘睡 180s、總量 180s × E 不受任何上限約束,且 D-pre 被工作預算擋下時該日全部 TRANSIT leg 都落入此路徑(放大耦合,與「不再開始」語義方向相反)。這使「B-base+B-wait 總上界 465s」只在 E = 0 時成立,構成 (B)「首次規劃就抓齊」的第四項上線前置條件(二擇一:(a) 先修 或 (b) 業主知情接受;第七則已明示 (a) 優於 (b))。本批即 (a) 的設計輪+實作輪+qa 錨點輪,開場基準 commit 6eaa7e3(#445,1607 測試綠)。
變更內容¶
1 ADR-018 設計(system-architect,新 ADR、10 裁定)¶
-
納管形狀:
get_transit_segment()/batch_prefetch()各新增 keyword-onlybudget_s/wait_budget_s(語義逐字沿 SC-6a/SC-6d,零新常量、零新帳本、零新預算層);adapter 內建構既有 call-scoped 預算物件下傳 ⇒ 三道閘自動生效。 - 關鍵翻案:「ADR-012 決策 2 已把 D-main 劃在閘外」的劃分不存在——決策 2 三層檢查點表從未提及 D-main,其 2026-08-03 C1 裁決反而明文擴大涵蓋為「每一個 HTTP 請求」;涵蓋範圍空白被後續文件追述成刻意排除(主協調者獨立複驗一致)。故本 ADR 屬補齊、非推翻。
-
delta 補償:
budget_s換算含當日已發生等待補償(否則等待記回工作帳=ADR-017 決策 2 修掉的原始缺陷復活);與 D-pre 既有換算點共用同一函式(單一真相來源、D-pre 逐位元零回歸)。傳遞形狀=TransitLegBudgetfrozen dataclass 的 provider、每次舊式呼叫前即時求值(否決同型別二元組——順序寫反為型別靜默)。 -
放大耦合關閉且不新增分支:D-pre 被擋之日
budget_s <= 0⇒ 舊式呼叫於_data_get既有入口即拒發。 -
三面分工:總量面本批修;消費面(排擠→對稱共享)與額度計算面(
sleep_term低估,E 不可知)明文不修並記錄後果轉化。 - 連帶核出兩項相鄰缺陷(舊式路徑無 negative caching、hint 檢查前先抓站點清單),明文不修列 followup。
- 三項行為變更明文聲明(非零回歸批):閘二關著時舊式路徑恆不睡/工作帳耗盡不再開始/socket timeout 收緊式。
2 devil-advocate 挑戰+architect 裁決¶
-
發現 1(B,部分成立):裁定 4 宣稱過寬——姊妹情境(D-pre 中途被 L0-c-3 擋停後 delta 全額退還)代數成立但為設計正確(B2 帳本切分線明文要求);architect 補閘二限定(
W=0 ⇒ delta≡0,現行生產配置結構上不發生)與封閉形式(delta=Day 迴圈 effective deadline 的連續化,465s 聚合上界不受影響);三個可實作形狀評估表落檔,不加額外收斂。 -
發現 2(N,成立必修):
batch_prefetch()逐一呼叫公開方法使工作帳每呼叫重置(總上界 ≈ N×min(timeout_s, budget_s))→ 改函式體內單一 call-scoped 預算物件+私有輔助委派;否決延後(「看起來已納管實則可 N 倍放大」比不加更危險)。 -
發現 3(不成立,反向強化):並連帶禁止
resolved_stations加入舊式簽章(未呈現步行段之路徑餵最近站解析=複活 SC-15/SC-16 禁止形狀)。 - ADR-018 七處就地 (含機械可驗差異 #4 否證標的自我更正、#5 計數三→二);新增弱點 10/11/12、qa 錨點 11/12/13(8 廢止改寫為 13)。
3 實作(data-integration-engineer,4 src 檔 +260/−13)¶
-
protocols.py/tdx_transit_adapter.py(_resolve_transit_segment私有輔助)/stage_d.py(TransitLegBudget+provider)/day_scheduling.py(共用換算函式+provider 建構)。 - 機械可驗差異 #1 自證:
_data_get/acquire()/_effective_request_timeout零行變動(主線 git diff hunk 位置覆核)。 - 附帶修正:ADR-017 錨點替身 getter 副作用違反 SC-6c 唯讀契約,改純函式+
_advance_reads_after_each_day()。
4 qa 錨點批(qa-engineer,新檔 28 測試)¶
- 錨點 1
7、913 逐項 PASS(28/28,逐 nodeid 獨立執行非聚合);錨點 11 類名與 docstring 逐字標明「設計正確非缺陷」;錨點 4 逐字範圍限定。 -
十項缺陷注入紅綠驗證:26 條須紅全紅、15 條須綠全綠、13 個突變窗口 sha256 零殘留;首輪自抓兩條假錨點(clamp 前提未觸發、
run_stage_d預設路徑未覆蓋)修正並記成因。 - ADR-017 替身純化覆核:三次生產缺陷注入(J1~J3)全數轉紅,未弱化。
-
1607 → 1635 全綠(python -m pytest -q,exit 0;主協調者兩度獨立重跑覆核一致)。
5 連動與治理¶
- SC-6e 新增(含 devil 裁決更正)、SC-6d ;architecture.md TW-16(11 點)+TW-16-b(10 點);ADR-012 兩處補註+ADR-017 四處 。
- test-plan 射程限制 5 補記 S-9/S-10(懸置兩批收口;Edit 錨定插入,
git diff --numstat=2 0,行尾零正規化)。 - open-questions 四項:
legacy-dmain-transit-budget狀態欄 P2→P1 同步+設計已產出標記;dpre-coverage-rate理由改寫;新增legacy-path-negative-caching(P2,升級條件=S-10-d 單日同 key ≥3 次)與legacy-budget-refund-asymmetry(P2,升級條件=閘二翻 True 即轉 P1 且同批量化)。 - tree/adr-018 節點經 architect 二輪複驗 verified(首輪退 3 必修 2 建議:追記段未清掃舊段——已全修並記入方法論教訓);00-index NEW 兩行。
- owner-tracking 留 architect 修正請求歷史檔(已標 收口,含落地時序誠實留痕)。
驗收標準¶
- ADR-018 落檔、經 devil 挑戰與 architect 裁決、tree 節點 verified
- 實作三閘處零行變動自證;全套件 1635 綠(兩度獨立重跑)
- qa 錨點 28 測試、十項注入紅綠驗證、sha256 零殘留
- 全部規格項維持 、未升任何 、不觸 constraint、閘二未開、零 live 呼叫
- INV-TW-4/INV-LD-4 負向鎖:機械掃描兩錨點檔零違規
誠實邊界¶
- 第四項上線前置條件仍未完成:本批=「設計已產出+實作+離線錨點」,收口以 S-10 接縫觀測為準(qa 明文本批全綠不得替代 S-10;端到端 fixture 行程結構上組不出 legacy leg)。
- 本批不使班次資料變多——把無界未授權等待換成受控等待或誠實 miss;(B) 整體仍未對使用者生效(TW-6 呈現層前置)。
- 465s 總上界在 S-10 完成前仍須沿
E = 0限縮措辭陳述。
遺留(非阻擋)¶
-
_RunawayAdapter替身未隨純化遷移(不影響正確性與紅綠能力,日後順手)。 - R3-2 業主複核內容更新與 T-2 同批打包(交 project-manager,日後呈題)。
- S-9/S-10 接縫觀測併 (B) 上線前補齊批。
沒有任何資料可供顯示
動作