You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
architecture(C): define capability failure, fallback and runtime degradation contracts #537
沒有擴充時,AsyncDispatcher.get_tracker() 拋 TypeError: Any cannot be instantiated
C1 facade stub
沒有擴充但有 CUDA 時,GPUByteTracker.update() 對 3 個和 0 個 detection 都回 [],is_cuda=False,和合法空幀無法區分。沒有 CUDA 時,update() 在進到 stub 之前就拋 RuntimeError: No CUDA GPUs are available
unit 不存在被報成 inactive:systemctl --user is-active 對不存在的 unit 也回 inactive(本機 rc 4、LoadState=not-found),報告印 inactive/failed。setup_services 安裝的是 system units,ctl/health 查的卻是 --user(ledger 部署段已記);systemctl 不存在或逾時時,則把例外字串當成 failed。(reproduced)
stress metrics 的 scope 錯置:Loop Latency 量的是 health process 自己的 event loop;VRAM Fragmentation 讀的是 health process 自己的 torch allocator(沒有 CUDA 或沒有配置時固定 0.0%),兩者都不是服務的數值,報告也沒有標示。(reproduced:CLI 印 0.01 ms/0.0%)
Activity
raylei50653 commentedon Oct 13, 2026
C0 起步:無 GPU 重現證據與 Owner 裁決(2026-10-13)
座標
main@8350f6f7bc591f313d9a37996b33d7e77f66a61f(#594 merge;main CI SUCCESS)。以下是 read-only 重現:用 mock 取代 NVML,SHM 用私有名稱,native 擴充以sys.modules封鎖。沒有修改 runtime。 raw 腳本與輸出放在本機 gitignored 保留目錄results/537_c0_repro_20261013/(未進 git),下一個 C0 PR 會把同樣的案例寫成 repo 內測試。重現結果(observed as-is)
get_stats()全部回 0;從 EMERGENCY 開始,連續 3 次決策會依序變成 FAST_PATH → REDUCED → NORMAL。「量不到」被當成「健康」read()回 NORMAL;writer 晚於 reader 建立時能附掛上。byte=7 時read()拋ValueErrorclose()之後,舊 reader 仍讀到最後的值。main.py --mode full中PipelineOrchestrator()是asyncio.gather的參數,會比dispatcher.start()先建構(source 確認)。依orchestrator.py的分支,非 anomaly 事件會一直被丟棄(此影響是 source 判讀,沒有跑完整 service)AsyncDispatcher.get_tracker()拋TypeError: Any cannot be instantiatedGPUByteTracker.update()對 3 個和 0 個 detection 都回[],is_cuda=False,和合法空幀無法區分。沒有 CUDA 時,update()在進到 stub 之前就拋RuntimeError: No CUDA GPUs are availableResourceManager/VRAMLevelReader/VRAMLevelWriter沒有直接測試,只有tests/extended/test_dispatcher.py以 mock 使用Owner 裁決(本次工作 session,轉錄)
docs/modules/resource/architecture_degradation.md§5):升級立即生效,可以跨級;恢復時每次決策只降一級,而且 usage 必須嚴格低於目前級別的升級門檻 −5 才降(EMERGENCY <91、FAST_PATH <87、REDUCED <80)。重啟初值、非法 usage(NaN/負值/>100)與決策頻率尚未裁決。目標測試及實作屬於後續修復 PR。C1/F02 的拒絕點(REQ-535-02-01/02-04)、NVML 失敗與 SHM 缺失的 consumer policy 尚未裁決,都列入 C0 矩陣的待決清單。
raylei50653 commentedon Oct 13, 2026
C0 Draft PR:#595,head
604306b79b6763f5ccf1ee891ef3f314009192c3,PR CI+C++ 8/8 SUCCESS,Codex r2 沒有 actionable findings;完整 checkpoint 見 #550。沒有 merge 授權;C2 與 B0-F07 修復尚未開始。docs(537): address C2 review round 1
docs(runtime): republish the runtime coordinate for the C2 hysteresis…
docs(runtime): republish the runtime coordinate for R-1, #538 D2 and …
raylei50653 commentedon Oct 17, 2026
狀態回寫:B0-F07、C2、R-1(C0-11)已合併(2026-10-16~17)
本則補上 C0(#595)之後還沒回寫到本 issue 的三個修復。詳細內容在
failure_degradation_537.md§7~§10,跨 issue 進度在 #550。1. B0-F07(C0-06/07/08)— #596 MERGED
978e55382. C2 遲滯(C0-04)— #598 MERGED
82126e7c(2026-10-17)30bce8b0…→e6d423b4…)。3. R-1/C0-11 dispatcher↔tracker 契約 — 經 #609 原子合併
68c482c0(2026-10-17)AsyncDispatcher對 tracker 的兩種呼叫,native binding 和 Python facade 都不支援。結果是任何 level 下,第一個有 detection 的 batch 就會讓 worker 結束。OnlineTrackerAdapter,只做 geometry-only。OnlineTrackerUnavailable明確拒絕,start()會先做 preflight;傳入 extractor(ReID)也會被拒絕。min(max_batch, 2),不呼叫set_degradation_params(),也不用hasattr略過;get_stats()["tracker_degradation"]=="none"。start()立即拒絕,不再拖到第一個有 detection 的 batch 才拋TypeError。e6d423b4…→8b89ca8f…,identity_semantics4c1b27be…→7a5a4ee6…,probe 重跑,equivalence=unproven)。f7f46b8f:PR CI+C++ 8/8;本機pre_push6017 passed/0 failed;attested exit 0。68c482c0:main CI+C++ SUCCESS(pytest 5729 passed/0 failed)。在 main 上跑 attested 也是 exit 0。main.py --mode full改為明確的 geometry-only,--reid會 fail-fast(caller lifecycle,見 architecture(D): audit async ownership, backpressure, error propagation and shutdown #538)。仍為 OPEN(本 issue)
current_level固定為 NORMAL。on_detection_finished仍是 no-op,所以--mode full沒有接通 detection→cognition。本 issue 保持 OPEN。
Merge pull request #623 from raylei50653/chore/537-c0-05-4a-runtime-i…
raylei50653 commentedon Oct 23, 2026
C0-05(D-537-4A)已合併(2026-10-23)
#622 MERGED
5c38b486(headb5ca6834,merge tree 等於 head)。座標由 stacked #623 一起原子落地。failure_degradation_537.md§19,實作與證據在 §20。4B 未批准。ResourceMonitorUnavailable,不再回四個 0、不再發佈 FRESH NORMAL。AsyncDispatcher.start()先做 preflight;執行中失敗沿 D2-AD 進入 FAILED。stats 顯示UNKNOWN加上 monitor status/error。--mode attestedexit 0;本機pre_push6006 passed、0 failed;GPU 測試 15 passed;Codex r2 READY-TO-MERGE。583ede47 → d04e0183,其餘四軸不變,probe2dabed0b不變,equivalence=unproven。完成條件進度:「至少一個已核准的高風險缺口以小 PR 關閉且有負控制」這一項,加上 F07(#596)、C2(#598),由本 PR 再補一項。「NVML unavailable …有明確策略與測試」這一項,NVML 部分已完成;SHM 部分已由 F07 完成。仍 OPEN:C0-09(WorkbenchPool 沒有接上監控)、C0-01/02(public facade/eval 拒絕點)、C0-10、O0(非法 usage)、health CLI/telemetry(REQ-535-07-03)。#537 保持 OPEN。
raylei50653 commentedon Oct 23, 2026
C0-09 方案紀錄(§0A 開工條件 3)
問題:
WorkbenchPool.get_stats()固定回current_level: "NORMAL",但這條路徑沒有 resource manager/VRAM writer(failure_degradation_537.md §2 C0-09、§19.3)。stats 看起來健康,其實沒有在監控。候選方案
current_level改為新的哨兵值"UNMONITORED"。缺點是 level 詞彙多出第三種非 level 值,consumer 要多處理一種字串。current_level改為"UNKNOWN",並新增resource_monitor_status: "not_wired"與resource_monitor_error: "",和 C0-05 後 AsyncDispatcher 的 stats 欄位結構一致。run_8stream_perception.py --workbench的報告同步印出monitor=not_wired。current_level鍵。這會讓既有 caller 的報告 KeyError,相容性最差。理由:B 沿用 C0-05 已定義的 unknown 語義與 monitor 欄位,consumer 只要讀
resource_monitor_status就能分辨「監控失敗」和「根本沒接」,不必另外學一種 level 字串。不做的事:不在 WorkbenchPool 接上降級 controller 或 writer(§19.3);
--workbench仍然 unsupported(#538);不改 AsyncDispatcher、hysteresis、快照 v1。受影響路徑:
src/saccade/perception/dispatcher.py(只改WorkbenchPool.get_stats)、scripts/ops/run_8stream_perception.py(只改 workbench 報告)、測試與文件。兩個檔案都是decision_relevant,風險:高,需要 Codex 獨立審查,runtime identity 重新發佈後原子落地。測試與負控制
"NORMAL",resource_monitor_status == "not_wired";caller 報告含monitor=not_wired。current_level改回"NORMAL"、或移除resource_monitor_status,測試必須失敗。回退:revert 實作 commit,並依 runbook 重新發佈座標(不直接恢復舊 publication 冒充 current)。
未驗證:不跑完整 online service;不提供 WorkbenchPool 的任何資源降級能力;不取得 online-service qualification。
Merge pull request #625 from raylei50653/chore/537-c0-09-runtime-iden…
Merge pull request #624 from raylei50653/fix/537-c0-09
raylei50653 commentedon Oct 23, 2026
C0-09 已合併(2026-10-23)
#624 MERGED
43432942(headf0ceeeec,merge tree 等於 head)。座標由 stacked #625 一起原子落地。failure_degradation_537.md§21。WorkbenchPool.get_stats()不再固定回current_level="NORMAL",改為"UNKNOWN",並加上resource_monitor_status="not_wired"、resource_monitor_error="";--workbench報告印出monitor=not_wired。沒有接上降級 controller。--mode attestedexit 0;本機pre_push6009 passed、0 failed;GPU 測試 16 passed;五個 mutation 都被攔住;Codex r1 的 MINOR(缺 STOPPING)已修正,r2/r3 READY-TO-MERGE;self-check。d04e0183 → 46d37ec5(只改dispatcher.py、run_8stream_perception.py),其餘四軸不變,probe2dabed0b不變,equivalence=unproven。not_wired只說明沒有監控,不是健康判定。WorkbenchPool 仍沒有資源降級能力,--workbench仍 unsupported(architecture(D): audit async ownership, backpressure, error propagation and shutdown #538),不提升任何 qualification。仍 OPEN:C0-01/02(public facade/eval 拒絕點)、C0-10(shipping run-state 轉換重查)、O0(非法 usage 的決策語義)、health CLI/telemetry(REQ-535-07-03);WorkbenchPool 是否要支援資源降級仍未裁決(§6)。#537 保持 OPEN。
raylei50653 commentedon Oct 23, 2026
O0 方案紀錄(§0A 開工條件 3)
問題:
ResourceManager.decide_degradation_level()不檢查VRAMStats.usage_percent。直接注入非法值時(failure_degradation_537.md §8 O0、§19.3),NaN 維持原級、負值降一級、>100 升到 EMERGENCY,三者都會被當成一次有效決策並推進遲滯狀態。4A 之後 productionget_stats()只會回傳 0~100 的有限值,所以這條路徑只在get_stats()被替換(測試替身、子類別、未來的其他 telemetry 來源)時可達;目前沒有 production 觸發點。候選方案
ResourceMonitorUnavailable(cause 為ValueError,訊息含 GPU 與原值),current_level不變、不做這次決策。這和 4A「無效 sample 也屬 monitor unavailable」同一條規則,dispatcher 走既有錯誤通道:monitor 回報unavailable、level 為 UNKNOWN、worker FAILED、不寫 FRESH 快照。理由:A 把已核准的 4A 規則套到決策輸入上,不新增新的失敗語義或錯誤通道;B 會讓壞資料造成降級(fail-open)。
不做的事:不改
get_stats()的 sample 驗證、門檻、D-537-2 遲滯、R0/F0、快照 v1 或 dispatcher。dispatcher 的啟動 probe 直接呼叫get_stats(),所以被替換的get_stats()回傳非法 usage 時,啟動仍會成功,第一次決策才失敗。productionget_stats()不會產生這種值,這一點只寫進文件,不在本 PR 處理。受影響路徑:
src/saccade/resource/resource_manager.py(只改decide_degradation_level)、測試、failure_degradation_537.md、architecture_degradation.md§5/§7。實作檔屬decision_relevant,風險:高:需要 Codex 獨立審查,runtime identity 重新發佈後原子落地。測試與負控制
ResourceMonitorUnavailable,cause 為ValueError,current_level不變;之後送入有效值時,從保留的 level 正常逐級恢復;0 與 100 仍有效(既有 T1 表)。原本的 T7 O0「觀察」列改成契約。unavailable、level 為 UNKNOWN、不寫新快照,原 level 保留。< 100、改丟ValueError、驗證移到改寫current_level之後,測試都必須失敗。回退:revert 實作 commit,並依 runbook 重新發佈座標。
未驗證:不跑完整 online service,也沒有真實 GPU 的非法 sample(production 無觸發點);不取得 online-service qualification。Owner 可以事後否決,依回退路徑處理。
Merge pull request #627 from raylei50653/chore/537-o0-runtime-identity
Merge pull request #626 from raylei50653/fix/537-o0
raylei50653 commentedon Oct 23, 2026
O0 已合併(2026-10-23)
#626 已合併為
1f18cf76(headc625ce1b,merge tree 與 head 相同)。座標由 stacked #627 一起原子落地。failure_degradation_537.md§22。decide_degradation_level()只接受 0~100(含端點)的實數 usage。NaN、±inf、超出範圍或非實數型別(字串、None、Decimal)一律拋ResourceMonitorUnavailable(cause 為ValueError),level 不變,也不算一次決策;dispatcher 沿用 4A 的通道處理。修復前的行為是:NaN 維持原級、負值降一級、>100 升到 EMERGENCY。productionget_stats()不會產生這類值,只有被替換的get_stats()會走到這條路徑。--mode attestedexit 0;pre_push@ 座標 head 6058 passed、0 failed。resctl gpu0)通過。Decimal("NaN")的InvalidOperation漏接),改為先檢查numbers.Real後 r2/r3 READY-TO-MERGE;self-check。46d37ec5 → ab1bc4ea(只改resource_manager.py),其餘四軸不變,probe2dabed0b不變,equivalence=unproven。get_stats(),所以被替換的get_stats()回非法值時,要到第一次 batch 決策才失敗(§22 已記錄;production 不可達)。不跑完整 online service,不提升任何 qualification。仍 OPEN:C0-01/02(public facade/eval 拒絕點,需 #441/#536 協調)、C0-10(shipping run-state 轉換重查)、health CLI/telemetry(REQ-535-07-03);WorkbenchPool 是否要支援資源降級仍未裁決(§6)。#537 保持 OPEN。
raylei50653 commentedon Oct 23, 2026
C0-10 方案紀錄(§0A 開工條件 3)
問題:shipping
saccade_track的 run journal(CC-536-01-01,#562 起實作)有running/failed/complete三個 state,但「各 state 怎麼轉換、失敗怎麼分類」在卡上明寫歸 #537,C0 也沒有重查(failure_degradation_537.md §2 C0-10、§19.3)。重新讀 source(main@1f18cf76:run_completion.cpp、track_driver.hpp、saccade_track.cpp、preflight.cpp)後,有三件事需要定下來:complete寫在completion.run()的最後;run()回傳後才解構 runtime(CUDA stream、nvJPEG、TRT、torch),process 結束時還有 static/driver teardown。這段如果 abort 或被 kill,結果就是 journalcomplete、exit 非零。卡的第 5 項說「非零代表本輪未完成」,caller 判讀規則卻只看 journal;reader(native_track_parity)實際上兩者都要求。(source-inspected)failure只有{sequence, message}。由state、identity.level/required、load_verification、failure.sequence、已寫出的 sequence 數,可以推出:Gate A 前或 Gate A 拒絕、--require-identity拒絕、Gate B 載入失敗(DetectorLoadError)、Gate B 其他錯誤(GPU 初始化等,load_verification為 null)、第 k 個 sequence、report 發布或 commit 寫入失敗。這套推導規則沒有寫下來,也沒有逐條測試。running+exit 2(fail()是 best effort)。sequence i 的 txt 已 rename、journal 更新失敗,而之後fail()寫成功時,同一份 journal 會同時有「i 是written」和「failure.sequence=i」(source-inspected)。候選方案
shipping/**。在 failure_degradation_537.md 新增 §23:(a) 轉換表,每一列是 事件 → journal state、failure.sequence、identity.level、load_verification、已提交 sequence、exit code,各自綁一個檢查(既有或本 PR 新增),註明 reproduced 或 source-inspected;(b) 失敗分類的推導規則(不加新欄位);(c) 判讀規則採合取:只有 exit 0 而且這次 run_id 的 journal 是complete,才算完整成功。complete搭配非零 exit 的意思是「輸出已提交,但 process 沒有正常結束」,保守的 caller 判為未完成。這和 reader 現行行為以及卡的第 5 項一致,比只看 journal 更嚴,不放寬任何 fail-closed 規則。(d) 「部分完成」定義為:failed或running,且至少有一個 sequence 依 journal sha 確認提交。CC-536-01-01 卡只加一個指向 §23 的連結;轉換語義的唯一寫入者是 §23。failure.stage/class 欄位(journal v4、report 新版)。會改shipping/**、reader 與 format,runtime identity 要重新發佈,package pin 也會過期(re-pin 屬 §0A 例外)。tuple 已經推得出分類,目前也沒有 consumer 需要,所以不做。若之後有 consumer 需要 tuple 推不出的分類,再提。shipping/**,而且 process 結束時的 driver/static teardown 還是會在 commit 之後發生,矛盾不會消失,所以不做。理由:A 把現有行為的語義寫清楚並用測試釘住,判讀規則採更嚴的那一邊,不需要動 shipping binary,也不需要 re-pin;B、C 的成本(identity/package re-pin)換不到新的可觀測性。
不做的事:不改
shipping/**、journal/report format、exit code、lock、作廢範圍、reader 邏輯;不碰 C0-01/02、health CLI、#538;不新增 run 存活探測(lock 被持有 = 仍在跑,lock 空出且running= 已中斷;這點只寫成 caller 診斷提示)。受影響路徑:
docs/architecture/failure_degradation_537.md(§2 C0-10、§6、§19.3、新 §23)、docs/architecture/ship_export_contracts_536.md(CC-536-01-01 只加連結)、tests/native/test_shipping_run_completion.cpp、視需要tests/unit/test_native_track_parity.py。依h2_path_partition,以上都是non_execution,不移動 runtime coordinate。風險:一般(測試+文件,不改 production 程式)。測試與負控制(CPU,
shipping-config-loaderctest,CI 會跑)load_verificationnull、failure.sequencenull、沒有 sequence 提交);--require-identity拒絕(level 已封存但低於 required);被捕捉的錯誤加上<out>不可寫 →running+exit 2,journal 停在前一版;complete之後 SIGABRT → journalcomplete、exit 為 signal,用來釘住「commit 在 teardown 之前」。既有案例(rerun 失敗、載入失敗、第 k 個 sequence throw/kill、rename 前後 kill、report 失敗、lock 衝突)在 §23 逐列對應。completejournal 加上 log 不是exit=0→ 不得判EXACT(若既有測試沒有涵蓋就補)。fail()不寫failure.sequence、complete提前到 report 之前、Gate A 拒絕時保留 level、reader 忽略 exit code,新案例必須攔住。回退:revert 該 PR(只有文件與測試)。
未驗證:真實 binary 在 teardown 時 abort 的頻率與時點(只釘 protocol 層的順序);斷電 durability;網路 FS/WSL 掛 Windows 磁碟上的 flock/rename;F3 的 127 落點。不取得 package/installed 驗證,不改 V5/installed/equivalence 狀態。證據交 #541。Owner 可以事後否決,依回退路徑處理。
Merge pull request #628 from raylei50653/fix/537-c0-10
raylei50653 commentedon Oct 23, 2026
C0-10 已合併(2026-10-23)
#628 已合併為
5aa63ee5(head8a9b47e3,merge tree 與 head 相同)。failure_degradation_537.md§23。CC-536-01-01 卡只加了一個連結。complete。journal 在 runtime teardown 之前就 commit,所以「complete但 exit 非零」是可能的;reader 原本就兩者都要求。failed或running,且至少一個 sequence 已提交。shipping/**、journal/report format、exit code、reader 邏輯。四個檔案都是non_execution,runtime coordinate 與 package pin 都沒有動。pre_push5958 passed、0 failed。仍 OPEN:C0-01/02(public facade 與 eval 拒絕點,需和 #441、#536 協調)、health CLI/telemetry(REQ-535-07-03);WorkbenchPool 是否要支援資源降級仍未裁決。#537 保持 OPEN。
raylei50653 commentedon Oct 23, 2026
health CLI 方案紀錄(§0A 開工條件 3;REQ-535-07-03)
問題:
src/saccade/pipeline/health.py(saccade_ctl.sh health;orchestrator 啟動時也在 process 內執行一次並印出,即 SE-48)會把「取不到」報成健康或報成 0。REQ-535-07-03 要求維運 caller 能從 CLI 報告判讀 unknown/unavailable、service scope 與報告來源。在main@5aa63ee5本機執行與 mock 重現了以下幾點:check_vram()吞掉例外回None,overall_ok對None視為通過。mocknvmlInit失敗、其餘檢查通過時,報告是Saccade Status — OK。(reproduced)check_redis()回 depth0,報告印L3 Queue Depth: 0 items,和真的空 queue 分不出來。(本機 Redis 未啟動時 reproduced)systemctl --user is-active對不存在的 unit 也回 inactive(本機 rc 4、LoadState=not-found),報告印inactive/failed。setup_services 安裝的是 system units,ctl/health 查的卻是--user(ledger 部署段已記);systemctl 不存在或逾時時,則把例外字串當成 failed。(reproduced)候選方案
ok/degraded/unknown,並附來源(systemctl --user、NVML GPU 0、REDIS_URL)。DEGRADED;否則任一項 unknown 為UNKNOWN;全部 ok 才是OK。overall_ok只在OK時為真,unknown 不再算通過。None),不是 0。systemctl --user show -p LoadState,ActiveState判讀:loaded+active 為 ok;loaded+其他狀態為 degraded;not-found為 unknown(「此 user scope 沒有該 unit」);systemctl 不存在或逾時為 unknown。saccade_ctl.sh有set -e,health子命令會因此改變行為。不做,留給 owner 裁決。None不算通過)。第 2~4 點的「unknown 被報成 0 或 inactive」仍然存在,REQ 的 scope/來源可判讀也沒有收斂。理由:A 只把報告改成 fail-closed 且可判讀,不新增 readiness、SLO 或 API 承諾;B 的 exit code 屬於未裁決的政策;C 不完整。
不做的事:
--user與 system scope 的部署落差(只在報告標明 scope)、VRAM_WARN_PCT門檻或 orchestrator(SE-48 仍只印報告、不擋啟動)。ResourceManager/dispatcher 的監控通道(§20),也不把 health 報告當成 online-service qualification。受影響路徑:
src/saccade/pipeline/health.py:decision_relevant,風險:高。需要 Codex 獨立審查,runtime identity 重新捕捉後以 stacked publication 原子落地。tests/unit/test_pipeline_health.py:既有「失敗時 depth == 0」改為None。docs/architecture/failure_degradation_537.md(新 §24、§6、§19.3)。system_overview_536.mdSN-ON8 列只加連結。測試與負控制(host,mock systemctl/NVML/Redis):
UNKNOWN、overall_ok為假。None、報告印 unknown。0 items;NVML 失敗時要nvmlShutdown。None又算通過、Redis 失敗回 0、not-found當成 degraded 或 ok、UNKNOWN 優先於 DEGRADED,測試都必須失敗。回退:revert 實作並依 runbook 重新發佈座標。
未驗證:沒有在真實部署(system 或 user units 實際執行中)上驗證;沒有 orchestrator 端到端驗證;多 GPU 只看 device 0。不取得 online-service qualification。Owner 可以事後否決,依回退路徑處理。
Merge pull request #630 from raylei50653/chore/537-health-cli-runtime…
Merge pull request #629 from raylei50653/fix/537-health-cli
raylei50653 commentedon Oct 25, 2026
health CLI 已合併(2026-10-25;REQ-535-07-03)
#629 加上 stacked 的 #630 合併為 main
3375e7d4(headc91d665f,merge treef2e47f32與審過的 head 相同)。failure_degradation_537.md§24。ok、degraded或unknown,並附來源(systemctl --user、NVML GPU 0、REDIS_URL)。overall_ok只在 OK 時為真。REDIS_URL只在整段通過 allowlist 時才顯示,並去掉 userinfo。VRAM_WARN_PCT、orchestrator、ResourceManager。ab1bc4ea→4ad5ae2c,只有health.py不同;其餘四軸與 probe digest 不變,equivalence=unproven。在 main 上 attested exit 0。2d0b2834與 publication 重跑 @30dbef82都是 READY-TO-MERGE,findings: none。第一次 publication 審查中斷,沒有 verdict,不採用。2d0b2834:報告為 DEGRADED,三個 unit 為 unknown,queue depth 為 unknown,exit 0。仍 OPEN:
#537 保持 OPEN。
docs(538): record the D1 owner ruling
docs(runtime): republish the runtime coordinate for #537 F01
Merge pull request #633 from raylei50653/chore/537-f01-runtime-identity
Merge pull request #632 from raylei50653/fix/537-f01-child-failure
Merge pull request #635 from raylei50653/chore/537-f06-runtime-identity
Merge pull request #634 from raylei50653/fix/537-f06-sequence-selection
raylei50653 commentedon Oct 25, 2026
F01/F06 已落地(2026-10-25)
mot17.py --processes子程序失敗傳播07fdaf58,main CI 8/8,attested exit 0failure_degradation_537.md§25~/.local/state/saccade/evidence/537-f01/20261025T145150/aa69c3c1,main CI 8/8,attested exit 0failure_degradation_537.md§26~/.local/state/saccade/evidence/537-f06/20261025T155523/F01:fail-fast。第一個失敗(非零 exit、signal、無法啟動、launcher 自己出錯)讓 launch 失敗:待啟動的不啟動,執行中的 SIGTERM → grace → SIGKILL,全部 reap。parent 先決定 exit code(原 code/128+N/127/70/130),再盡力回報,不算 metrics。
terminated;不影響 exit code,也不遮住原始失敗)。F06:明確指定但缺少
seqinfo.ini→SequenceSelectionError(exit 1,在 run claim 與 detector 建構之前);自動發現時記錄原因後略過;零個有效 → exit 1;C++ 路徑不再以 1920×1080 預設值建構。EvalConfig.seqs與 metrics 清單。concurrent_mot17.py自己的失敗傳播。Runtime coordinate:implementation
4ad5ae2c…→11204b8a…(F01)→11263f7c…(F06);其他軸不動,probe 重跑 digest 相同,equivalence=unproven。未擴大 online qualification,tracking 數值不變,未帶入 #538 的修復。下一步:#538 F02 計數契約。