逃生門要真的走得通:touch /tmp/.kbdb-down 從來沒放行過(inkstone/ISEP#122)
實撞(2026-09-02,做這張票的路上):KBDB 兩支工具都回 Connection closed,
照 history-first-guard.sh 印出來的那行 `touch /tmp/.kbdb-down` 打完再送同一個編輯,
**被一模一樣地擋第二次,訊息一字不差**。
根因(打出來的,不是推的):
$ touch /tmp/.kbdb-down
$ t=$(cat /tmp/.kbdb-down); echo "[$t]" → []
$ echo $((now - t)) → 1788318047 ≥ 3600
touch 造的是空檔,而那支閘讀的是**檔案內容**當時戳
⇒ 空字串被當成 0 ⇒「距今 17 億秒」⇒ 永遠不新鮮 ⇒ 恆擋。
⇒ 那行逃生門是印出來好看的,**沒有人照著打過一次**。
跟本票 comment 6071(scripts/ticket 沒有 handback 這個動詞)、
inkstone/ISEP#125(worktree 閘的逃生門原文照打 rc=2)是同一句話。
改法:內容不是數字就改用檔案的 mtime——touch 做的正是更新 mtime,
所以訊息那一行從此真的走得通;kbdb-asked-stamp.sh 寫數字的舊格式照樣相容。
路徑加 KBDB_STAMP_DIR 覆寫,只為了讓測試不去動這台機器真正的戳記
(清掉別的 session 的戳記=把閘弄成隨機的)。
沒有把閘弄鬆:過期的戳記照樣不算數(測試第 ⑦ 條守這件事),
文件/新檔/測試檔本來就不擋的三條也各有一格守著。
驗(hooks/tests/history-first-guard.test.sh,10 條,全離線):
修好後 10/10
修好前(路徑隔離) 9/10 —— ④「擋人的換成歷史警察了嗎」紅
⚠️ 第 ③ 條兩版都綠(它只驗離開碼,而過了第 0 道還有歷史警察會擋)
真正分辨得出新舊的是 ④,檔頭寫了怎麼重現這個對照。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -56,15 +56,32 @@ STAMP="/tmp/.history-guard-$(printf '%s' "$FILE_PATH" | shasum | cut -c1-12)"
|
||||
#
|
||||
# 時戳由 kbdb-asked-stamp.sh(PostToolUse,matcher 對 kbdb_* 工具)寫下。
|
||||
# 逃生口:KBDB 真的連不上時 `touch /tmp/.kbdb-down`——放行但留痕,且回覆裡要說明。
|
||||
KBDB_STAMP=/tmp/.kbdb-asked
|
||||
KBDB_DOWN=/tmp/.kbdb-down
|
||||
#
|
||||
# 🔴 **逃生門要真的走得通**(inkstone/ISEP#122,2026-09-02 實撞,本檔第二次修):
|
||||
# 上面那句訊息叫人 `touch /tmp/.kbdb-down`,而 `touch` 造出來的是**空檔**
|
||||
# ⇒ 舊版 `t=$(cat "$f")` 讀到空字串 ⇒ 算式當成 0 ⇒ 「距今 17 億秒」
|
||||
# ⇒ 永遠不新鮮 ⇒ **照著訊息打完,還是被擋**。
|
||||
# 實測(2026-09-02,KBDB 兩支工具都回 Connection closed 時):
|
||||
# $ touch /tmp/.kbdb-down → 再送同一個編輯 → 一模一樣的擋,訊息一字不差
|
||||
# ⇒ 那行逃生門是印出來好看的,**沒有人照著打過一次**
|
||||
# (同族:ISEP#125 worktree 閘印的逃生門原文照打 rc=2;本票 comment 6071)。
|
||||
#
|
||||
# 改法:**內容不是數字就用檔案的 mtime**——`touch` 做的正是更新 mtime,
|
||||
# 所以訊息裡那一行從此真的走得通,而 `kbdb-asked-stamp.sh` 寫數字的舊格式照樣相容。
|
||||
# 路徑用 `KBDB_STAMP_DIR` 可覆寫,**只為了讓迴歸測試不去動這台機器真正的戳記**
|
||||
# (測試把別的 session 的戳記清掉=把閘弄成隨機的)。
|
||||
KBDB_STAMP="${KBDB_STAMP_DIR:-/tmp}/.kbdb-asked"
|
||||
KBDB_DOWN="${KBDB_STAMP_DIR:-/tmp}/.kbdb-down"
|
||||
kbdb_fresh=0
|
||||
now=$(date +%s)
|
||||
for f in "$KBDB_STAMP" "$KBDB_DOWN"; do
|
||||
if [ -f "$f" ]; then
|
||||
t=$(cat "$f" 2>/dev/null || echo 0)
|
||||
[ $((now - t)) -lt 3600 ] && kbdb_fresh=1
|
||||
fi
|
||||
[ -f "$f" ] || continue
|
||||
t=$(cat "$f" 2>/dev/null || true)
|
||||
case "$t" in
|
||||
''|*[!0-9]*) t=$(date -r "$f" +%s 2>/dev/null || stat -c %Y "$f" 2>/dev/null || echo 0) ;;
|
||||
esac
|
||||
[ "${t:-0}" -gt 0 ] || continue
|
||||
[ $((now - t)) -lt 3600 ] && kbdb_fresh=1
|
||||
done
|
||||
if [ "$kbdb_fresh" -eq 0 ]; then
|
||||
cat >&2 <<'KEOF'
|
||||
|
||||
Reference in New Issue
Block a user