fix/unattended-patrol-round-env-and-permissions
develop
tools/schedule.sh
tools/patrol.sh
templates/monitor-page.md
skills/assistant/SKILL.md
references/behaviors.md
README.md
AGENTS.md
plugin.json
.claude-plugin/plugin.json
.codex-plugin/plugin.json
排程那一輪跑不完的四道關卡,逐道修法如下。
command -v
四關任何一關沒過,那一輪就不寫心跳。這是空轉的根:頁寫不成就不寫心跳,外面只看得到心跳過期,看不出是卡在哪一關。
另外兩項是設計調整,不是修錯。
$JSC_HOME/current/{外掛名}
摘要表刻意只有五欄:巡檢時間、本輪判定、四項成敗、待人處理筆數、警示來源。一列要能一眼看完,才看得出是從哪一輪開始壞的。
「警示來源」那一欄不能省。沙箱跑出來的列是「警示、四項全過、待人處理 0」,讀的人看不出警示哪來。查過不是缺陷:四項來源都讀得到,是讀到的內容有警示。所以每一處把判定改成警示的地方,一律改走同一支函式順手收下一句短理由,多個用頓號串,沒有就寫「無」,像「心跳過期」「版本查詢失敗」「重啟閘門未清」「上一輪逾時被接手」。最新一輪那一塊也補同一列,兩處同源。
還有一道防線是執行路徑自檢。用全新的 CLI 行程實測,代理人會把工具路徑解回外掛快取那一份,不是指定的工作樹那一份,讀到的還是舊語意——只在說明書裡寫明禁止是擋不住的。所以巡檢與排程兩支腳本開跑時先比對自己是不是從那一組不帶版本號的連結底下被叫起來的,不是就往標準錯誤印一行警告,點名實際路徑、應該用的路徑與理由。
刻意只警告、不中止:從工作樹直接跑腳本是開發時的正當用法,中止會把那條路擋掉。真正的阻擋本來就發生在權限閘門那裡。
四道關卡各自在實機上驗證過,逐項如下。
--dry-run
自動化測試:無。這幾項都是排程與外部服務的整合行為,靠實機跑一輪驗證。
驗證範圍要說清楚,避免看的人誤判:
current
排程條目改成自己帶齊執行環境,install 完也印出那一輪要開的權限規則。 背景助理在無人值守的輪次連續失敗,查出四道關卡。cron 給的 PATH 很短, 不含使用者的 bin 目錄,裸的指令名每一輪都是找不到執行檔。cron 也不讀 殼的設定檔,那一輪沒有 Gitea 主機位址與 wiki 存放庫變數,連不上 wiki。 寫入確認只認 tty,排程沒有 tty,寫監控頁一定被擋。工具權限沒開,巡檢 腳本連跑都跑不起來,而那一輪沒有人可以按同意。四關任何一關沒過,那一 輪就不寫心跳,排程裝著卻永遠空轉,外面只看得到心跳過期。 CLI 改用 command -v 解成絕對路徑再寫進條目,解不到就停下,不猜路徑。 install 當下把主機位址、金鑰、狀態根目錄、心跳門檻與所有已設定的 wiki 存放庫變數就地快照,以名稱等於值的前綴寫進條目,值裡的單引號照 POSIX 寫法跳脫。條目自帶寫入確認旗標,無人值守的那一輪本來就沒有人可以按同 意。install 完印出四支腳本各三種呼叫形式的 allow 規則,路徑一律取 current 那一組不帶版本的連結,並順手檢查連結在不在,不在只警告、不代 建。腳本內部找心跳腳本也改成 current 優先,避免同一輪跑到混版的工具。 條目裡帶著金鑰快照,所以印條目時一律把金鑰遮成星號,遮到下一個空白為 止;crontab 檔案要保持只有本人讀得到,這幾個變數改過就要重跑一次 install。功能範圍是助理的系統排程安裝、移除與查現況。
巡檢產出與監控頁範本改成固定三塊:本頁基本資料、最新一輪、近 24 輪摘要。 舊寫法是一輪附加一節。十五分鐘跑一輪,一天就疊出九十六節,那樣的頁沒 有人讀得完,也就沒有人會發現助理壞在哪一輪。軌跡留著卻沒人看,等於沒 有留。 基本資料建頁時寫一次就不動。最新一輪每輪整塊換掉,只留最新那一輪的完 整內容。摘要表一輪一列,最新的在最上面,超過 24 列就丟掉最舊的那一列, 一列只有四欄:巡檢時間、本輪判定、四項成敗、待人處理筆數,一眼看得出 是從哪一輪開始壞的。collect 的輸出鍵位跟著換,section_file 不再產出, 改印 latest_file、summary_file 與 summary_row_file,另外多印本輪待人處 理的筆數。範本連帶把流程圖與寫入規則改成先讀回舊頁、再三塊重組整頁寫 回,並寫明舊格式的頁第一次重組要怎麼收。 順手把腳本內部找別的 domain 工具的順序改成 current 連結優先,理由跟排 程那支一樣:技能與權限規則都以 current 為準,腳本自己去挑另一個版本就 會跑到混版的工具,而那種不一致查起來沒有線索。功能範圍是一輪巡檢的收 攏與監控頁產出。
技能主文、行為清單、專案說明與界線文件一起改,對齊這一輪的排程修正與 監控頁改版。 工具路徑與監控頁寫法都換了,文件沒跟上就是照舊做法跑:用快取基底目錄 組出來的路徑會被權限靜靜擋掉,那一輪停在沒有人能回答的權限詢問;照舊 的附加語意寫頁,又會把剛換好的三塊寫回一輪一節。 技能主文的工具路徑一律改走 current 那一組不帶版本的路徑,新增 Tool paths 一節列出四支工具,並寫明權限閘門只放行那一組,放行技能不等於放 行技能裡的每一個呼叫。監控頁那幾步改寫成讀回舊頁、基本資料原樣留著、 最新一輪整塊換掉、本輪摘要列擺最上面並截到 24 列,舊格式的頁第一次重 組要在回報裡說明。frontmatter 的 description 重寫並補上單引號,句中有 冒號不加引號會讓解析走偏。界線四從「只附加」改成三塊寫入語意。專案說 明與行為清單同步條目的環境快照、allow 規則、暫存檔名與可驗證跡象。 功能範圍是助理技能的文件與行為合約,不動任何腳本行為。
三份外掛清單的版本從 0.1.0 改成 0.1.1。 這一輪改了排程條目的組法、監控頁的格式與技能的工具路徑,三件都會影響 已經裝在機器上的那一份。版本不動,版本閘門就看不出哪台機器裝的是舊的 那一版,也提不出重啟要求,舊條目會繼續空轉到有人自己發現。 三份檔案只動 version 一欄,其餘不碰,三份保持同一個號碼,這樣不管從哪 一支 CLI 讀到的都是同一個答案。功能範圍是外掛的版本宣告。
兩支腳本開跑就檢查自己的執行路徑,監控頁的摘要表與最新一輪那一塊補上 「警示來源」。 兩件都是實測之後補的。用全新的 CLI 行程跑,代理人會把工具路徑解回外掛 快取那一份,不是指定的工作樹那一份。原本的對策只在技能說明書裡寫明禁 止,那是文件約束,擋不住真的走錯的那一輪。權限閘門只放行 current 那一 組確切路徑,走錯就被靜靜擋掉,那一輪不寫心跳,外面只看得到心跳過期。 另一頭,沙箱跑出來的摘要列是「警示、四項全過、待人處理 0」,讀的人看 不出警示哪來。查過不是缺陷:四項來源都讀得到,是讀到的內容有警示。摘 要表的用途本來就是一眼看出從哪一輪開始壞,少了原因那一欄就做不到。 巡檢與排程兩支腳本開跑時先比對自己是不是從 current 底下被叫起來的,不 是就往 stderr 印一行警告,點名實際路徑、應該用的路徑與理由。刻意只警告 不中止:從工作樹直接跑腳本是開發時的正當用法,中止會把那條路擋掉,真 正的失敗本來就發生在權限閘門那裡。摘要表從四欄加到五欄,最新一輪那一 塊也補一列,值取每一處設警示時收下來的短理由,多個用頓號串,沒有就寫 「無」。腳本裡每一處把判定改成警示的地方,一律改走同一支函式順手收下 理由,collect 的輸出多印一行 warn_sources。技能主文、行為清單與監控頁 範本跟著寫明這兩件事。 功能範圍是助理的一輪巡檢與系統排程安裝。
No dependencies set.
The note is not visible to the blocked user.
摘要
變更內容
tools/schedule.shtools/patrol.shtemplates/monitor-page.mdskills/assistant/SKILL.mdreferences/behaviors.mdREADME.mdAGENTS.mdplugin.json、.claude-plugin/plugin.json、.codex-plugin/plugin.json設計重點
排程那一輪跑不完的四道關卡,逐道修法如下。
command -v解成絕對路徑再寫進條目,解不到就停下,不猜路徑四關任何一關沒過,那一輪就不寫心跳。這是空轉的根:頁寫不成就不寫心跳,外面只看得到心跳過期,看不出是卡在哪一關。
另外兩項是設計調整,不是修錯。
$JSC_HOME/current/{外掛名}為準,外掛升版不必改設定摘要表刻意只有五欄:巡檢時間、本輪判定、四項成敗、待人處理筆數、警示來源。一列要能一眼看完,才看得出是從哪一輪開始壞的。
「警示來源」那一欄不能省。沙箱跑出來的列是「警示、四項全過、待人處理 0」,讀的人看不出警示哪來。查過不是缺陷:四項來源都讀得到,是讀到的內容有警示。所以每一處把判定改成警示的地方,一律改走同一支函式順手收下一句短理由,多個用頓號串,沒有就寫「無」,像「心跳過期」「版本查詢失敗」「重啟閘門未清」「上一輪逾時被接手」。最新一輪那一塊也補同一列,兩處同源。
還有一道防線是執行路徑自檢。用全新的 CLI 行程實測,代理人會把工具路徑解回外掛快取那一份,不是指定的工作樹那一份,讀到的還是舊語意——只在說明書裡寫明禁止是擋不住的。所以巡檢與排程兩支腳本開跑時先比對自己是不是從那一組不帶版本號的連結底下被叫起來的,不是就往標準錯誤印一行警告,點名實際路徑、應該用的路徑與理由。
刻意只警告、不中止:從工作樹直接跑腳本是開發時的正當用法,中止會把那條路擋掉。真正的阻擋本來就發生在權限閘門那裡。
測試結果
四道關卡各自在實機上驗證過,逐項如下。
--dry-run印出組好的條目與寫回後的內容,確認絕對路徑、環境快照與寫入確認旗標都在自動化測試:無。這幾項都是排程與外部服務的整合行為,靠實機跑一輪驗證。
驗證範圍要說清楚,避免看的人誤判:
已知風險
current那一組連結由另一支 CLI 的 deploy 維護,那一支還沒改,是後續的另一支 PR前置 Push Request