排程條目把 PATH 一起快照進去,無人值守那一輪才偵測得到 CLI #30

Merged
admin merged 1 commits from fix/schedule-snapshots-path into develop 2026-09-04 06:54:41 +00:00
Member

摘要

  • 需求描述:助理第一次在無人值守的輪次真的執行內建檢查項,結果印出 clis=0——帶 CLI 代入點的那幾筆全部代不出目標。根因是 cron 給的 PATH 只有 /usr/bin 與 /bin,而這台機器的 CLI 執行檔裝在家目錄底下。
  • 計畫名稱:無
  • 計畫頁:無
  • 分析頁:無

變更內容

檔案 為什麼改
tools/schedule.sh 快照清單補上 PATH,並寫明為什麼
references/behaviors.md 條目那一段記下這一個變數與它的理由
三份 manifest 版號 0.2.4 升到 0.2.5

這一類又出現一次

偵測 CLI 那一支在有人的 shell 裡回五支,在 cron 裡回零支,而且結束碼是 0。

它不是失敗,是成功地回報了「什麼都沒有」。輸出看起來像「這台機器沒裝 CLI」,實際上是 PATH 上找不到——兩件事在報告上長得一模一樣。

為什麼修在條目這一層

另一條路是讓偵測那一支自己去找常見安裝路徑。那要維護一份路徑清單,而清單會過期,過期的方式跟今天修掉的那幾個一模一樣:寫在文件或程式裡的一份靜態名單,環境變了沒有人會知道。

條目本來就快照十個環境變數。多這一個,等於把「這台機器的執行檔裝在哪」交給安裝當下的環境回答,不必任何人維護。

補一句界線:巡檢那一輪要跑的指令本身走的是字面絕對路徑、不靠 PATH;靠 PATH 的是那幾支腳本自己呼叫的外部程式。這一條補的是後者。

那一輪本身沒有壞

這件事是被正確擋下來的,不是釀成事故才發現的:

held=jsc-hooks:hooks-install  這台機器偵測不到任何一支 CLI(clis=0),{cli} 代不出目標

執行那一支的規則是「代不出目標不算失敗」,所以那一筆的執行紀錄與失敗次數一個字都沒動。要是當初寫成「代不出來就記失敗」,那個計數現在已經在往上爬,而且沒有人修得動——因為問題不在那一筆。

同一輪另一筆沒有代入點的內建項正常跑完、回 0、算出下次到期。機制是通的,缺的只是這一個變數。

測試結果

環境 偵測到幾支
條目會帶的那條 PATH,其餘環境清空 5 支(claude、codex、copilot、antigravity、kiro)
cron 預設的 PATH,其餘環境清空 0 支
  • 乾跑印出來的 env_snapshot= 第一個就是 PATH,其餘十個變數原樣保留。
  • lint-scripts.sh、check-behaviors.sh、ste100-lint.sh 三支都回結束碼 0。
  • 全程用乾跑,沒有動到正式的排程。

前置 Push Request

  • 無
## 摘要 - 需求描述:助理第一次在無人值守的輪次真的執行內建檢查項,結果印出 `clis=0`——帶 CLI 代入點的那幾筆全部代不出目標。根因是 cron 給的 `PATH` 只有 `/usr/bin` 與 `/bin`,而這台機器的 CLI 執行檔裝在家目錄底下。 - 計畫名稱:無 - 計畫頁:無 - 分析頁:無 ## 變更內容 | 檔案 | 為什麼改 | | --- | --- | | `tools/schedule.sh` | 快照清單補上 `PATH`,並寫明為什麼 | | `references/behaviors.md` | 條目那一段記下這一個變數與它的理由 | | 三份 manifest | 版號 0.2.4 升到 0.2.5 | ## 這一類又出現一次 偵測 CLI 那一支在有人的 shell 裡回五支,在 cron 裡回零支,**而且結束碼是 0**。 它不是失敗,是成功地回報了「什麼都沒有」。輸出看起來像「這台機器沒裝 CLI」,實際上是 `PATH` 上找不到——兩件事在報告上長得一模一樣。 ## 為什麼修在條目這一層 另一條路是讓偵測那一支自己去找常見安裝路徑。那要維護一份路徑清單,而**清單會過期,過期的方式跟今天修掉的那幾個一模一樣**:寫在文件或程式裡的一份靜態名單,環境變了沒有人會知道。 條目本來就快照十個環境變數。多這一個,等於把「這台機器的執行檔裝在哪」交給安裝當下的環境回答,不必任何人維護。 補一句界線:巡檢那一輪要跑的指令本身走的是字面絕對路徑、不靠 `PATH`;靠 `PATH` 的是那幾支腳本自己呼叫的外部程式。這一條補的是後者。 ## 那一輪本身沒有壞 這件事是被正確擋下來的,不是釀成事故才發現的: ``` held=jsc-hooks:hooks-install 這台機器偵測不到任何一支 CLI(clis=0),{cli} 代不出目標 ``` 執行那一支的規則是「代不出目標不算失敗」,所以那一筆的執行紀錄與失敗次數一個字都沒動。要是當初寫成「代不出來就記失敗」,那個計數現在已經在往上爬,**而且沒有人修得動——因為問題不在那一筆**。 同一輪另一筆沒有代入點的內建項正常跑完、回 0、算出下次到期。機制是通的,缺的只是這一個變數。 ## 測試結果 | 環境 | 偵測到幾支 | | --- | --- | | 條目會帶的那條 `PATH`,其餘環境清空 | **5 支**(`claude`、`codex`、`copilot`、`antigravity`、`kiro`) | | cron 預設的 `PATH`,其餘環境清空 | 0 支 | - 乾跑印出來的 `env_snapshot=` 第一個就是 `PATH`,其餘十個變數原樣保留。 - `lint-scripts.sh`、`check-behaviors.sh`、`ste100-lint.sh` 三支都回結束碼 0。 - 全程用乾跑,沒有動到正式的排程。 ## 前置 Push Request - 無
jiantw83 added 1 commit 2026-09-04 06:42:00 +00:00
cron 給的 PATH 只有 /usr/bin 與 /bin,而這台機器的 CLI 執行檔裝在家目錄底下。
於是無人值守那一輪偵測 CLI 一支都找不到——而且是回結束碼 0 加一份空清單,
不是失敗。看起來像「這台機器沒裝 CLI」,實際上是 PATH 上找不到。

實測踩到:那一輪印出 clis=0,帶 CLI 代入點的內建項全部代不出目標而被擋下,
同一支腳本在有人的 shell 裡回五支。

修在條目這一層,不是讓偵測那一支自己去猜安裝路徑:猜就要維護一份常見路徑
清單,而清單會過期,過期的方式跟今天修掉的那幾個一模一樣。條目本來就快照
十個環境變數,多這一個等於把「這台機器的執行檔裝在哪」交給安裝當下的環境
回答,不必任何人維護。

巡檢那一輪要跑的指令本身走的是字面絕對路徑、不靠 PATH;靠 PATH 的是那幾支
腳本自己呼叫的外部程式,所以這一條補的是後者。

實測:拿條目會帶的那條 PATH 在清空環境裡跑,五支 CLI 全解得出來;對照組用
cron 預設的 PATH,零支。

三份 manifest 版號 0.2.4 升到 0.2.5。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
admin merged commit 2c0718ee19 into develop 2026-09-04 06:54:41 +00:00
admin deleted branch fix/schedule-snapshots-path 2026-09-04 06:54:41 +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#30