動作
Feature #349
進行中
SC
ARCH-1 L2 實作起步:Stage A 錨定切日+Fixture Adapters 填實+architect 六項裁定+Q13/OSM-ODbL 研究管線(207 測試綠)
Feature #349:
ARCH-1 L2 實作起步:Stage A 錨定切日+Fixture Adapters 填實+architect 六項裁定+Q13/OSM-ODbL 研究管線(207 測試綠)
狀態:
New
優先權:
Normal
被分派者:
-
開始日期:
2026-07-11
完成日期:
完成比例:
0%
預估工時:
概述
ARCH-1 L2 實作起步:Stage A 錨定切日+Fixture Adapters 填實+architect 六項裁定+Q13/OSM-ODbL 研究管線¶
背景¶
ADR-007(#273)完成 L0/L1 schema 層後,本批啟動 L2 編排引擎實作第一棒:Stage A(錨定切日)+三個 Fixture Adapter 填實(Stage C/D/E 解鎖前提)。同批平行消化兩題 P1 研究(Q13 掛單逾月、OSM ODbL 與停車 fallback 實質相關),並經 qa 簽核+devil-advocate 挑戰暴露 1 個致命 bug 與 6 項規格疑慮,全數在批內收口。
變更內容¶
1. Stage A 錨定切日實作(新增 src/travel_helper_core/scheduler/)¶
-
stage_a.py:純函式run_stage_a(destinations, start_date, end_date, car_rentals)→list[Day]——I-15/I-16/I-17 序列驗證、is_transit_day 三類邊界、80km 地理連續性軟警告(O-NEW-2)、unsupported_transit_span_error拒絕路徑(O-NEW-3)、暫定值全走 planning_config 單一來源。 -
geo_utils.py:haversine 共用純函式(供 Stage D 複用)。 -
devil-advocate 挑戰修復(先紅後綠):C1 致命——同日轉場疊加單日 Destination 時前者被靜默丟棄零警告(違反不靜默原則),修為顯式拋錯;C4——租車日期落在 trip 範圍外未攔截,補完整涵蓋驗證。挑戰報告:
docs/research/devil-advocate/2026-07-11_stage-a-implementation-challenge.md。
2. Fixture Adapters 填實(adapters/)¶
- 三個 stub(Transit/Parking/Places)改為讀 fixture 資料的真實實作(
fixture_data.py新增),降級路徑完整:Transit Tier 1/2/3(fallback_note 必填、禁 LLM 推算)、Parking 五態 not_found_reason+P-step 過濾排序+OSM fallback 三路徑、Places 未登錄不虛構 V-hard 值。 - OSM attribution 一律
© OpenStreetMap contributors(過渡保守,語義定案待另批)。
3. system-architect 六項規格裁定(A–F,無新 ADR、無任何 升級)¶
| 項 | 裁定 | 落地 |
|---|---|---|
| A | attraction/restaurant 缺 name=真缺口 |
data-model §6/§6.n+nodes.py/serializer 連動 |
| B | parking_batch_id 呼叫端契約正確 | architecture ARCH-1-4 C7 明文化 |
| C | config 單值 500m 陳舊缺陷、spec 權威 | planning_config 改兩常量 600/300(【低信心】待校準) |
| D | 兩錯誤類型分界升格 spec (A-8-b,含 devil C2 訊息誠實化、C3 geo 檢查三態化 A-6-b、I-17 明文 A-1-b) | architecture ARCH-1-8;校準項併入 Q10-followup-j (15) |
| E | A18-GEO-N-01/B-01 於 Stage A 結構上不可觸發 | test-plan-ARCH-1-8 改歸整合層 |
| F | Parking 缺 license 承載欄位(test-plan 與 data-model 同日落地互矛盾) | data-model §6.y+parking.py 補 license;執行機制經二次確認=驗收層 property 非建構期硬 validator(§6.y 已明文) |
4. C-7 合規缺口修復(qa/工程自查發現)¶
serializer 的 V-hard 剔除靠 node_type gate,巢狀 Parking 子物件完全繞過——Parking.name 與 Parking.geo.address(places 來源)被原樣持久化,違反 C-7。修為雙路徑剔除+更正誤導性註解+7 條 round-trip 測試。
5. 研究管線兩題(primary→verifier→synthesizer 全管線,結論均 )¶
-
Q13(Booking
nbResultsTotal語義):欄位存在於前端私有 GraphQL、無官方文件;約 1000 筆翻頁硬上限三源交叉確認(直接驗證 devil 對 ADR-004 決策 3 的疑慮);語義=「符合條件筆數(含可能售罄與贊助項)」非灌水值;殘餘缺口(是否 >1000、計數口徑)研究層已窮盡、轉 data-integration 實測。verifier 9/9 逐字對源 GROUNDED、判定採信。 -
OSM ODbL 定性(ARCH-1-4-followup):行程報告=Produced Work;親友分享觸發 attribution(與 Q16 CC BY-SA 先例方向相反);ShareAlike 明文不適用;
trigger=on_use正當性升為雙重獨立依據(verifier 補 Substantial Guideline)。verifier 9/9 GROUNDED、判定採信。 - 兩題結論
spot_checked_by_coordinator已回填(協調者實抓來源逐字比對通過);human_checkpoint均 pending——依接地上限條款,結論落 specs 的語義升級(如 ODbL trigger 定案)留待人類抽查通過後另批,本批 specs 變更全部與此防火牆隔離。
6. 治理連動¶
- tree/adr/adr-007
verification_status→ verified(architect 驗證依賴抽取無誤);tree/research 兩節點新增;00-index NEW 行。 - open-questions.md:Q10-followup-j 追加第 (15) 項校準(Gap 分界軸)。
驗收標準¶
-
python -m pytest tests/ -q→ 207 passed(主協調者於每階段獨立重跑:148→172→177→182→190→200→207 全程可追溯)。 - devil C1 場景(兩鏈/三鏈單日 Destination 同日轉場)有對應負向測試且拋顯式錯誤,對照組(不同天)不誤傷。
-
docs/specs/本批所有變更無任何 升級(S1 hook 的 confirmed-line warn 經逐檔位元組級 grep 核實為散文誤判——「不升 」等否定句)。 - 巢狀 Parking round-trip:places 來源 name/address 序列化剔除、license 欄位不受牽連。
- 兩份研究結論 frontmatter:
spot_checked_by_coordinator有日期與通過紀錄、human_checkpoint: pending(誠實標記,未偽造)。
備註¶
- 待人類行動(不阻擋本批 commit):(1) 抽查清單 A/B(各 2 條 Ctrl+F 逐字比對)——通過後 ODbL trigger 語義定案與 Q13 對 ADR-004 的 offset 硬防護子規格才落 specs;(2) L4 外部複查兩份 verification;(3) 跨 AI 稽核蓋章(積欠 25+ commits);(4) Tiqets Distributor API key 申請確認(Q17 命中率實測前提)。
- Q13-followup 實測項(nbResultsTotal >1000、計數口徑)待 PM 下批排入 open-questions。
沒有任何資料可供顯示
動作