專案

一般

配置概況

動作

Feature #444

進行中
SC

ADR-017 live smoke:延遲允餘填值誠實退回,核出 D-main 無閘等待破口(C1/C1-b)並升 P1

Feature #444: ADR-017 live smoke:延遲允餘填值誠實退回,核出 D-main 無閘等待破口(C1/C1-b)並升 P1

是由 Sashiba Chou 於 約 2 個月 前加入.

狀態:
New
優先權:
Normal
被分派者:
-
開始日期:
2026-08-11
完成日期:
完成比例:

0%

預估工時:

概述

ADR-017 live smoke 批:延遲允餘填值誠實退回,核出 D-main 無閘等待破口(C1/C1-b)並升 P1

背景

上一批(#443)完成 ADR-017 分帳機制落碼,但明載「機制已落碼 ≠ (B) 已生效」——(B)「首次規劃就抓齊班次」受兩道獨立的閘封住:

  1. 閘一=延遲允餘未校準:TDX_REQUEST_LATENCY_ALLOWANCE_S = 0.0 是誠實佔位。裁定 (3d) 已證公式睡眠項恰等於跨窗所需,故 adapter 內任何非零耗時(含 OIDC token)都會擋下最後一次跨窗等待。解除前提=live smoke 冷路徑實測。
  2. 閘二=呈現守門未開:transit_wait_presentation_capable=False 使生產路徑額度強制歸零。解除前提=TW-6 呈現層真的存在(ARCH-5 前不可解)。

本批目標=執行 live smoke 解除閘一,並補上 qa 射程限制 5 揭露的「真實 adapter ↔ orchestration 接縫從未被驗」。

結論先講:閘一沒有解除,且不該解除。 填值前公式本身被挑出推導破口,追查過程又挖出一個更嚴重的既有缺陷。

變更內容

1. ADR-017 第五則(施工前裁定,預先承諾機制)

在 live smoke 任何數字存在之前,把「什麼算合格量測」與「樣本→常量的換算」寫死,防「先看數字再挑一個剛好讓 (B) 生效的規則」:

  • M-1~M-9 量測協定:量測窗須與記帳窗同構;冷路徑四層定義;五類齊全且缺最大 payload 類即退回;樣本量三級處置(合格/保守/不准填);逾時觸頂整輪作廢不得剔單點;環境繫結。
  • X-1~X-7 換算算式:A = ceil((max(L_data) + max(L_token)/4) × 10)/10,填值批自由度為零。取最大值而非平均/中位數/百分位皆有演繹理由(閘的代數要求的是總和,中位數對總和無約束力;n<20 時任何高百分位在數值上就等於最大值,寫成 p95 只是假精確)。不加任何乘性安全係數。
  • RL-1~RL-5 反向紅線:禁止「因為某值能讓 (B) 生效所以選它」;規則修訂與填值不得同批;禁止離群值剔除、禁止挑輪次挑資料集;算出的值不夠用時正解是誠實記錄,不是回頭改規則。
  • G-1~G-5 閘二義務、S-1~S-8 接縫驗收(任一不一致即阻擋級)、T-1~T-4 R3-3 觸發門檻(新增可機械檢查的 T-3:呈示粒度改變即須呈題,有效門檻 A > 1.3636s)、Q-a~Q-c qa 錨點新形狀(:930 的 == 0.0 是把當下常量值當不變式鎖,值面職責回文件層、行為職責升級為雙向參數化錨)。
  • 預先承諾經機械證實:裁定最後寫檔 19:43:01、smoke 第一筆原始資料 19:45:07、腳本 19:43:47——收筆時任何實測值尚不存在,時序可稽核。

2. 連帶更正:已知弱點 13「零觀測」不成立

experiments/tdx-quota-livetest/raw_output/ 自 2026-08-03 起即有 24 筆 elapsed_sec(含 TCP/TLS 握手、不經本專案快取),只是 RESULTS.md 通篇未報告。正確措辭=「從未被分析、從未落為結論」。

  • architect 自陳為同一角色上一批的核實不完整(只查到 RESULTS.md 層、未下到 raw_output/ 層),與第四則「讀了一半的同一份決策」同族=在正確的檔案裡停在錯誤的深度。
  • 裁定該歷史集地位=佐證集,不得單獨作為填值來源,但必須併入 max()(防「挑小的」);若全數不合格須逐條記錄理由。
  • 衍生已知弱點 19 與 ARCH-4-followup-experiment-unanalysed-metrics(P2):RESULTS.md 層與 raw_output/ 層之間有一道無人負責的落差,兩則裁定已各踩一次。

3. live smoke 實測(experiments/tdx-latency-live-smoke/,TDX-only、零 Google)

  • 零 Google 機械強制:urllib 白名單,非 TDX 網域直接 raise 中止整個 run(非只記 log);Phase B 全程 fixture POI/parking + destination 帶座標 + channels=[],零地理編碼。
  • Phase A:3 輪 M-1 合格樣本。首輪執行後執行者自行抓出量測窗停在標頭的 bug(大 payload 被低估到不足一半),作廢前三輪、補測至合格。首次真實觀測最大 payload 類(TRA 全網整日 3.69MB,落在舊【低信心】外推區間內)。不合格輪次全數保留(RL-4)。
  • Phase B 接縫觀測:真實 TdxTransitAdapter 接進 build_trip_with_itinerary(),五項全部有結論。實質發現:兩層錨點所用的超報測試替身以線性固定增量模擬消費成長,真實成長卻是離散、由少數大 payload 請求主導——用替身推算「幾次呼叫會觸發跨窗睡眠」會系統性低估。這是已知弱點 4 那條接縫上第一次被真的看到的差異。
  • B-3:transit_wait_budget_s 與 min(300, sleep_term + n_calls × A) 三變體逐位元吻合 ⇒ 公式在真實 orchestration 路徑接線正確(S-3 達成)。但真實呼叫數恆為 4(SM-16 短路使 THSR 整支未查),遠低於限速門檻 ⇒ 任何 A 值在此場景不影響任何真實行為。
  • M-5 判定:合格樣本已達門檻,但本批不填值(公式修訂中)。用量:資料 43/token 14,執行者主動保留餘裕停手。src/、tests/ 淨變更為零,1594 測試綠(與批前基準逐字一致)。

4. devil C1(阻擋級)+ architect C1-b(自評更嚴重)

  • C1:D-main 舊式 get_transit_segment() 與 D-pre 共用同一個 _TdxRateLimiter,其呼叫佔用共用視窗的時間戳位置卻不在 n_calls = 2+2×D_transit 內 ⇒ sleep_term 在算式層低估跨窗次數。architect 逐項代回後發現破口比 devil 所述多一個被相減項(請求面 R <= n_calls × A 本身也不成立)。
  • 裁定不把 E 加進公式:E 取決於 D-pre 涵蓋結果,而額度必須在迴圈之前算定,該時點 E 結構上不可知,加進去=杜撰且毀掉 TW-6 賴以存在的「事前可算」性質。改為限縮聲稱(X-2 加雙重限定:值域內 且 E = 0,兩者皆事後才可確認)+新增 S-9 觀測 E+followup 升級。
  • C1-b(本批最重要發現):第三則「總量上界 465s 逐字仍然成立」不成立。D-main 舊路徑 budget=None 使三道閘全部短路,單次至多睡 180s(60 限速+60 之 429 退避+60 重試前限速),總量 180s × E 不受工作帳/等待帳/硬上限任何一者約束。
  • 放大耦合:day_scheduling.py:549 的 schedule_cache 僅在 D-pre 實際執行後才填,而 stage_d.py:861 分支含 or not schedule_cache ⇒ D-pre 被工作預算擋下時,該日每個 TRANSIT leg 都落入無閘路徑。即:「工作預算耗盡」這件事本身,會把控制流路由到一條完全不受預算約束的等待路徑上——與 ADR-012「不再開始」語義方向相反。
  • 既有缺陷之揭露、非本批引入;被更正的是我方對它的描述(把有前提的界寫成無條件的界),非行為變更。
  • 新增第四項上線前置條件(二擇一:(a) followup 收口 或 (b) 業主知情接受),並觸發 R3-2 業主決策複核(走「依賴技術前提的決策」路徑,非 R3-3)。
  • RL-2 不擋本次修訂:architect 獨立確認三要素齊備(修訂在填值前/理由與 (B) 是否生效無關且使聲稱變弱/提出者看不到數字),並加寫防先例濫用條款。

5. ADR-017 第七則:三態分級與優先序翻轉

  • 新增**「結構性不可觀測」第三態**(不一致=阻擋級/未觀測=阻擋「已驗」聲稱/結構性不可觀測=不阻擋填值但須逐字記載)。歸入第三態須滿足三條前提,否則退回「未觀測」(防「不好測」被說成「不可能測」)。 防濫用條款:≠「不會發生」≠「該路徑安全」。S-6 歸入、S-8 不適用(其觸發條件是常態且屬安全相關項,採 default-reject)。
  • 否決另立人工多城鏈式場景批(硬湊場景不代表真實行程、外推價值低);追認執行者主動停手為正確執行,非未完成。
  • 優先序翻轉:受管的 D-pre 有三道閘卻幾乎不需要等,無閘的 D-main 單次至多 180s ⇒ 我們把三道閘蓋在一條很少需要等待的路上,而真正會等的那條路一道閘都沒有。與已知弱點 9 不同(該項談分子=額度配得比需要多,本項談分母=需要量本身可能趨近於零)。ARCH-4-followup-legacy-dmain-transit-budget P2 → P1,第四項前置條件二擇一中明示先修優於先問業主。
  • 因果二分(第七則 (4)):「難以構造出會真的查時刻表的行程」有兩種成因且含意相反——端點缺 place_id 是早退零呼叫(不貢獻 E);端點完整但 D-pre 未涵蓋才貢獻 E。真實使用者的 POI 都有 place_id ⇒ 成因二才是常態 ⇒ 若涵蓋率低則 180s × E 不再是邊角案例。S-9 須分別計數兩種成因。

6. 治理與文件

  • lessons 14/15 落檔(已欠兩批):14=斷言強度與恆真陷阱(寫斷言問成立條件/讀斷言問其他成因,案例=被 min() 夾住兩側的恆真測試、空集合假綠、注入 1 對 1557 測試完全不可見);15=你自己寫的東西不算已知(只讀了自己決策的一半、宣告取代卻沒有取代者、verified 只由實讀翻轉)。README 索引補回原本漏列的 12/13。
  • open-questions:新增 3 條 followup(experiment-unanalysed-metrics/clamp-seam-observation/dpre-coverage-rate,後者註明其結論是 P1 項的分母、升級條件=S-9 觀測到 E > 0)+1 條升 P1 改記三面定性+Q10-followup-j 併記量測協定。
  • tree/adr-017 三則追記(第五/六/七則),verification_status 維持 pending——architect 四次未回複驗,不硬翻(代寫者說「寫好了」不能替代驗證者說「我讀過了」)。
  • devil 完成自身報告的 回填(原文一字不改、不連坐其餘部分)。

驗收標準

  • src//tests/ 淨變更為零,python -m pytest tests/ -q ⇒ 1594 passed(exit 0,與批前基準逐字一致,主協調者獨立重跑)
  • live smoke 零 Google 呼叫(機械強制 + 全數 exit 0);TDX 用量 43 資料/14 token 全量落檔含作廢輪
  • Phase A 3 輪 M-1 合格樣本,主協調者逐筆對 raw log spot-check 通過
  • 預先承諾時序經機械核對(19:43:01 vs 19:45:07)
  • devil C1 四處引用行、architect C1-b 三處承重環節,主協調者獨立實讀核驗全部成立
  • S1 hook 警示(architecture.md 4 行/test-plan 23 行)逐行核為假陽性:前者全為「不新增 」類否定敘述,後者為行尾 CRLF→LF 改寫使整檔被當新增(git diff --numstat 僅 2 insertion)
  • **未升任何 **,全部規格項維持 (接地上限條款)

本批未完成(明列,非省略)

  • TDX_REQUEST_LATENCY_ALLOWANCE_S 維持 0.0,(B) 兩道閘一道都沒開——依 M-5 判準與 C1 修訂,這是規則正常運作的結果
  • S-6 結構性不可觀測(驗證停留離線錨點層);S-8/S-9 未觀測,(B) 上線前必補
  • tree 節點三則追記待 architect 實讀複驗(維持 pending)
  • test-plan 行尾待正規化回 CRLF
  • 人類動作:L4 run_external_review.py;GCP Console 實測用量
  • 日後併批呈業主:R3-2 前提複核(與 T-2 同批,建議先修不先問)

沒有任何資料可供顯示

動作

匯出至 PDF Atom