逾期判定接上來,逾期與連續失敗每一輪都提 #42

Merged
admin merged 1 commits from feat/overdue-and-failing-every-round into develop 2026-09-07 03:10:40 +00:00
Member

這一批做什麼

逾期判定本來沒實作,監控頁上就寫著「上面的判定只講到期,不講逾期」。這一批把它接上,並讓逾期與連續失敗每一輪都列進待人處理。

這一張疊在 #40 與 #41 上面,所以差異裡看得到那兩支的 commit。

到期與逾期是兩件事,分兩欄

問的是 例子
到期 該跑了嗎 七天一次的檢查項,天天都可能到期,卻永遠不會逾期
逾期 截止時間過了嗎 有截止時間的交辦,可能早就逾期,卻因為排定點還沒到而判成還沒到

合成一個值就把這兩種情況混成同一格。所以 due.sh 多第十二欄 overdue,值是減號(沒有截止時間)、no、逾期的秒數,或 bad。

bad 算成欄位不合法、回結束碼 2。 一個解不開的截止時間跟沒有截止時間,在畫面上長得一模一樣,而前者是登錄的時候就填錯了。

被暫停的那幾筆照算逾期。 暫停中止的是到期判定,不是日曆——一筆被暫停又逾期的交辦正好是最容易被忘掉的那一種。done 那幾筆不算:做完了就沒有截止時間可以過。

每一輪都提,不因為提過就不提

兩種都不會自己好:截止時間過了不會因為過更久就不逾期,連續失敗的項目每一輪都會再試一次然後再失敗一次。

「提過了」不是「處理過了」。 而助理不替人按暫停:paused 留給人設,也只有人解得開。

監控頁那一節現在點名

原本只印一個總數:「其中 N 筆 fail_count 大於 0」。現在多一張表,逐筆列 id、已連續失敗幾次、最後一次執行、標題。

失敗次數這個欄位存在的理由是指出「有一筆壞掉的項目每輪重試而沒人知道」——不說出是哪一筆,那個理由只完成一半。

狀態查詢走新的唯讀子命令

多一個 due.sh overdue:只判逾期、一份快照都不推進。

若走 會怎樣
scan 推進快照,那一輪之後的事件判定全部落空
events 判不到逾期
呼叫端自己拿 due 欄比 第二套判定,漂移的那一天兩邊都說自己對

目錄頁刻意不加欄位

那一頁一台機器一個區塊、各自那一輪寫。新加一條只有跑到新版的機器寫得出來,讀的人分不出「這台沒有逾期」與「這台還沒寫這一條」,而目錄頁沒有整頁改寫的路可以走——整頁覆蓋等於刪掉別台機器的紀錄。

理由與當初把「本輪非 ok 事件數」擋在那一頁外面的一樣。範本裡寫著那個決定,所以這一批照它辦。

欄位數 11 變 12

run-due.sh 那道欄位數檢核跟著改成 12。那道檢核擋的不是第 12 欄本身,是「兩支不是同一版」——版本不同的時候,前 11 欄的順序也不能假設還是原來那樣。實測拿 11 欄的清單餵進去,回 2、一筆都沒跑。

實測

測什麼 結果
到期又逾期的交辦 逾期 6 天 2 小時,逐筆點名
截止時間填錯 overdue=bad、tasks_due_bad=1、結束碼 2
被暫停又過期 算逾期,表上 state 寫 paused
做完了但截止時間也過了 不算逾期
還沒到截止時間 不算逾期
due.sh overdue 在真的機器上 16 筆、0 逾期、結束碼 0,快照一份都沒動
巡檢一輪 tasks_overdue=2、pending=3,兩筆待人處理各一列
全鏈路 collect → run-due 12 欄,18 個存取庫、5 支 CLI 都代得出目標
11 欄的清單 回 2,一筆都沒跑
四支檢核 lint-scripts、check-behaviors、check-skill-paths、ste100-lint 全 0

邊界

逾期不改變那一輪的判定。 摘要表那一欄還是只反映巡檢自己五項來源的成敗——一筆逾期的交辦是人沒做,不是巡檢壞了。逾期會出現在待人處理那一欄的計數裡。

remind 型項目怎麼送到前景還是沒接(那是另一件待辦)。所以逾期現在的出口有兩個:監控頁那一節,與人自己跑一次狀態查詢。

## 這一批做什麼 逾期判定本來沒實作,監控頁上就寫著「上面的判定只講到期,不講逾期」。這一批把它接上,並讓逾期與連續失敗**每一輪都列進待人處理**。 **這一張疊在 #40 與 #41 上面**,所以差異裡看得到那兩支的 commit。 ## 到期與逾期是兩件事,分兩欄 | | 問的是 | 例子 | | --- | --- | --- | | 到期 | 該跑了嗎 | 七天一次的檢查項,天天都可能到期,卻永遠不會逾期 | | 逾期 | 截止時間過了嗎 | 有截止時間的交辦,可能早就逾期,卻因為排定點還沒到而判成還沒到 | 合成一個值就把這兩種情況混成同一格。所以 `due.sh` 多第十二欄 `overdue`,值是減號(沒有截止時間)、`no`、逾期的秒數,或 `bad`。 **`bad` 算成欄位不合法、回結束碼 2。** 一個解不開的截止時間跟沒有截止時間,在畫面上長得一模一樣,而前者是登錄的時候就填錯了。 **被暫停的那幾筆照算逾期。** 暫停中止的是到期判定,不是日曆——一筆被暫停又逾期的交辦正好是最容易被忘掉的那一種。`done` 那幾筆不算:做完了就沒有截止時間可以過。 ## 每一輪都提,不因為提過就不提 兩種都不會自己好:截止時間過了不會因為過更久就不逾期,連續失敗的項目每一輪都會再試一次然後再失敗一次。 **「提過了」不是「處理過了」。** 而助理不替人按暫停:`paused` 留給人設,也只有人解得開。 ## 監控頁那一節現在點名 原本只印一個總數:「其中 N 筆 `fail_count` 大於 0」。現在多一張表,逐筆列 id、已連續失敗幾次、最後一次執行、標題。 失敗次數這個欄位存在的理由是指出「有一筆壞掉的項目每輪重試而沒人知道」——**不說出是哪一筆,那個理由只完成一半。** ## 狀態查詢走新的唯讀子命令 多一個 `due.sh overdue`:只判逾期、一份快照都不推進。 | 若走 | 會怎樣 | | --- | --- | | `scan` | 推進快照,那一輪之後的事件判定全部落空 | | `events` | 判不到逾期 | | 呼叫端自己拿 `due` 欄比 | 第二套判定,漂移的那一天兩邊都說自己對 | ## 目錄頁刻意不加欄位 那一頁一台機器一個區塊、各自那一輪寫。新加一條只有跑到新版的機器寫得出來,讀的人分不出「這台沒有逾期」與「這台還沒寫這一條」,而目錄頁沒有整頁改寫的路可以走——整頁覆蓋等於刪掉別台機器的紀錄。 理由與當初把「本輪非 ok 事件數」擋在那一頁外面的一樣。**範本裡寫著那個決定,所以這一批照它辦。** ## 欄位數 11 變 12 `run-due.sh` 那道欄位數檢核跟著改成 12。那道檢核擋的不是第 12 欄本身,是「兩支不是同一版」——版本不同的時候,前 11 欄的順序也不能假設還是原來那樣。實測拿 11 欄的清單餵進去,回 2、一筆都沒跑。 ## 實測 | 測什麼 | 結果 | | --- | --- | | 到期又逾期的交辦 | 逾期 6 天 2 小時,逐筆點名 | | 截止時間填錯 | `overdue=bad`、`tasks_due_bad=1`、結束碼 2 | | 被暫停又過期 | 算逾期,表上 `state` 寫 `paused` | | 做完了但截止時間也過了 | 不算逾期 | | 還沒到截止時間 | 不算逾期 | | `due.sh overdue` 在真的機器上 | 16 筆、0 逾期、結束碼 0,快照一份都沒動 | | 巡檢一輪 | `tasks_overdue=2`、`pending=3`,兩筆待人處理各一列 | | 全鏈路 collect → run-due | 12 欄,18 個存取庫、5 支 CLI 都代得出目標 | | 11 欄的清單 | 回 2,一筆都沒跑 | | 四支檢核 | `lint-scripts`、`check-behaviors`、`check-skill-paths`、`ste100-lint` 全 0 | ## 邊界 **逾期不改變那一輪的判定。** 摘要表那一欄還是只反映巡檢自己五項來源的成敗——一筆逾期的交辦是人沒做,不是巡檢壞了。逾期會出現在待人處理那一欄的計數裡。 `remind` 型項目怎麼送到前景還是沒接(那是另一件待辦)。所以逾期現在的出口有兩個:監控頁那一節,與人自己跑一次狀態查詢。
jiantw83 added 4 commits 2026-09-07 02:53:34 +00:00
實測踩到一輪:它報「寫入監控頁失敗——系統的核准機制擋下這個寫入指令,重試
一次仍被擋下,不是 Gitea 回傳的錯誤碼」,然後照規則中止、釋放鎖、不寫心跳。
中止的行為完全正確,寫不成頁就不該假裝跑完。

但那一輪沒說是哪一支工具、哪一條指令。事後把明顯的嫌疑一個一個排除——那一支
腳本實測在無人值守下放行、暫存檔路徑落在檔案規則的範圍內、條目也帶著寫入
確認旗標——真正被擋的那一條始終沒找到。那一輪到現在還是原因不明。

問題在於「擋下」不是工具回的錯誤:沒有結束碼、沒有 stderr、工具自己的日誌上
也沒有痕跡。指令字面是唯一的證據,也是唯一能拿去對允許清單的東西,而清單
比對的是還沒展開的指令字面。所以少了那一行,事後就只能猜。

兩處都加:寫監控頁那一步的失敗分流加一條,界線那一段再加一條通則,涵蓋整輪
任何一次被擋。要求含環境變數前綴——那算指令字面的一部分,今天量過。

三份 manifest 版號從 0.2.9 升到 0.3.1。原本寫 0.2.10,同步 manifest 那一支
把它正規化掉了——那一支不收兩位數的修訂號。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
新增 tools/scan-repos.sh:掃出工作目錄底下的存取庫,交出 {repo} 要代的
那份清單,順便對出每一個存取庫的 REPO_{HASH} 盤點頁頁名(雜湊規則與
盤點頁那一支相同,實測值一致)。

掃描起點刻意沒有預設值。給一個預設就等於猜,而猜錯的後果不是掃不到,
是在猜錯的那些目錄底下跑指令——往上一層是家目錄、再往上是整台機器,
而那一輪沒有人看得到它跑到哪裡去了。沒設就回 3 並說要設哪一個變數。
深度預設一層、上限三層;點開頭的目錄、符號連結、路徑帶空白或殼層特殊
字元的三種一律不交出去,但逐個印出來——那是真的存在卻沒被盤點到的
存取庫,只印一個總數會讀成整批都掃過了。

run-due.sh 改成兩個代入點都代:{cli} 取偵測到的 CLI 代號、{repo} 取
掃到的存取庫,兩個都帶的那一筆目標數是乘積。待辦簿那一筆的 repo 欄
有值時只代那一個,值可以是路徑也可以是 {owner}/{repo};對不出來就
印 held=,不退回全部存取庫——那一筆指名了一個目標。代入之後再驗一次
禁止字元,因為代進去的值是這一輪現場算出來的。

schedule.sh 把 JSC_ASSIST_SCAN_ROOT 與 JSC_ASSIST_SCAN_EXCLUDE 快照進
排程條目。少了掃描起點,帶 {repo} 的內建項每一輪都代不出目標,而那一輪
只印一行 held=,看起來像這一批還沒接上、不像一個變數沒進條目。

同時補兩個只有真的執行才發現得了的缺陷:

一、cron 一行的長度上限只在寫入那一刻由 crontab 自己擋,--dry-run 那一路
根本不碰它,所以預演每一次都過。實測踩過一次:整條 PATH 快照進條目那一批
預演全綠、安裝回結束碼 4。改成建好條目就量,兩個模式都印 entry_len= 與
上限,達到上限當場拒絕並指出長度是從哪幾個快照變數來的。

二、run-due.sh 截錯誤訊息用的 cut -c 數的是位元組不是字元,中文字剛好被
截在中間就在報告上留下一個替代字元。改成截完再過一次 iconv -c 丟掉那個
不完整的序列。這一種不會有人來報:亂碼不影響結束碼。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
原本看 .git 在不在。這台機器的工作目錄底下剛好有一個目錄的 .git 只剩
一個空的 info/,git 一句「not a git repository」——而掃描把它算成一個
存取庫,還印成「沒有 origin」。那個說法讀起來像「這個存取庫還沒接遠端」,
不像「這裡根本不是存取庫」,兩件事的處置完全不同。

改成由 git 回答,並核對它認定的頂層就是那個目錄:只問「是不是在工作樹裡」
不夠,git 會從那裡往上找,.git 壞掉時它會找到上一層的存取庫然後答「是」。
兩邊都解成實體路徑再比,掃描起點帶符號連結那一段時字串才對得上。

多一個 not_a_repo= 判定行與收尾計數,執行那一支照樣原樣轉出。
存取庫數從 19 個變 18 個。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
逾期本來沒實作,監控頁上就寫著「上面的判定只講到期,不講逾期」。

到期與逾期分兩欄,不合成一個判定:到期是「該跑了」,逾期是「due 欄那個
截止時間過了」。一筆七天一次的檢查項天天都可能到期,卻永遠不會逾期;
一筆有截止時間的交辦可能早就逾期,卻因為排定點還沒到而判成還沒到。
合成一個值就把兩種情況混成同一格。

due.sh 多第十二欄 overdue,值是減號(沒有截止時間)、no、逾期的秒數,
或 bad。bad 算成欄位不合法回 2——一個解不開的截止時間跟沒有截止時間
在畫面上長得一模一樣,而前者是登錄的時候就填錯了。done 那幾筆不算逾期;
被暫停的那幾筆照算,因為暫停中止的是到期判定,不是日曆,而一筆被暫停
又逾期的交辦正好是最容易被忘掉的那一種。

另加唯讀子命令 due.sh overdue 給狀態查詢那一路走。走 scan 會推進快照,
那一輪之後的事件判定會全部落空;走 events 又判不到逾期;讓呼叫端自己
拿 due 欄去比更糟,那是第二套判定,漂移的那一天兩邊都說自己對。

patrol.sh 在逾期或連續失敗筆數大於 0 時各列一筆待人處理,每一輪都列。
兩種都不會自己好:截止時間過了不會因為過更久就不逾期,連續失敗的項目
每一輪都會再試一次然後再失敗一次。「提過了」不是「處理過了」,而助理
不替人按暫停,那個狀態留給人設。

監控頁那一節逐筆點名連續失敗的那幾筆——id、失敗幾次、最後一次執行、
標題。原本只印一個總數,而失敗次數這個欄位存在的理由是指出「有一筆壞掉
的項目每輪重試而沒人知道」,不說出是哪一筆,那個理由只完成一半。

目錄頁刻意不加欄位。那一頁一台機器一個區塊、各自那一輪寫,新加一條只有
跑到新版的機器寫得出來,讀的人分不出「這台沒有逾期」與「這台還沒寫這
一條」——理由與當初把「本輪非 ok 事件數」擋在那一頁外面的一樣。

欄位數從 11 變 12,run-due.sh 那道欄位數檢核跟著改成 12。那道檢核擋的
不是第 12 欄本身,是「兩支不是同一版」——版本不同的時候,前 11 欄的
順序也不能假設還是原來那樣。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
admin merged commit 4cbd0e360f into develop 2026-09-07 03:10:40 +00:00
admin deleted branch feat/overdue-and-failing-every-round 2026-09-07 03:10:40 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: plugins/assist#42