專案

一般

配置概況

動作

Feature #374

進行中
SC

ARCH-2-followup-g DOM fallback 端到端驗證+生產封鎖偵測修復+ADR-008 destination 比對正式化整合批(604 測試綠)

Feature #374: ARCH-2-followup-g DOM fallback 端到端驗證+生產封鎖偵測修復+ADR-008 destination 比對正式化整合批(604 測試綠)

是由 Sashiba Chou19 天 前加入.

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

0%

預估工時:

概述

ARCH-2-followup-g DOM fallback 端到端驗證 + ADR-008 destination 比對正式化整合批

背景

業主拍板本批「兩個都做」:(1) 補完 followup-a 發現的採集漏洞——GraphQL 攔截失敗時的 DOM fallback 路徑從未端到端驗證,萬一壞了飯店資料會靜默漏收;(2) 把採集接上行程規劃——ARCH-2-followup-c(B 管道 destination 裸字串比對,貼入/查詢不逐字一致即靜默回空)與 followup-b(is_within_reasonable_distance 同名城市消歧孤兒函式待接線)為 ARCH-1↔ARCH-2 整合前必解。

第一批:followup-g DOM fallback 端到端驗證(engineering-fieldtest)

  • 實測前先揪出生產真實 bugbooking_scraper_adapter.py 全模組原本完全沒有封鎖偵測(detect_block() 只存在於 q13 實驗工具、生產路徑從未呼叫)——真實封鎖與前端變異共用同一處理路徑無法分流,違反 C-4「遇封鎖立即停止」。修復:新增 BookingBlockedError + detect_block(),接上 search_accommodations()(搜尋頁入口 + GraphQL 失敗回退前)與 _navigate_detail_page() 檢查點,補 13 個測試。
  • (a) 已驗證:fallback 確實接手非靜默回空——Osaka page.route() abort FullSearch 故障注入後回 26 筆、data_source="booking_com_dom" 正確標記。
  • (b) 品質實測:座標覆蓋 0%(已知退化)、評分/detail_url 100%(優於假設)、去重鍵退化 name+address;新發現 fallback 實際筆數受限約一頁份 25-26 筆(遠低於 target_count=100,兩獨立觀測互證),docstring 誠實揭露未擅修 → 衍生 followup-i。
  • (c) 已驗證:封鎖/變異分流穩健雙向——故障注入未被誤判封鎖;本地 403/CAPTCHA 模擬(route.fulfill,零真實請求)正確拋 BookingBlockedError
  • (d) Taipei 復測:攔截失敗同日再現(n=2,非偶發單點),fallback 接手回 25 筆。
  • C-4 紀律:單線程 ≥5s 節流(含 followup-a 揭露漏掉的 search→capture 段)、live ≤3 目的地、封鎖一律本地模擬。
  • 產物:experiments/arch2-followup-g/(RESULTS.md + run_followup_g.py + raw_output + log);不驅動任何 升級。

第二批:ADR-008 落地 + 整合批實作 6 項

ADR-008(system-architect):以 Trip 的 Destination(已持有 place_id/lat/lng,零新增 schema 欄位)為地理身分錨——

  1. canonicalize_destination_string:NFKC + casefold + 空白收斂,刻意不剝除國家修飾語(防 Venice-IT≡Venice-FL 誤合併)
  2. ManualAccommodationAdapter 雙索引:正規化字串(無 key 亦運作)+ place_id 強錨(跨語言「大阪」查得「Osaka」)、召回聯集 dedup by node_id、查無時 WARN 列出已貼入標籤(E2-a 靜默漏收正式修復)
  3. enrich_candidates 介面擴充:四處同步加 keyword-only destination_ref: GeoRef | None = None(向後相容)
  4. 合理性校驗接線:四態降級——超距→接受+打 must_reconfirm 旗標+WARN,不刪不覆寫(沿 ADR-004 決策 1);disclaimer 附加不覆蓋
  5. DEFAULT_REASONABLE_DISTANCE_KM 遷入 planning_config 單一來源(50.0【低信心】待校準)
  6. 新整合層 accommodation_integration.py:Destination→GeoRef 映射+注入便利函式(端到端 Venice 案例實測)

devil-advocate 9 項挑戰 + architect 裁決修復

  • F1/F8(採納):place_id 純疊加→疊加+矛盾交叉標記(節點記錄 place_id 與查詢解析不一致→must_reconfirm 旗標+WARN 不刪除);ADR 措辭更正(無 key 模式不得籠統宣稱「不誤合併」,誠實邊界=同字串異意圖解析同 place_id 仍不可偵測)
  • F6(機械證實後採 (b) 精確版):qa 負例測試證實 detect_block() 對良性 reCAPTCHA widget(recaptcha/api.js)誤判為封鎖——泛用 captcha 訊號改前導詞界 \bcaptcha 正則(recaptcha 不再誤中、px-captcha/散文裸詞仍命中),xfail 轉正式斷言;殘餘限制(散文裸詞誤判、content[:5000] 截斷)docstring 註記列監控
  • F4/F5(採納):距離門檻升級為「目的地尺度相依函式」結構重評(非純數值校準),已註記 open-questions 防下批誤解
  • F7(採納):C 管道 destination_ref no-op 對稱揭露(docstring + debug log)
  • F9(採納):B 管道 Geocoding 同步延遲併入 followup-h 端到端預算評估
  • F2/F3:已知弱點措辭精修,不改碼

驗收標準(全數通過)

  • python -m pytest tests/ -q604 passed, exit code 0(基準 536 → 604,+68 測試,無迴歸;主協調者於每階段獨立複跑驗證:549/583/588/600+1xfail/604)
  • fallback 端到端非靜默回空機械證據(RESULTS.md + raw JSON)
  • 封鎖/變異分流雙向驗證(含誤判修復後負例轉正)
  • qa 簽核有條件通過(補 5 邊界測試:Unicode 組合附加符 collision、雙索引聯集、GeoRef 缺單邊×2+整合層路徑;誠實限界清單完整)
  • devil 9 項挑戰全數裁決收口,無撤回級項目
  • 治理紀律:engineering-fieldtest 不驅動任何 升級;ADR-008 兩裁定 封頂;寫入權矩陣無違規

遺留(已入 open-questions,不阻擋)

  • followup-h(P2):capture 偵測失敗耗時 8m44s 極端案例 vs ADR-002 同步預算+B 管道 Geocoding 延遲(F9 擴充)
  • followup-i(P3):DOM fallback 筆數受限 25-26 筆 vs target_count=100 落差
  • followup-j(P3):封鎖偵測覆蓋延伸(分頁中途無偵測、503/延遲變體)
  • adr-008 tree 節點 verification_status: pending 待 system-architect 下次啟動驗證

沒有任何資料可供顯示

動作

匯出至 PDF Atom