fix/literal-paths-for-doctor-and-setup
develop
doctor
setup
skills/doctor/SKILL.md
skills/setup/SKILL.md
templates/check-contents.md
templates/check-page.md
references/behaviors.md
README.md
plugin.json
.claude-plugin/plugin.json
.codex-plugin/plugin.json
current
jsc-cli
degraded
fail
skip
lint-scripts.sh
check-behaviors.sh
ste100-lint.sh
待辦文件的 D-08 與 E-01 提議讓背景助理定期觸發 jsc-cli:doctor,理由是「doctor 本來就唯讀,只差沒人定期觸發」。
jsc-cli:doctor
那個理由踩在一個危險的簡化上。 唯讀跟能不能無人值守跑是兩回事。這次寫進 doctor 的自家路徑分支明確接受一次核准詢問,因為操作者在現場;一旦改由排程觸發,每一輪都會停在第一支自家腳本,而且是無聲的——正是背景助理先前心跳斷掉的同一種死法。
動工前要先解掉這一項:給體檢一條不帶版本、它可以信任的連結,或是為外掛快取路徑想一套允許規則策略。警語已經寫進待辦文件的那兩列底下。setup 不受影響,它本來就維持有人值守。
這兩支技能的腳本呼叫原本全是裸相對路徑,整份文件沒有任何路徑守則。相對路徑會對著操作者當下的工作目錄解,而那裡從來不是外掛根目錄,所以每一個呼叫點都是模型就地猜前綴的地方。部署技能原本三處相對路徑被補成帶變數路徑,就是同一個機制。 實際掃到的處數比預估多:體檢 18 處、修復 20 處。多出來的是兩類原本沒想到的——裸檔名的 Gitea 呼叫,以及被當成參數傳的資料檔。後者同樣會解錯地方,而且解錯了不會報錯。 兩支各補路徑守則與前置步驟,解出兩條根目錄:跨外掛走 current 那一層(解到那一層就停,再往下解會落到帶版本號的快取路徑,那種路徑進不了允許清單),技能自己的腳本與範本走 CLI 載入技能時講明的外掛基底目錄。 兩支都不靠 current 底下那條 jsc-cli 連結,但理由各自不同,不是照抄部署那一支的。體檢不能靠,因為它正是機器可疑時才跑的技能——觸發時機本身就是連結可能出錯的那幾個時刻,而連結指著舊版時拿到的是舊的掃描腳本與舊的規格表,掃出來的每一列都像真的發現,不會有任何錯誤訊息。修復更不能靠,因為它寫檔,而且它要修的其中一列正是那個決定連結位置的變數:那種機器上根目錄根本解不出來,而修它要用的腳本掛在外掛基底目錄底下、不依賴那個變數,所以解不出來既不停這一輪也不擋那一項修復。何況拿舊的寫入腳本改設定檔,再用同一份舊腳本重驗,兩邊當然對得上,整輪會報成已修。 失敗分支也與部署不同。部署解不出根目錄就停手;這兩支都不停——體檢把它記成一項發現然後跑完不需要跨外掛的檢查,因為唯讀體檢中途停掉操作者什麼都拿不到;修復把它當成待修的那一項,修好再重解一次。 兩份範本與說明文件一併改。範本是這兩支技能在同一輪一起讀的,而且指示寫入,留著裸路徑等於留一個繞過新規則的入口。範本裡另外補掉兩個路徑洞:指向範本自己的佔位符原本沒有路徑,以及一個連目錄都沒有的裸檔名。 行為契約四列跟著改,並補上可稽核的跡象:回報裡的腳本路徑全是字面絕對路徑,跨外掛的路徑中間是 current 那一層而不是帶版本號的快取路徑。
兩支技能的路徑守則要靠版號才傳得到機器端。 三份 manifest 由 sync-skill-manifest.sh 同步,只動版本欄位。
No dependencies set.
The note is not visible to the blocked user.
摘要
doctor與setup的腳本呼叫原本全是裸相對路徑,整份文件沒有任何路徑守則。相對路徑會對著操作者當下的工作目錄解,而那裡從來不是外掛根目錄,所以每一個呼叫點都是模型就地猜前綴的地方。兩支各補路徑守則與根目錄取得方式,範本與說明文件一併跟上。變更內容
skills/doctor/SKILL.mdskills/setup/SKILL.mdtemplates/check-contents.mdtemplates/check-page.mdreferences/behaviors.mdREADME.mdplugin.json、.claude-plugin/plugin.json、.codex-plugin/plugin.json設計重點
current底下那條jsc-cli連結,但理由各自不同。 部署那一支的理由是「第一次建起那條連結的正是這一輪」,那個理由不適用於這兩支,所以各自找了自己的:degraded,代表刷新連結那幾行回了fail或skip,而接下來就輪到體檢。連結指著舊版時拿到的是舊的掃描腳本與舊的規格表,掃出來的每一列都像真的發現,不會有任何錯誤訊息。體檢若能靜靜地錯,就比沒有體檢更糟,因為沒有人會懷疑它。README.md的兩處在自動同步區塊內,但同步工具會保留既有小節原文,所以這次的改動不會被下次同步洗掉。這一點在改之前確認過。測試結果
lint-scripts.sh、check-behaviors.sh、ste100-lint.sh對這個存放庫都回結束碼 0。ste100-lint.sh抓到兩處半形逗號緊接中文詞,已改寫成不讓中文字後面接 ASCII 標點。給審閱者的一則提醒
待辦文件的 D-08 與 E-01 提議讓背景助理定期觸發
jsc-cli:doctor,理由是「doctor 本來就唯讀,只差沒人定期觸發」。那個理由踩在一個危險的簡化上。 唯讀跟能不能無人值守跑是兩回事。這次寫進
doctor的自家路徑分支明確接受一次核准詢問,因為操作者在現場;一旦改由排程觸發,每一輪都會停在第一支自家腳本,而且是無聲的——正是背景助理先前心跳斷掉的同一種死法。動工前要先解掉這一項:給體檢一條不帶版本、它可以信任的連結,或是為外掛快取路徑想一套允許規則策略。警語已經寫進待辦文件的那兩列底下。
setup不受影響,它本來就維持有人值守。前置 Push Request