Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 278f00a227 | |||
| 53328bfbe9 | |||
| d4547bfec3 | |||
| 2f43ecc346 |
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "isep",
|
||||
"description": "InkStone Environment Plugin —— leo 的 Claude Code 環境唯一真相源:43 支機械閘(53 條註冊,白話盤點見 docs/hooks-inventory.md)、7 支 slash command、2 支 skill、27 支腳本,外加治理規範與標籤真相源。本機與雲端裝同一份,沒有子集。",
|
||||
"version": "0.3.8",
|
||||
"version": "0.3.9",
|
||||
"keywords": [
|
||||
"inkstone",
|
||||
"guardrails",
|
||||
|
||||
@@ -29,7 +29,20 @@ case "$GATES" in
|
||||
GATES="$(ls "$ROOT"/hooks/*.sh 2>/dev/null | grep -cv '\.template\.sh$' | tr -d ' ')" ;;
|
||||
esac
|
||||
|
||||
MSG="🟢 ISEP v${VER} 已載入(${GATES} 支閘在 ${ROOT})"
|
||||
# 🔴 講清楚「這一份是誰」(leo 2026-08-23 的雲端驗收卡在這裡整整一輪):
|
||||
# 同一台機器上 ISEP 可能有兩份——marketplace 裝的 plugin 快取,
|
||||
# 與 repo 裡 vendor 進去的複製本。**兩份都會印這一行**,而版本號一樣時分不出誰在說話。
|
||||
# 「閘到底從哪一份走」正是決定「另一份能不能拆」的唯一判準
|
||||
# ⇒ 讓路徑自己講:快取在 plugins/cache/ 底下,vendor 的在 repo 的 .claude/ 底下。
|
||||
# (查過歷史:本檔只有 daa1674 建立、b1f399f 改閘數兩輪,沒有人試過標示來源,也沒有被否決的方案。
|
||||
# KBDB 語意搜尋這段開發史:0 命中,該餵。)
|
||||
case "$ROOT" in
|
||||
*/plugins/cache/*) SRC="plugin(marketplace 裝的)" ;;
|
||||
*/.claude/isep*) SRC="vendor(repo 裡的複製本)" ;;
|
||||
*) SRC="來源不明" ;;
|
||||
esac
|
||||
|
||||
MSG="🟢 ISEP v${VER} 已載入(${GATES} 支閘|來源:${SRC}|${ROOT})"
|
||||
|
||||
printf '%s\n' "{
|
||||
\"systemMessage\": \"${MSG}\",
|
||||
|
||||
@@ -87,7 +87,9 @@ STAMP="/tmp/.main-push-ok"
|
||||
stamp_ok() {
|
||||
[ -f "$STAMP" ] || return 1
|
||||
NOW=$(date +%s 2>/dev/null || echo 0)
|
||||
MT=$(stat -f %m "$STAMP" 2>/dev/null || stat -c %Y "$STAMP" 2>/dev/null || echo 0)
|
||||
# 🔴 GNU (Linux) 先、BSD (macOS) 後——順序反了戳記在雲端永遠失效(見 prod-write-guard.sh 同段註解):
|
||||
# GNU 的 `stat -f` 是 --file-system,`%m` 被當成檔名 ⇒ 印出檔案系統表且 exit 1 ⇒ MT 非數字 ⇒ arm 章在 Linux 永不生效。
|
||||
MT=$(stat -c %Y "$STAMP" 2>/dev/null || stat -f %m "$STAMP" 2>/dev/null || echo 0)
|
||||
case "$NOW$MT" in *[!0-9]*) return 1 ;; esac
|
||||
[ "$NOW" -gt 0 ] && [ "$MT" -gt 0 ] || return 1
|
||||
[ $((NOW - MT)) -lt 900 ] || return 1
|
||||
|
||||
@@ -52,7 +52,11 @@ STAMP="/tmp/.prod-write-ok"
|
||||
stamp_ok() {
|
||||
[ -f "$STAMP" ] || return 1
|
||||
NOW=$(date +%s 2>/dev/null || echo 0)
|
||||
MT=$(stat -f %m "$STAMP" 2>/dev/null || stat -c %Y "$STAMP" 2>/dev/null || echo 0)
|
||||
# 🔴 GNU (Linux) 先、BSD (macOS) 後——順序反了戳記在雲端永遠失效:
|
||||
# GNU 的 `stat -f` 是 --file-system,`%m` 被當成檔名 ⇒ 把整張檔案系統表印到
|
||||
# stdout(被 $() 收進去)且 exit 1 ⇒ MT 變非數字 ⇒ 這道閘的釋放章在 Linux 永不生效。
|
||||
# dev 在 macOS(BSD `-f %m` 正常)所以沒被抓到,一到雲端 Linux 就咬(實測 2026-08-23)。
|
||||
MT=$(stat -c %Y "$STAMP" 2>/dev/null || stat -f %m "$STAMP" 2>/dev/null || echo 0)
|
||||
case "$NOW$MT" in *[!0-9]*) return 1 ;; esac
|
||||
[ "$NOW" -gt 0 ] && [ "$MT" -gt 0 ] || return 1
|
||||
[ $((NOW - MT)) -lt 900 ] || return 1
|
||||
|
||||
@@ -172,7 +172,8 @@ for STAMP in /tmp/.stage-ok-by-leo /tmp/.stage-verified; do
|
||||
# 抽數字會得到天文數字 ⇒ `now - t` 是**負數** ⇒ `< 21600` 成立 ⇒ **永遠放行**。
|
||||
# ⇒ 只有「不晚於現在」的時間戳才算數;不合理就退回 mtime,別當成通過。
|
||||
if [ "$t" -eq 0 ] || [ "$t" -gt "$now" ]; then
|
||||
t=$(stat -f %m "$STAMP" 2>/dev/null || stat -c %Y "$STAMP" 2>/dev/null || echo 0)
|
||||
# 🔴 GNU (Linux) 先、BSD (macOS) 後(見 prod-write-guard.sh 同段註解):反了 stat -f %m 會在 Linux 印檔案系統表 ⇒ t 非數字 ⇒ 退回機制失效。
|
||||
t=$(stat -c %Y "$STAMP" 2>/dev/null || stat -f %m "$STAMP" 2>/dev/null || echo 0)
|
||||
fi
|
||||
[ "$t" -gt 0 ] && [ "$((now - t))" -lt 21600 ] && exit 0 # 6 小時內驗過 stage → 放行
|
||||
done
|
||||
|
||||
@@ -35,3 +35,20 @@ Gitea 上**一個 release tag 都沒有**。
|
||||
⇒ 「東西做出來了」與「有人在用它」是兩件事,而只有後者算交付。
|
||||
⇒ 判準:**去執行環境查它有沒有被載入**(`claude plugin list` / `claude plugin details`),
|
||||
不要從 repo 裡有什麼檔案去推論。
|
||||
|
||||
## ⚠️ MISTAKE: 閘的「釋放章」用 `stat -f %m` 先,雲端 Linux 永遠放行不了
|
||||
|
||||
2026-08-23 雲端 cloud-worker 實撞:三支閘(`prod-write-guard`/`main-and-prod-push-guard`/
|
||||
`stage-before-prod-guard`)取戳記 mtime 都寫成 `stat -f %m … || stat -c %Y …`。
|
||||
GNU(Linux)的 `stat -f` 是 `--file-system`,`%m` 被當成**檔名** ⇒ 把整張檔案系統表印到
|
||||
stdout(被 `$()` 收進去)且 exit 1 ⇒ 時間變數變非數字 ⇒ `case *[!0-9]*` 命中 ⇒ 釋放章判無效。
|
||||
後果:總管 `touch /tmp/.prod-write-ok` 在雲端**從沒生效過**,連 routine 要求的心跳都打不出去。
|
||||
|
||||
⇒ 正確做法:**GNU 先、BSD 後** → `stat -c %Y … || stat -f %m …`(Linux 走前者、macOS 走後者)。
|
||||
⇒ 為什麼本機測不出來:dev 在 macOS,BSD `stat -f %m` 本來就正常 ⇒ 這種「只咬某一個 OS」的坑,
|
||||
**驗證要在真正會跑的環境(雲端 Linux)跑,不能只在 dev 機跑**。
|
||||
⇒ 同款第二例(同日抓到,未修):`history-first-guard` 的逃生口說明寫 `touch /tmp/.kbdb-down`,
|
||||
但它讀該檔是 `cat` 出來當時間戳算術——**空 `touch` 會炸**,正解是 `date +%s > /tmp/.kbdb-down`。
|
||||
教訓:**逃生口本身也要被測**,不然閘壞了連逃生口都用不了。
|
||||
(修復:分支 `fix/stamp-release-stat-ordering-linux`;回報 ISEP#30 / InkStoneCo#14)
|
||||
日期: 2026-08-23
|
||||
|
||||
Reference in New Issue
Block a user