 jiantw83andClaude Opus 5
|
c76e8489a6
|
fix(schedule): 排程條目不再寫死工作階段代號,CLI 判定跟上共用函式
兩個坑,都在同一支腳本,都讓無人值守那一輪看起來正常卻不正常。
一、條目寫死了工作階段代號。那一輪的兩半因此落在不同的值上:start 由 hook
寫,它從 hook 的標準輸入 JSON 讀得到 CLI 真正的代號;end 由工具腳本寫,沒有
那份 JSON,只能讀環境變數,於是讀到寫死的那個字串。配對的判準是工作階段
代號加技能名,兩半的代號不同就永遠配不起來。
這台機器上實測累積了 91 筆假的「只有 start 沒有 end」,其中 90 筆是同一支
每輪都會被叫用的技能。逐個工作階段數下來:92 個是一個 start 零個 end,另有
一個工作階段收著 29 個 end 卻一個 start 都沒有——那一個就是寫死的代號。
代價不只是數字難看。那一節存在的理由正是「只有 start 沒有 end 是一支技能
中止的唯一證據」,而這批假訊號只增不減,遲早把真的中止蓋掉。不設這個變數,
兩半就都落在 CLI 自己給的代號上,實測驗過確實配得起來。
二、CLI 判定抄了一份較窄的。共用函式認三個環境標記,這一份只認第一個,而
工具腳本被叫用時那一個不會設。於是每一次不帶 --cli 的安裝都回用法錯誤——
技能本文的啟動步驟叫的正是不帶 --cli 那一種,這台機器上一定裝不起來。同一個
判斷寫兩份就是這樣漂走的:共用函式後來補了兩個標記,這一份沒跟上,而漂移
的代價是一個看起來像「這台機器沒裝 CLI」的錯誤。
殘留的那 91 筆不必手動清,那一支本來就會把開超過一天的丟掉,一天內收斂。
三份 manifest 版號 0.2.1 升到 0.2.2。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-09-04 12:29:20 +08:00 |
|
 jiantw83andClaude Opus 5
|
85a0ce9e10
|
fix(assistant): 人在現場那一路的根目錄解析帶上文件記載的預設值
技能本文寫著那一行「涵蓋了文件記載的 ~/.jsc 退讓」,實際上沒有。JSC_HOME
沒設時 $JSC_HOME/current 展開成 /current,不是退讓到任何地方——殼並不知道
那個變數的文件預設值是什麼。解析式現在自己帶預設,退讓才真的發生。
這台機器從頭到尾沒設過那個變數,所以每一次人在現場叫用都停在第 0 步,而且
守衛開的藥方指向不相干的地方:它說根目錄不見了、叫人跑部署,但根目錄好好
的,壞的是解析式自己。排程那一路不受影響,條目自己帶著變數值。
目錄檢查留著,理由改寫進本文:解析式交出一條看起來合理卻不存在的路徑,
不是只有變數沒設一種成因——變數指到已經刪掉的目錄、精簡環境裡連家目錄都
沒設、連結農場根本還沒部署,三種都一樣過得了前三道關。
行為清單那一份早就寫對了,是技能本文漂走。這一次把兩份對齊,並把事故記述
改成過去式,免得下一輪有人照著它重寫回錯的形狀。
實測表第四列不動:那是量到的結果,而且新寫法一樣帶變數、無人值守一樣被擋,
另外加一段講明預設值改的是解析出哪條路徑,不是誰可以跑它。
三份 manifest 版號 0.2.0 升到 0.2.1。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-09-04 11:53:10 +08:00 |
|
 jiantw83andClaude Opus 5
|
28f453176e
|
feat(seed): 種入內建項時改讀委派清單的唯讀盤點指令欄
委派清單補上第十二欄 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>
|
2026-09-04 10:16:13 +08:00 |
|
jiantw83
|
a168c5904c
|
feat(seed): 依委派清單種入與重建助理的內建定期檢查項
待辦簿做好了但是空的,也沒有東西會去填它。內建的定期檢查項該排哪些、什麼時候排、多久一次,這些資料就在委派清單裡——每一支非不交的技能都有時間點與週期兩欄。這一輪把清單接成待辦簿的資料來源。
反查靠新增的一個欄位,它非有不可。清單移除一支之後要刪掉對應那筆,但待辦簿的識別碼是建立時間加標題的雜湊,跟技能名無關。拿標題當鍵等於把措辭變成介面,改一個字舊那筆就再也認不出來,於是每次重建都刪不掉舊的又加一筆新的,同一個檢查每輪做兩次。拿動作當鍵,提醒類那十一筆全是同一個字、一支都分不出來,而觸發類那幾筆會撞上使用者自己交辦、動作剛好是同一支技能的那一筆——撞上就是把使用者交辦的事當成內建項刪掉。所以另立一欄記那一筆對應哪一支技能。
因為要加欄位,寫入端只能改存放那一支——它是唯一寫得出待辦檔的入口,這一輪沒有自己寫檔。連帶補上移除那個操作:規格要求不留孤兒,而原本六個操作一個都刪不掉。它對使用者交辦的那幾筆一律擋下、除非人親自帶強制旗標,而種入這一支一次都不帶。擋在單一寫入者這裡最省,那條規定寫在呼叫端的話,呼叫端每多一個就要各自再實作一次。
交出方式與動作是兩套詞彙,對映是這一輪的重點。含觸發就取技能名,其餘一律取提醒。觸發的定義就是呼叫既有技能、內容照那支技能自己的流程走,所以填技能名等於照判定結果做。巡檢與提醒那兩種沒有獨立入口——沒有任何腳本或技能名代表得了某一支技能的唯讀切片——這時候填技能名,助理下一輪就會把整支技能一路跑完,那正是切片交要防的事。所以填提醒:照時程提醒、指出入口,不動手。實測十六筆裡五筆是技能名、十一筆是提醒。
條件式交的三支一律不種入,但逐支吵出來。條件本身是散文,清單裡沒有機器讀得懂的條件欄位,所以條件成立了沒有現在只有人答得出來。種進去的代價有現成例子:其中一支的條件明寫要等它自家路徑不再帶版本號,而那個條件現在不成立,種進去助理每輪都會叫它、每輪停在第一支自家腳本,沒有錯誤、沒有輸出、心跳照寫,看起來完全正常。一個會無聲卡死的項目比一個缺掉的項目難查得多。不種入的代價是看不出為什麼少了它,用逐支印一行保留原因補掉。人確認過某一支條件成立就一支一支帶旗標放行,不給全部放行的旗標,那等於用一個決定蓋掉三個不同的條件。
種入與重建是同一段程式,啟動時每次都跑。不記跑過沒有,也沒有第一次旗標,要不要動手完全由現況決定。分成兩段的話,兩段各自回答該有哪幾筆這同一個問題,等其中一段改了判準就會一邊加一邊刪同一筆,每輪反覆。啟動時跑實際套用、查現況時跑唯讀預覽,巡檢那一輪兩個都不跑——無人值守那一輪移除一筆會把那一筆的執行紀錄與失敗次數一起弄丟,而清單同步到一半就會刪錯,破壞性清理留給人。
清單讀不到的三種情況一筆都不移除。讀不到時,清單上沒有與這台機器沒裝那個外掛分不出來,照字面跑會把所有內建項一次刪光,而且結束碼看起來完全成功。
清單上還在、還可交,只是時間點或週期換了值的那種情況,規格三條規則一條都沒講到。處置是預設只報差異不改:存放那一支刻意沒有編輯操作,改值只能移除再重登,那會換識別碼、把執行紀錄與失敗次數歸零,一個已經連續失敗五次的項目會看起來像全新的。人要換就帶旗標。
跨外掛相依宣告到清單所在的那個外掛,版本下限取現行的發行版——那是清單與它的欄位說明都已經在上面的版本。寫更低的下限會讓一台裝著舊版、清單還不存在或欄位不同的機器通過相依檢查,然後在讀清單那一步才失敗。清單路徑照今天剛改的規則走,由叫用時餵進來的根目錄組成,那一支自己不解。
三份 manifest 的版號一併從 0.1.8 升到 0.1.9,並在相依欄加上清單所在的那個外掛。這一次沒有把版號分成獨立一筆:相依宣告與版號是同一個決定的兩半,宣告了新相依卻不升版,安裝端不會知道要重新檢查相依。
|
2026-09-03 19:05:07 +08:00 |
|
jiantw83
|
1d220bf03f
|
chore(manifest): 三份 manifest 升版至 0.1.8
事件偵測與到期判定要靠版號才傳得到機器端。
三份 manifest 由 sync-skill-manifest.sh 同步,只動版本欄位。
|
2026-09-03 16:37:44 +08:00 |
|
jiantw83
|
e7edfcbec0
|
chore(manifest): 三份 manifest 升版至 0.1.7
待辦簿工具要靠版號才傳得到機器端。
三份 manifest 由 sync-skill-manifest.sh 同步,只動版本欄位。
|
2026-09-03 15:46:09 +08:00 |
|
jiantw83
|
e4a3d3ae12
|
chore(manifest): 三份 manifest 升版至 0.1.6
三份 manifest 的版本從 0.1.5 升到 0.1.6,由 sync-skill-manifest.sh 同步。
助理技能的路徑守則與排程條目的內容都改過,安裝端要靠版號才認得出該更新,不升版的話舊條目會一直留在機器上。
版號與主變更分開成一筆,是因為這三個檔案只帶版號、不帶行為,混進主變更會讓那一筆的 diff 夾雜非行為變更;分開之後回溯哪一版對應哪一次變更也看得清楚。
|
2026-09-03 10:10:02 +08:00 |
|
jiantw83
|
8053c15425
|
chore(manifest): 三份 manifest 升版至 0.1.5
三份外掛清單的版號一起往上推一版。
目錄頁的版面與巡檢輸出檔名都變了,呼叫端要靠版號才判得出手上這一份是新的
還是舊的。版號不動,版本閘門就不會提示更新,機器上會留著舊版工具去讀新版
範本。
三份清單各自被不同的 CLI 讀,值必須一致,所以一起改、一起提交。
範圍是外掛清單的版號宣告。
|
2026-09-02 17:21:23 +08:00 |
|
jiantw83
|
ed624e0743
|
chore(plugin 版本): 三份 manifest 升版至 0.1.4
|
2026-09-02 16:01:13 +08:00 |
|
jiantw83
|
f2d30925f6
|
chore(plugin 版本): 三份 manifest 升版至 0.1.3
|
2026-09-02 14:27:18 +08:00 |
|
jiantw83
|
4bf99dde76
|
feat(wiki): 監控目錄頁改走專用存取庫,比對鍵改用裸 HASH
What:MONITOR_CONTENTS 改由 wiki-repo CONTENTS 解析並透過 wiki-contents.sh
upsert 寫入,MONITOR_{HASH} 仍走 wiki-repo MONITOR。目錄頁新增一欄裸 HASH 當
比對鍵,第一欄的絕對網址連結留給人看。主機名一律取短名。
Why:目錄頁集中之後兩頁不再同庫,[[...]] 只在同一個 wiki 內解析,連結必須改絕對
網址。比對鍵原本是含網址的儲存格,換主機、換存取庫或 URL 編碼有差就比對不到,
巡檢每 15 分鐘寫一次,重複列會累積得很快。
How:目錄頁解不出存取庫時不再中止巡檢——那一頁只是索引,內容頁寫成就照樣寫心跳。
內容頁寫不成仍然中止且不寫心跳,自咬環的前提沒有鬆動。
Who:jsc-assist
|
2026-09-02 11:01:51 +08:00 |
|
jiantw83
|
2af9dda7a6
|
chore(manifest): 三份外掛清單升到 0.1.1
三份外掛清單的版本從 0.1.0 改成 0.1.1。
這一輪改了排程條目的組法、監控頁的格式與技能的工具路徑,三件都會影響
已經裝在機器上的那一份。版本不動,版本閘門就看不出哪台機器裝的是舊的
那一版,也提不出重啟要求,舊條目會繼續空轉到有人自己發現。
三份檔案只動 version 一欄,其餘不碰,三份保持同一個號碼,這樣不管從哪
一支 CLI 讀到的都是同一個答案。功能範圍是外掛的版本宣告。
|
2026-09-01 18:28:04 +08:00 |
|
jiantw83
|
fbf3e5a605
|
feat(assistant): 助理主體收攏 start、status、stop 三個操作
What:
- 新增 assistant 技能,提供啟動、查現況、停止三個操作。
- 刪掉原本獨立的 status 技能,行為清單與 README 的技能目錄一起改。
- 三份 manifest 的版本一起提升,對 jsc-hooks 的下限提到含心跳腳本的那一版。
Why:
- 助理的生命週期是一件事,拆在兩支技能裡,靠描述自動觸發的 CLI 等於擲骰子挑一支。準則也明寫技能目標不得重複。
- 刪除的代價這時候最低:這個 domain 才剛落地,status 是它唯一一支技能,除了自己的文件沒有別的東西指向它。晚一步等各處都引用了再收攏,成本差很多。
How:
- 心跳的判定一律交給 jsc-hooks 的心跳腳本,三個操作都讀它的回報,不自己解析心跳檔。判定有兩份就會漂移,狀態與訊息就會對不上。
- 那支腳本的每一個結束碼都在技能裡有明確處置,包含「腳本自己沒跑起來」那一種——那時候既不能說助理在跑,也不能說助理停了。
- 時間戳壞掉一律當成不新鮮,絕不退回判成新鮮。
- 異常結束不需要額外的清理機制:心跳是時間戳,過了門檻自動失效。反過來說,stop 以外的任何路徑都不該寫心跳,否則就是留一個假心跳。
- stop 清心跳是它的職責,不算助理界線裡「不刪狀態檔」那一條。技能內文把這個例外寫明白,免得日後照界線把 stop 砍掉。
- stop 的收尾同時講兩件事:心跳清掉之後閘門會擋下技能呼叫,以及閘門目前還沒接線所以這一刻擋不到誰。前者是設計後果,停助理的人一定要知道;後者不講就是說一件還沒成真的事。
- 排程這一輪不做,start 只寫第一次心跳,並講明心跳不會自動更新。
Who:
助理落地的第二塊:心跳有了,接著要有人寫它、讀它、清它。
|
2026-09-01 14:19:24 +08:00 |
|
jiantw83
|
e7e9b8ce18
|
feat(templates): 新增監控頁的目錄頁與內容頁範本
What:
- 新增 templates/monitor-contents.md 與 templates/monitor-page.md。
- README 的「參考與工具」表補上這兩份範本,說明欄寫出兩者相反的寫入語意。
- 三份 manifest 的版本一起提升。
Why:
- 監控頁是助理巡檢結果的落點。沒有範本,每次巡檢寫出來的格式都不一樣,累積久了看不出趨勢,也對不起來。
- 兩份範本的寫入語意剛好相反,必須各自寫明白。目錄頁是共用的,一列代表一台機器,整頁覆蓋會刪掉別台機器的紀錄;內容頁只屬於一台機器,記的是歷次巡檢的軌跡,所以附加不覆寫。
How:
- 目錄頁範本帶欄位說明與寫入規則:比對主機與帳號兩欄,只更新自己那一列,讀不到舊內容就中止,不硬寫。
- 內容頁範本一次巡檢附加一節,節標題帶時間戳,涵蓋心跳與閘門、使用統計、hook 錯誤、版本落差、階段鎖與工作包鎖、待辦簿到期與逾期六類結果。
- 連續失敗的項目一定要標「已連續失敗 N 次」。待辦簿的項目失敗不會自動暫停,會每輪重試,不標出來就是一個壞掉的項目一直重試而沒人知道。
- 內容以圖表優先,流程用 mermaid、結果用表格,純文字每節最多三句。
Who:
技能助理落地帶出來的頁型別需求,四個存放庫同一批改。
|
2026-09-01 12:11:26 +08:00 |
|
jiantw83
|
6e18a373f3
|
feat(assist): 樣板改成 jsc-assist domain,加上 status 技能
What:
- 三份 manifest 的 name 由 jsc-template 改成 jsc-assist,version 設為 0.0.1,description 改寫成助理的定位,並加上 jsc.requires 宣告對 jsc-cli、jsc-gitea、jsc-hooks、jsc-log 的最低版本。
- README.md 與 AGENTS.md 依 meta domain 的格式重寫,AGENTS.md 多一節「助理的界線」。
- 刪掉樣板的 hello 技能,新增 status 技能與 references/behaviors.md 行為清單。
Why:
- 這個存取庫原本整份是 template 的樣板,四份 manifest 都還叫 jsc-template。名字沒改,marketplace 認不出它是獨立的 domain,各 CLI 也裝不上。
- 助理的閘門、心跳與巡檢要有落點,前提是存取庫先認得出自己。
- 樣板的 hello 技能只是安裝驗證用,留著會讓助理的技能清單從第一天就帶著一支沒有用途的技能。換成唯讀的 status,行為檢查與 frontmatter 檢查也才有掃描對象。
How:
- status 全程唯讀:讀心跳檔判斷助理在不在跑,判準只看時間戳距現在是否不到 300 秒,不看 pid 存活——五支 CLI 與容器裡的行程互相看不到彼此的 pid。
- 心跳檔不存在時印「助理未運行」,這是正常結果,不以非 0 結束。
- 這支不新增 tools/ 腳本。讀兩個路徑印一張表還不到抽腳本的門檻,助理主體落地時再一併評估。
- 三份 manifest 的 version 由 sync-skill-manifest.sh 同步,README 的技能目錄區塊一起更新。
Who:
助理 domain 落地的第一步,後續的閘門、心跳與排程都接在這個基礎上。
|
2026-09-01 11:20:52 +08:00 |
|
jiantw83
|
7790283920
|
Initial commit
|
2026-08-31 09:49:28 +00:00 |
|