助理種入內建項時改讀委派清單的唯讀盤點指令欄 #20

Merged
admin merged 1 commits from feat/seed-reads-probe-column-for-readonly-commands into develop 2026-09-04 03:26:43 +00:00
Member

助理種入內建項時改讀委派清單的唯讀盤點指令欄

摘要

  • 需求描述:委派清單新增第十二欄 probe,記一支技能的唯讀盤點實際上跑哪一行指令。seed-tasks.sh 以前把所有非 invoke 的列一律推成只提醒,現在改成照 probe 走:填了指令的四列,動作欄換成代好代入點的那一行指令;寫著 pending 的七列照舊只提醒,但另外印出來,讓「入口還沒接上」跟「本來就只提醒」在回報上分得開。同時把兩個存放庫的合併順序拆開,誰先合併都跑得完。
  • 計畫名稱:無
  • 計畫頁:無
  • 分析頁:無

變更內容

檔案 為什麼改
tools/seed-tasks.sh 主要變更。讀進第十二欄 probe,依 way 與 probe 一起推動作欄;新增 resolve_root() 解根目錄、probe_action() 代入 {root} 並檢查代入點、is_invoke() 取代原本的 action_of();整份清單先數一次欄位數決定要不要套用這一欄;摘要多印 spec_cols=、root=、probe=、pending=、probe_bad= 五個值
skills/assistant/SKILL.md 新增一節說明 way 與 probe 怎麼推出動作欄、pending 為什麼只印不寫、合併順序為什麼不會壞;start 與 status 兩個操作的收尾回報加上 probe=、pending=、probe_bad= 三種列的寫法;結束碼 0 的處置補上新的計數
references/behaviors.md 關鍵步驟與收尾回報跟著同步:動作欄的來源改成 way 加第十二欄、漂移比對補上 action、摘要計數補上三個新值
.claude-plugin/plugin.json、.codex-plugin/plugin.json、plugin.json 三份 manifest 版號 0.1.9 升到 0.2.0

設計重點

  • invoke 的列連看都不看 probe。 那一路填了指令,整支技能的交出就退化成只跑一支腳本,該寫的頁一頁都不會寫,而且看起來完全正常。清單自己的檔頭也明寫 invoke 的列一律填減號,所以那是清單填錯,不是要順從的設定。這一支照 way 取技能名,另外印一行 probe_bad= 報出來,不因為那個錯就不種入。
  • probe 代不進去一律退回只提醒,並照樣種入。 不種入在 apply 那一路等於移除,上游一格填錯就會刪掉一筆帶著執行紀錄與失敗次數的內建項。退回只提醒的代價只是那一筆這一輪不動手,probe_bad= 那幾行指得出是哪一支、壞在哪。
  • 金錢符號與波浪號擋在種入這一刻。 那兩種寫法在無人值守那一輪解不出來,也進不了權限允許清單,會被靜靜擋掉。擋在種入這一刻,「錯的是清單」這件事才看得見。
  • {cli} 與 {repo} 留在值裡不展開。 種入的當下還不知道有哪幾支 CLI、掃得到哪幾個存放庫。種入時就展開成多筆的話,同一個反查鍵會有好幾個檔案,一致化整個垮掉,而且裝一支新 CLI、多 clone 一個存放庫就過期,重新展開要先移除再登錄,執行紀錄與失敗次數跟著歸零。所以留著代入點,改由往後接執行那一步的人代。配套是一條寫死的規則:動作欄裡出現大括號就是還沒代好,一律不得原樣拿去執行。現有三個讀取端都不執行動作欄,tasks.sh 只存放、due.sh 只判到期、狀態與監控頁只原樣印出來,所以這條規則防的是往後的人。
  • 兩個存放庫的合併順序誰先誰後都不會壞。 整份清單先數一次欄位數取最大值:十二欄以上照 probe 走,十一欄以下全部照舊、只印一行說明。不逐列印警告——三十五行同一個原因會把真的缺失蓋掉。取最大值而不是逐列各判,是為了讓十二欄清單裡漏填的那一列被抓出來,而不是被當成舊格式靜靜放過。上游那一欄合併進來的那一輪,四筆會印成 drift= 而不自動改值,那是預期的過渡,不是故障。
  • 第十三欄以後另接一個收尾變數。 少了它,上游哪天加一欄就會把多出來的值連著定位字元黏進 probe,代入點檢查全部過得了關,最後執行的是一行誰都沒寫過的指令。
  • 相依下限刻意沒有拉高。 理由就是上一點:清單那一欄晚一步到也照常跑得完,把下限拉到有那一欄的版本,等於逼兩個存放庫排合併順序,而排順序正是這一段程式碼要免掉的事。
  • 清單那四筆指令是逐項回存放庫核對出來的,不是照文件措辭填的。 其中一筆填的是 sdlc-gate.sh wp-report,不是文件上寫的 report:實測 report 在標準輸入是無盡流的情況下會無限卡住(逾時碼 124),而 wp-report 回 0,因為那支腳本有一份明確的「不讀標準輸入」子命令清單。照文件措辭填的話,種出來的內建項會在無人值守的巡檢裡永遠卡住,沒有錯誤也沒有輸出。那一欄的值屬於清單那一邊的變更,在這裡提一句,是要說明為什麼這一欄不能想當然爾地填。

測試結果

全程用隔離的根目錄與家目錄,正式的助理目錄沒有被動到。

  • 十二欄清單:want=16 added=16 held=3 bad=0 probe=4 pending=7 probe_bad=0,結束碼 0。第二次 apply 是 added=0 kept=16 drift=0,冪等。
  • 十一欄清單(把第十二欄砍掉):spec_cols=11、probe=0 pending=0 probe_bad=0,十六筆的動作與這次改動前逐字相同,另印一行說明整份沒有那一欄。
  • 十三欄清單(末尾多塞一欄):spec_cols=13,四筆指令一字不多,收尾變數確實把多出來的值擋住了。
  • 十一欄先種好再換成十二欄清單:四筆各印一行 drift= 顯示只提醒要換成指令,一筆都沒改。
  • 存放與讀回:帶環境變數前綴的那一筆 action=JSC_READONLY=1 …/wire-cli.sh status {cli} 寫進待辦檔再讀回來一字不差,只在第一個等號斷開這條約定撐得住。due.sh scan 也讀得回同一個值、判得出到期。
  • 不帶 --root 時,從清單自己的位置往上推三層也解得出根目錄。
  • lint-scripts.sh、check-behaviors.sh、ste100-lint.sh 三支都回結束碼 0。

真機上目前四筆只成立兩筆,而且它報得出來

拿這台機器正式的連結根目錄跑 plan(唯讀,什麼都沒寫),得到 probe=2 pending=7 probe_bad=2:

probe_bad=jsc-log:worklog    這台機器的 …/current 底下找不到 jsc-log
probe_bad=jsc-pkg:pkg-update 這台機器的 …/current 底下找不到 jsc-pkg

根因不在這一批:連結農場目前只有五條,機器上卻裝了十一個 domain。刷新連結那一段照這一輪指名的 domain 走,沒被指名的就沒有連結,所以只部署過的那五個有、其餘六個沒有。補法是把缺的那幾個 domain 也跑一次部署,乾跑確認六條全建得起來、相依全過。

這一段特地寫進來,是因為它正好示範了退回只提醒那個決定的價值。 舊行為下這兩筆本來就是只提醒,看不出任何異狀;現在同樣是只提醒,但多了兩行指名道姓的 probe_bad=,說得出是哪一支、少了什麼。差別不在做了什麼,在於說不說得出來。

前置 Push Request

  • 無
# 助理種入內建項時改讀委派清單的唯讀盤點指令欄 ## 摘要 - 需求描述:委派清單新增第十二欄 `probe`,記一支技能的唯讀盤點實際上跑哪一行指令。`seed-tasks.sh` 以前把所有非 `invoke` 的列一律推成只提醒,現在改成照 `probe` 走:填了指令的四列,動作欄換成代好代入點的那一行指令;寫著 `pending` 的七列照舊只提醒,但另外印出來,讓「入口還沒接上」跟「本來就只提醒」在回報上分得開。同時把兩個存放庫的合併順序拆開,誰先合併都跑得完。 - 計畫名稱:無 - 計畫頁:無 - 分析頁:無 ## 變更內容 | 檔案 | 為什麼改 | | --- | --- | | `tools/seed-tasks.sh` | 主要變更。讀進第十二欄 `probe`,依 `way` 與 `probe` 一起推動作欄;新增 `resolve_root()` 解根目錄、`probe_action()` 代入 `{root}` 並檢查代入點、`is_invoke()` 取代原本的 `action_of()`;整份清單先數一次欄位數決定要不要套用這一欄;摘要多印 `spec_cols=`、`root=`、`probe=`、`pending=`、`probe_bad=` 五個值 | | `skills/assistant/SKILL.md` | 新增一節說明 `way` 與 `probe` 怎麼推出動作欄、`pending` 為什麼只印不寫、合併順序為什麼不會壞;`start` 與 `status` 兩個操作的收尾回報加上 `probe=`、`pending=`、`probe_bad=` 三種列的寫法;結束碼 0 的處置補上新的計數 | | `references/behaviors.md` | 關鍵步驟與收尾回報跟著同步:動作欄的來源改成 `way` 加第十二欄、漂移比對補上 `action`、摘要計數補上三個新值 | | `.claude-plugin/plugin.json`、`.codex-plugin/plugin.json`、`plugin.json` | 三份 manifest 版號 0.1.9 升到 0.2.0 | ## 設計重點 - **`invoke` 的列連看都不看 `probe`。** 那一路填了指令,整支技能的交出就退化成只跑一支腳本,該寫的頁一頁都不會寫,而且看起來完全正常。清單自己的檔頭也明寫 `invoke` 的列一律填減號,所以那是清單填錯,不是要順從的設定。這一支照 `way` 取技能名,另外印一行 `probe_bad=` 報出來,不因為那個錯就不種入。 - **`probe` 代不進去一律退回只提醒,並照樣種入。** 不種入在 `apply` 那一路等於移除,上游一格填錯就會刪掉一筆帶著執行紀錄與失敗次數的內建項。退回只提醒的代價只是那一筆這一輪不動手,`probe_bad=` 那幾行指得出是哪一支、壞在哪。 - **金錢符號與波浪號擋在種入這一刻。** 那兩種寫法在無人值守那一輪解不出來,也進不了權限允許清單,會被靜靜擋掉。擋在種入這一刻,「錯的是清單」這件事才看得見。 - **`{cli}` 與 `{repo}` 留在值裡不展開。** 種入的當下還不知道有哪幾支 CLI、掃得到哪幾個存放庫。種入時就展開成多筆的話,同一個反查鍵會有好幾個檔案,一致化整個垮掉,而且裝一支新 CLI、多 clone 一個存放庫就過期,重新展開要先移除再登錄,執行紀錄與失敗次數跟著歸零。所以留著代入點,改由往後接執行那一步的人代。配套是一條寫死的規則:動作欄裡出現大括號就是還沒代好,一律不得原樣拿去執行。現有三個讀取端都不執行動作欄,`tasks.sh` 只存放、`due.sh` 只判到期、狀態與監控頁只原樣印出來,所以這條規則防的是往後的人。 - **兩個存放庫的合併順序誰先誰後都不會壞。** 整份清單先數一次欄位數取最大值:十二欄以上照 `probe` 走,十一欄以下全部照舊、只印一行說明。不逐列印警告——三十五行同一個原因會把真的缺失蓋掉。取最大值而不是逐列各判,是為了讓十二欄清單裡漏填的那一列被抓出來,而不是被當成舊格式靜靜放過。上游那一欄合併進來的那一輪,四筆會印成 `drift=` 而不自動改值,那是預期的過渡,不是故障。 - **第十三欄以後另接一個收尾變數。** 少了它,上游哪天加一欄就會把多出來的值連著定位字元黏進 `probe`,代入點檢查全部過得了關,最後執行的是一行誰都沒寫過的指令。 - **相依下限刻意沒有拉高。** 理由就是上一點:清單那一欄晚一步到也照常跑得完,把下限拉到有那一欄的版本,等於逼兩個存放庫排合併順序,而排順序正是這一段程式碼要免掉的事。 - **清單那四筆指令是逐項回存放庫核對出來的,不是照文件措辭填的。** 其中一筆填的是 `sdlc-gate.sh wp-report`,不是文件上寫的 `report`:實測 `report` 在標準輸入是無盡流的情況下會無限卡住(逾時碼 124),而 `wp-report` 回 0,因為那支腳本有一份明確的「不讀標準輸入」子命令清單。照文件措辭填的話,種出來的內建項會在無人值守的巡檢裡永遠卡住,沒有錯誤也沒有輸出。那一欄的值屬於清單那一邊的變更,在這裡提一句,是要說明為什麼這一欄不能想當然爾地填。 ## 測試結果 全程用隔離的根目錄與家目錄,正式的助理目錄沒有被動到。 - 十二欄清單:`want=16 added=16 held=3 bad=0 probe=4 pending=7 probe_bad=0`,結束碼 0。第二次 `apply` 是 `added=0 kept=16 drift=0`,冪等。 - 十一欄清單(把第十二欄砍掉):`spec_cols=11`、`probe=0 pending=0 probe_bad=0`,十六筆的動作與這次改動前逐字相同,另印一行說明整份沒有那一欄。 - 十三欄清單(末尾多塞一欄):`spec_cols=13`,四筆指令一字不多,收尾變數確實把多出來的值擋住了。 - 十一欄先種好再換成十二欄清單:四筆各印一行 `drift=` 顯示只提醒要換成指令,一筆都沒改。 - 存放與讀回:帶環境變數前綴的那一筆 `action=JSC_READONLY=1 …/wire-cli.sh status {cli}` 寫進待辦檔再讀回來一字不差,只在第一個等號斷開這條約定撐得住。`due.sh scan` 也讀得回同一個值、判得出到期。 - 不帶 `--root` 時,從清單自己的位置往上推三層也解得出根目錄。 - `lint-scripts.sh`、`check-behaviors.sh`、`ste100-lint.sh` 三支都回結束碼 0。 ## 真機上目前四筆只成立兩筆,而且它報得出來 拿這台機器正式的連結根目錄跑 `plan`(唯讀,什麼都沒寫),得到 `probe=2 pending=7 probe_bad=2`: ``` probe_bad=jsc-log:worklog 這台機器的 …/current 底下找不到 jsc-log probe_bad=jsc-pkg:pkg-update 這台機器的 …/current 底下找不到 jsc-pkg ``` 根因不在這一批:連結農場目前只有五條,機器上卻裝了十一個 domain。刷新連結那一段照這一輪指名的 domain 走,沒被指名的就沒有連結,所以只部署過的那五個有、其餘六個沒有。補法是把缺的那幾個 domain 也跑一次部署,乾跑確認六條全建得起來、相依全過。 **這一段特地寫進來,是因為它正好示範了退回只提醒那個決定的價值。** 舊行為下這兩筆本來就是只提醒,看不出任何異狀;現在同樣是只提醒,但多了兩行指名道姓的 `probe_bad=`,說得出是哪一支、少了什麼。差別不在做了什麼,在於說不說得出來。 ## 前置 Push Request - 無
jiantw83 added 1 commit 2026-09-04 02:21:32 +00:00
委派清單補上第十二欄 probe 之後,這一支不再把所有非 invoke 的列一律推成
只提醒:填了指令的四列改成把那一行指令代好代入點寫進動作欄,寫著
pending 的七列照舊只提醒但另外印出來,讓「入口還沒接上」跟「本來就只提醒」
在回報上分得開。

三個判斷刻意寫死:

一、way 含 invoke 的列連看都不看 probe。填了指令會讓整支技能的交出變成
只跑一支腳本,那支技能該寫的頁一頁都不會寫,而且看起來完全正常。

二、probe 代不進去一律退回只提醒並照樣種入。不種入在 apply 那一路等於
移除,於是上游一格填錯就會刪掉一筆帶著 last_run 與 fail_count 的內建項。
金錢符號與波浪號擋在種入這一刻,那兩種寫法在無人值守那一輪解不出來、
也進不了允許清單,會被靜靜擋掉。

三、{cli} 與 {repo} 留在值裡不展開。種入的當下還不知道要代什麼,展開成
多筆會讓同一個 spec_key 有好幾個檔案,一致化整個垮掉。展開由執行那一步
負責,而動作欄裡出現大括號就是還沒代好,一律不得原樣拿去執行。

清單只有十一欄時整份先數一次欄位數,全部照舊推成只提醒、只印一行說明,
行為與加這一欄之前一模一樣。第十三欄以後另接一個收尾變數,免得上游哪天
加一欄就把多出來的值黏進 probe,代入點檢查全過得了關、最後執行的卻是
一行誰都沒寫過的指令。

相依下限刻意不動。清單那一欄晚一步到也照常跑得完,把下限拉到有那一欄的
版本等於逼兩個存放庫排合併順序,而排順序正是這一段程式碼要免掉的事。

三份 manifest 的版號從 0.1.9 升到 0.2.0。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
admin merged commit f1bc17ac97 into develop 2026-09-04 03:26:43 +00:00
admin deleted branch feat/seed-reads-probe-column-for-readonly-commands 2026-09-04 03:26:43 +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#20