Commit Graph
63 Commits
Author SHA1 Message Date
jiantw83 717a562cb7 refactor(patrol): 監控頁改成固定三塊
巡檢產出與監控頁範本改成固定三塊:本頁基本資料、最新一輪、近 24 輪摘要。

舊寫法是一輪附加一節。十五分鐘跑一輪,一天就疊出九十六節,那樣的頁沒
有人讀得完,也就沒有人會發現助理壞在哪一輪。軌跡留著卻沒人看,等於沒
有留。

基本資料建頁時寫一次就不動。最新一輪每輪整塊換掉,只留最新那一輪的完
整內容。摘要表一輪一列,最新的在最上面,超過 24 列就丟掉最舊的那一列,
一列只有四欄:巡檢時間、本輪判定、四項成敗、待人處理筆數,一眼看得出
是從哪一輪開始壞的。collect 的輸出鍵位跟著換,section_file 不再產出,
改印 latest_file、summary_file 與 summary_row_file,另外多印本輪待人處
理的筆數。範本連帶把流程圖與寫入規則改成先讀回舊頁、再三塊重組整頁寫
回,並寫明舊格式的頁第一次重組要怎麼收。

順手把腳本內部找別的 domain 工具的順序改成 current 連結優先,理由跟排
程那支一樣:技能與權限規則都以 current 為準,腳本自己去挑另一個版本就
會跑到混版的工具,而那種不一致查起來沒有線索。功能範圍是一輪巡檢的收
攏與監控頁產出。
2026-09-01 18:28:04 +08:00
jiantw83 3b86674d1b fix(schedule): 讓排程那一輪自己帶齊環境與權限
排程條目改成自己帶齊執行環境,install 完也印出那一輪要開的權限規則。

背景助理在無人值守的輪次連續失敗,查出四道關卡。cron 給的 PATH 很短,
不含使用者的 bin 目錄,裸的指令名每一輪都是找不到執行檔。cron 也不讀
殼的設定檔,那一輪沒有 Gitea 主機位址與 wiki 存放庫變數,連不上 wiki。
寫入確認只認 tty,排程沒有 tty,寫監控頁一定被擋。工具權限沒開,巡檢
腳本連跑都跑不起來,而那一輪沒有人可以按同意。四關任何一關沒過,那一
輪就不寫心跳,排程裝著卻永遠空轉,外面只看得到心跳過期。

CLI 改用 command -v 解成絕對路徑再寫進條目,解不到就停下,不猜路徑。
install 當下把主機位址、金鑰、狀態根目錄、心跳門檻與所有已設定的 wiki
存放庫變數就地快照,以名稱等於值的前綴寫進條目,值裡的單引號照 POSIX
寫法跳脫。條目自帶寫入確認旗標,無人值守的那一輪本來就沒有人可以按同
意。install 完印出四支腳本各三種呼叫形式的 allow 規則,路徑一律取
current 那一組不帶版本的連結,並順手檢查連結在不在,不在只警告、不代
建。腳本內部找心跳腳本也改成 current 優先,避免同一輪跑到混版的工具。

條目裡帶著金鑰快照,所以印條目時一律把金鑰遮成星號,遮到下一個空白為
止;crontab 檔案要保持只有本人讀得到,這幾個變數改過就要重跑一次
install。功能範圍是助理的系統排程安裝、移除與查現況。
2026-09-01 18:28:04 +08:00
admin 0e5d93ccd9 Merge pull request '釋出助理主體、排程與一輪巡檢' (#5) from feat/assistant-body/main into develop
Reviewed-on: #5
2026-09-01 07:41:23 +00:00
admin 5a8766b2d6 Merge pull request 'feat/assistant-body/start-stop-status' (#4) from feat/assistant-body/start-stop-status into feat/assistant-body/main
Reviewed-on: #4
2026-09-01 07:24:29 +00:00
jiantw83 2b7176a644 feat(patrol): 一輪巡檢落地,心跳改由巡檢跑完才寫
What:
- 新增 tools/patrol.sh,三個子命令:collect 收集、finish 收尾、abort 中止。這一輪的巡檢項目是四項純讀取:使用統計、版本落差與重啟閘門、階段鎖與工作包鎖、心跳自述。
- 心跳的寫入從排程移到巡檢收尾。排程只呼叫巡檢,不再直接寫心跳。
- 排程週期由心跳門檻推導,不再寫死。install heartbeat 這個工作代號改為拒絕。

Why:
- 排程直接寫心跳的話,心跳新鮮只證明排程活著。巡檢整個壞掉、每輪都失敗,心跳照樣新鮮,閘門照樣放行,而且沒有任何錯誤訊息——這是無聲失效,是最難發現的一種。
- 改成巡檢寫,心跳新鮮才等於上一輪真的跑完了。閘門判的才是工作訊號,不是行程存活訊號。
- 門檻是讀取端的設定,心跳檔裡不存它。所以週期與門檻各寫死一個數字一定會撞:門檻五分鐘、巡檢十五分鐘,心跳永遠是過期的。

How:
- 週期取「滿足漏掉一輪還算新鮮、漏掉兩輪才過期」的最大值,並且要能整除一小時。要拉長巡檢週期就調大門檻,週期自動跟著長,兩個數字不會各走各的。
- 心跳只看「這一輪有沒有把結果記下來」,不看四項的成敗。四項有失敗但監控頁寫成了就寫心跳,頁上判定標警示;頁寫不成就中止,一定不寫,讓心跳自己過期。頁每輪都寫失敗卻照樣寫心跳,等於把這次要修掉的缺陷原封不動搬過去。
- 整輪拿一把目錄鎖,搶不到就讓開,不排隊也不並行。並行兩輪會在同一頁附兩節,還會互相蓋掉用量快照。鎖逾時可被下一輪搶走,被搶走的那一輪收尾時對不上就不寫心跳——它沒跑到底,不該蓋章。
- 任一項失敗不影響其餘項目。失敗要在監控頁上看得出來是失敗,不是沒資料;來源是空的則明寫「那是零次,不是故障」。
- 版本盤點照抄腳本原字。抄到查詢失敗就寫查詢失敗,不改寫成相符、也不自己補查遠端版本——查不到是沒有證據,不是版本沒問題。

Who:
助理落地的第四塊。排程那一輪留下的問題在這裡解掉了。
2026-09-01 15:06:10 +08:00
jiantw83 7343def16e feat(schedule): 助理的系統排程接線
What:
- 新增 tools/schedule.sh,三個子命令:install 安裝、remove 移除、status 查現況。兩筆工作分別是每分鐘的心跳與每十五分鐘的巡檢。
- 助理主體的 start 接上安裝、stop 接上移除,行為清單與 README 跟著更新。

Why:
- 心跳要有人定時寫,不然啟動之後過幾分鐘就自己過期,助理看起來像沒在跑。
- 排程這件事有標準的輸入與輸出,準則要求下放腳本,技能只描述何時呼叫。

How:
- 條目行尾帶固定標記,安裝先濾掉自己的舊條目再追加。絕不覆寫整份排程,別人的條目一行都不碰;寫完回讀驗證,出現兩筆或別人的行數對不上就報錯。
- 裝完檢查排程服務在不在跑。這台機器是 WSL,預設不啟動 cron,裝了條目卻一次都不會執行——不檢查就會宣稱一件沒發生的事。
- 條目一律帶 </dev/null。排程是非互動環境,任何等輸入的東西都會把整筆卡死。
- 輸出寫到 JSC_HOME 底下,不寫進任何專案目錄,免得多出未追蹤檔污染別人的變更盤點。
- 巡檢那一筆預設不裝,要明著指定才會裝。巡檢本體還沒實作,裝了只會每十五分鐘失敗一次;巡檢指令也不猜 CLI,判不出來就停下,猜錯的代價是每十五分鐘跑一支不存在的執行檔。
- stop 先移除排程再清心跳,順序不能反。反過來的話清完下一分鐘排程就補寫一次,stop 等於騙人。

Who:
助理落地的第三塊。這裡留下一個要在巡檢那一輪解掉的問題:心跳目前由排程直接寫,所以心跳新鮮只證明排程活著,不證明助理做了事。往後應該改由巡檢跑完那一輪去寫,心跳才等於工作訊號。限制已寫進技能內文與說明文件。
2026-09-01 14:34:12 +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
admin 4b0e4d796c Merge pull request '釋出 jsc-assist 0.0.2:助理 domain 落地與 status 技能' (#2) from feat/assistant-domain-bootstrap/main into develop
Reviewed-on: #2
2026-09-01 04:42:50 +00:00
admin f09830a636 Merge pull request 'feat/assistant-domain-bootstrap/init-and-status-skill' (#1) from feat/assistant-domain-bootstrap/init-and-status-skill into feat/assistant-domain-bootstrap/main
Reviewed-on: #1
2026-09-01 04:27:21 +00: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 814f28a6b8 chore(marketplace): 把 jsc-assist 登錄進統一 marketplace
What:
- 兩份 marketplace 檔各加一個 jsc-assist 條目,來源網址指向 assist 存取庫。

Why:
- 準則要求每個 domain 存取庫都帶同一份 marketplace 檔,任何一個存取庫都能當註冊入口。少了這個條目,各 CLI 的安裝指令找不到 jsc-assist,sync-domains 也不會把它同步下來。

How:
- 條目由 meta 的 sync-marketplace.sh 產生,同時寫進正本與每個 domain 存取庫的副本,寫完逐檔比對位元組。這一支存取庫的兩份副本就是那一輪的產物。
- 條目依名稱排序,縮排與非 ASCII 描述的處理都交給同一支腳本,不手改 JSON。

Who:
助理 domain 落地的註冊步驟,其餘 domain 存取庫的同一份副本另外送出。
2026-09-01 11:21:03 +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