feat/overdue-and-failing-every-round
develop
逾期判定本來沒實作,監控頁上就寫著「上面的判定只講到期,不講逾期」。這一批把它接上,並讓逾期與連續失敗每一輪都列進待人處理。
這一張疊在 #40 與 #41 上面,所以差異裡看得到那兩支的 commit。
合成一個值就把這兩種情況混成同一格。所以 due.sh 多第十二欄 overdue,值是減號(沒有截止時間)、no、逾期的秒數,或 bad。
due.sh
overdue
no
bad
bad 算成欄位不合法、回結束碼 2。 一個解不開的截止時間跟沒有截止時間,在畫面上長得一模一樣,而前者是登錄的時候就填錯了。
被暫停的那幾筆照算逾期。 暫停中止的是到期判定,不是日曆——一筆被暫停又逾期的交辦正好是最容易被忘掉的那一種。done 那幾筆不算:做完了就沒有截止時間可以過。
done
兩種都不會自己好:截止時間過了不會因為過更久就不逾期,連續失敗的項目每一輪都會再試一次然後再失敗一次。
「提過了」不是「處理過了」。 而助理不替人按暫停:paused 留給人設,也只有人解得開。
paused
原本只印一個總數:「其中 N 筆 fail_count 大於 0」。現在多一張表,逐筆列 id、已連續失敗幾次、最後一次執行、標題。
fail_count
失敗次數這個欄位存在的理由是指出「有一筆壞掉的項目每輪重試而沒人知道」——不說出是哪一筆,那個理由只完成一半。
多一個 due.sh overdue:只判逾期、一份快照都不推進。
due.sh overdue
scan
events
due
那一頁一台機器一個區塊、各自那一輪寫。新加一條只有跑到新版的機器寫得出來,讀的人分不出「這台沒有逾期」與「這台還沒寫這一條」,而目錄頁沒有整頁改寫的路可以走——整頁覆蓋等於刪掉別台機器的紀錄。
理由與當初把「本輪非 ok 事件數」擋在那一頁外面的一樣。範本裡寫著那個決定,所以這一批照它辦。
run-due.sh 那道欄位數檢核跟著改成 12。那道檢核擋的不是第 12 欄本身,是「兩支不是同一版」——版本不同的時候,前 11 欄的順序也不能假設還是原來那樣。實測拿 11 欄的清單餵進去,回 2、一筆都沒跑。
run-due.sh
overdue=bad
tasks_due_bad=1
state
tasks_overdue=2
pending=3
lint-scripts
check-behaviors
check-skill-paths
ste100-lint
逾期不改變那一輪的判定。 摘要表那一欄還是只反映巡檢自己五項來源的成敗——一筆逾期的交辦是人沒做,不是巡檢壞了。逾期會出現在待人處理那一欄的計數裡。
remind 型項目怎麼送到前景還是沒接(那是另一件待辦)。所以逾期現在的出口有兩個:監控頁那一節,與人自己跑一次狀態查詢。
remind
實測踩到一輪:它報「寫入監控頁失敗——系統的核准機制擋下這個寫入指令,重試 一次仍被擋下,不是 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>
No dependencies set.
The note is not visible to the blocked user.
這一批做什麼
逾期判定本來沒實作,監控頁上就寫著「上面的判定只講到期,不講逾期」。這一批把它接上,並讓逾期與連續失敗每一輪都列進待人處理。
這一張疊在 #40 與 #41 上面,所以差異裡看得到那兩支的 commit。
到期與逾期是兩件事,分兩欄
合成一個值就把這兩種情況混成同一格。所以
due.sh多第十二欄overdue,值是減號(沒有截止時間)、no、逾期的秒數,或bad。bad算成欄位不合法、回結束碼 2。 一個解不開的截止時間跟沒有截止時間,在畫面上長得一模一樣,而前者是登錄的時候就填錯了。被暫停的那幾筆照算逾期。 暫停中止的是到期判定,不是日曆——一筆被暫停又逾期的交辦正好是最容易被忘掉的那一種。
done那幾筆不算:做完了就沒有截止時間可以過。每一輪都提,不因為提過就不提
兩種都不會自己好:截止時間過了不會因為過更久就不逾期,連續失敗的項目每一輪都會再試一次然後再失敗一次。
「提過了」不是「處理過了」。 而助理不替人按暫停:
paused留給人設,也只有人解得開。監控頁那一節現在點名
原本只印一個總數:「其中 N 筆
fail_count大於 0」。現在多一張表,逐筆列 id、已連續失敗幾次、最後一次執行、標題。失敗次數這個欄位存在的理由是指出「有一筆壞掉的項目每輪重試而沒人知道」——不說出是哪一筆,那個理由只完成一半。
狀態查詢走新的唯讀子命令
多一個
due.sh overdue:只判逾期、一份快照都不推進。scaneventsdue欄比目錄頁刻意不加欄位
那一頁一台機器一個區塊、各自那一輪寫。新加一條只有跑到新版的機器寫得出來,讀的人分不出「這台沒有逾期」與「這台還沒寫這一條」,而目錄頁沒有整頁改寫的路可以走——整頁覆蓋等於刪掉別台機器的紀錄。
理由與當初把「本輪非 ok 事件數」擋在那一頁外面的一樣。範本裡寫著那個決定,所以這一批照它辦。
欄位數 11 變 12
run-due.sh那道欄位數檢核跟著改成 12。那道檢核擋的不是第 12 欄本身,是「兩支不是同一版」——版本不同的時候,前 11 欄的順序也不能假設還是原來那樣。實測拿 11 欄的清單餵進去,回 2、一筆都沒跑。實測
overdue=bad、tasks_due_bad=1、結束碼 2state寫pauseddue.sh overdue在真的機器上tasks_overdue=2、pending=3,兩筆待人處理各一列lint-scripts、check-behaviors、check-skill-paths、ste100-lint全 0邊界
逾期不改變那一輪的判定。 摘要表那一欄還是只反映巡檢自己五項來源的成敗——一筆逾期的交辦是人沒做,不是巡檢壞了。逾期會出現在待人處理那一欄的計數裡。
remind型項目怎麼送到前景還是沒接(那是另一件待辦)。所以逾期現在的出口有兩個:監控頁那一節,與人自己跑一次狀態查詢。新增 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>