Feature #405
進行中ARCH-1-3-followup-transit-feasibility 收口批:Stage C 可行性接線+末班車 per-node 化(devil D-C1/D-C2 完整修復,1159 測試綠)
0%
概述
ARCH-1-3-followup-transit-feasibility 收口批:Stage C 可行性接線+末班車 per-node 化——devil D-C1/D-C2 完整修復,SC-10/SC-12 端到端生效、「未接線」警示解除(1159 測試綠)¶
背景¶
上一批(#402 大眾運輸排程批)devil 挑戰揭露兩個阻擋級缺口、architect 裁決「完整修復同一設計不得分做」列本 followup:(a) check_schedule_feasibility() 全庫零呼叫點——Stage C 排序時不查班次可行性,SC-10/SC-12 端到端不生效、"no_transit_service" 零賦值(排了搭不到車的位置);(b) latest_return_departure_minute 為 Day 級標量 min() 聚合,一個最終未被排入的邊緣候選節點(末班車 17:00)即可讓全天晚間蒸發 5~6 小時(9:1 放大效應,與 §C2「交通高估=誤殺不可接受」衝突)。業主拍板本批優先執行。流程:architect 施工前介面確認 → 工程實作 → qa 錨點測試 → devil 挑戰 → architect 裁決收口。
施工前介面確認(system-architect,F-1~F-6+SC-13/SC-14,無新 ADR)¶
-
F-1:標量欄位移除替換(不留 deprecated 雙軌)改
latest_return_departure_by_node: Mapping[str, int];缺鍵=不受約束(與hard_windows同構);保守繼承責任在呼叫端(有自身 reverse anchor 填自身、無則填已知值 min()、全空則空 dict)——對現況為單調放鬆,不存在更早誤殺路徑。 -
F-2 簽章白名單:本輪
DaySchedulingRequest僅允許兩項變動(per-node mapping+transit_node_ids: frozenset[str],值來源恆compute_transit_subset()禁第二套投影);白名單外任何簽章變動視同「第三次修改」須停工開 ADR——封死逐次豁免逃逸口。 -
F-3:
LastTrainAggregationDiagnostic不退場、觸發條件窄化(僅末位節點套用繼承值時發);compressed_minutes重定義為實際壓縮量。 - F-4:SC-10/SC-12 警示解除權在 architect、五條機械證據缺一不可。
-
SC-13 貪婪迴圈查詢契約 (a)~(h):查整條候選序列合格相鄰對(兩端皆屬 transit 子集)、
at_minute與stage_d._fetch_transit_segments逐字同式、三態效果表、reason優先序(新增"transit_schedule_unavailable"列舉值)、miss 診斷去重+確定性排序、or-opt 同組判定、幾何代理落差誠實揭露。 -
SC-14 per-node 終端約束:末位旅遊節點
end_minute <= 自身值;day_end不得再被 min() 壓低;l1 已扣緩衝禁雙扣。
工程落地(8 檔,白名單合規自查×2 通過)¶
-
stage_c.py(主體 +400 餘行):_TransitFeasibilityContext/_evaluate_sequence_transit_feasibility(SC-13 三態+SC-14 終端判定核心)/_transit_query_at_minute(同式緩衝)/_dedupe_miss_diagnostics;貪婪插入(含餐廳兩趟)與 or-opt 兩條路徑皆接線;_unschedulable_reason()三值優先序;純自駕日 ctx=None 短路零回歸。 -
stage_d_pre.py:StageDPreResult.transit_subset銜接(單一投影來源)。 -
day_scheduling.py:呼叫端 per-node 填值(F-1 規則)+ F-3 診斷窄化改寫。 -
stage_d.py/transport_mode_projection.py:docstring 同步(SC-13(h) 最後防線說明)。
qa 簽核(通過,附機械證據)¶
§9 錨點表 12 條全數覆蓋(9 條補寫、3 條核實工程師改寫)+加測 SC-14-E 緩衝不雙扣、SC-14-F 自駕零回歸:SC-10/SC-12 升整合層(以 schedule_day() 為入口)、SC-13-a 混合日不誤判、SC-13-b at_minute 攔截生產路徑實測同式(非謄寫比對)、SC-13-e/f/g、SC-14-A 9:1 場景端到端、SC-14-D「N 放大不再成立」正向反證。另揪出一條接線後碰巧仍過的假陽性舊測試(「診斷恆空」斷言)並改寫防「舊病復發」。誠實限界:or-opt 一致性為結構性論證非 property-based 窮舉;SC-13(h) 落差本批明文不消除。
devil 挑戰 → architect 裁決(無阻擋級,D1/D2 建議級)¶
報告 docs/research/devil-advocate/2026-08-02_transit-feasibility-wiring_challenge.md。「通過挑戰」段逐行核實 D-C1/D-C2 修復兌現(含 F-4 五條件、白名單、day_end 逐字直接賦值)。
-
D1(採納,補 cross-reference):SC-13(a) 混合日保護的輸入形狀,orchestration 目前造不出(
compute_transit_subset唯二可達分支皆全有或全無;真混合子集唯賴 D-C4 已確認無生產路徑的user_specified)——保護邏輯無誤不阻擋,但單元綠燈不構成混合日端到端驗收;D-C4 前置條件擴充:ARCH-6 手動輸入上線同批須補 SC-13(a) 整合層驗收。方法論沉澱:「輸入空間孤兒」偵測(防護有呼叫點但生產路徑造不出它防的輸入)。 -
D2(列 followup,形狀已預裁):純因末班車終端約束排不進的節點 reason 落回通用
no_feasible_slot,使用者會被誤導「行程太滿」而誤刪無辜節點——ARCH-1-3-followup-terminal-reject-diagnosability(新開):第四列舉值"missed_last_return_departure"(F-2 列舉擴充不計簽章、不需 ADR)、否決加欄位、ARCH-5 呈現層上線的強制前置(當前無使用者可見出口故不本批修)。
SC-10/SC-12「Stage C 端未接線」警示解除¶
F-4 五條件經 architect 逐條獨立核實(非採信 qa/devil 宣稱)後解除並記錄依據;SC-12-N-01 BLOCKED 同步解除;test-plan 過時「不得整合層撰寫」限制作廢+誠實揭露其餘 PENDING-IMPL 未逐條複核。
open-questions 連動¶
- 結案:ARCH-1-3-followup-transit-feasibility( 已實作收口)。
- 新增:ARCH-1-3-followup-terminal-reject-diagnosability(P2,ARCH-5 上線前置)。
驗收標準(全數通過)¶
-
python -m pytest tests/ -q→ 1159 passed, exit code 0(基準 1141 → +18;工程後 1142、qa 後 1159,主協調者每階段獨立複跑) -
白名單合規:
DaySchedulingRequest僅裁定允許的兩項簽章變動(工程雙自查+主線 diff 核對+devil 逐欄核實三重確認) - devil 挑戰無阻擋級,D1/D2 經 architect 裁決收口(cross-reference+followup 規格明文承載)
-
零 升級(fixture-backed 誠實停 ;
batch_prefetch_schedules從未對真實班次源執行,ARCH-1 整體維持 ) - 自駕零回歸(純自駕日空 mapping 行為逐位元不變,既有自駕測試全綠)
後續批次入口¶
ARCH-4-followup-transit-live(真實班次源接線,前置=Q10-followup-b TDX 配額單位釐清)/真實景點端到端+校準起步(Google key 已開通)/ARCH-1-3-followup-terminal-reject-diagnosability(併 ARCH-5 呈現批)。
治理備註¶
本批協調層曾因把 Stop hook 約 30 秒喚醒間隔誤讀為長時間停擺而重複派工(三個工程實例短暫並行、一度同檔互寫後收斂,最終產出經三方交叉驗證一致),教訓已記入協調者記憶(判停擺前必先對時計真實分鐘數);最終程式碼由具名工程角色完成、主線獨立驗證,來源聲稱如實記錄於此。
沒有任何資料可供顯示