From 1b5551274ac9d6e47f8ae94cf0de085746fa100a Mon Sep 17 00:00:00 2001 From: richblack Date: Fri, 21 Aug 2026 01:18:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=85=E9=A9=97=E5=B7=A5=E4=BD=9C=E5=96=AE?= =?UTF-8?q?=E6=94=B9=E7=94=A8=E5=AE=A3=E7=A8=B1=E5=85=A7=E5=AE=B9=E5=8E=BB?= =?UTF-8?q?=E9=87=8D=EF=BC=8C=E9=A9=97=E9=81=8E=E7=9A=84=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E5=86=92=E5=87=BA=E4=BE=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit stamp 原本雜湊「交件路徑」⇒ 同樣的宣稱每回合生一個新檔名, 而且不知道總管已經驗過了。 實際發作(2026-08-21 一個 session 內):同兩條 sdd-guard 宣稱連生四張單 1c97d461/fcb285dc/256de849/394b97ae——驗掉一張下一回合又冒一張, Stop 閘於是變成永遠過不去。閘在懲罰有照做的人。 改成雜湊宣稱內容本身,並在寫檔前檢查 verified/ 底下有沒有同名。 雙向實測: 兩次不同 transcript、同樣宣稱 → 只生 1 個檔 移進 verified/ 後再跑 → SKIP:already-verified,沒再冒出來 過程中兩個自己的錯,記下來免得下次重犯: ① 先猜了變數名 blocked/ok/nogo,實際是 ok_hits/ng_hits ——猜錯的話 _claims 永遠是空的、悄悄退回舊行為,不會報錯 ② 測試資料先寫成 role:assistant,再寫成 role:user 都不觸發 ——它要的是 裡的 前兩次「0 個檔」我差點當成去重成功 Co-Authored-By: Claude Opus 5 --- hooks/subagent-claim-worksheet.sh | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/hooks/subagent-claim-worksheet.sh b/hooks/subagent-claim-worksheet.sh index 0984d25..6d3cfe4 100755 --- a/hooks/subagent-claim-worksheet.sh +++ b/hooks/subagent-claim-worksheet.sh @@ -119,8 +119,21 @@ if not ok_hits and not ng_hits: sid = (d.get("session_id") or "nosid")[:8] aid = (d.get("agent_id") or d.get("subagent_id") or "")[:10] -stamp = hashlib.sha1((tp + sid + aid).encode()).hexdigest()[:8] -path = os.path.join(os.environ["DIR"], "claims-%s-%s.md" % (sid, stamp)) +# 🔴 2026-08-21:stamp 原本雜湊「交件路徑」⇒ 同樣的宣稱每回合生一個新檔名, +# 而且不知道總管已經驗過了。實際發作:同兩條 sdd-guard 宣稱連生四張單 +# (1c97d461/fcb285dc/256de849/394b97ae),驗掉一張下一回合又冒一張。 +# ⇒ 改成雜湊**宣稱內容本身**:同樣的宣稱=同一個檔名 ⇒ 驗過就不再冒出來。 +_claims = sorted(set(str(x) for x in (ok_hits + ng_hits))) +# 🔴 空清單就退回舊行為 —— 但那等於這支閘沒抓到任何宣稱,本來就會 SKIP, +# 所以這個 fallback 實際上不會被用到;留著只是不讓 stamp 變成空字串的雜湊。 +_basis = "\n".join(_claims) if _claims else (tp + sid + aid) +stamp = hashlib.sha1(_basis.encode()).hexdigest()[:8] +_name = "claims-%s-%s.md" % (sid, stamp) +path = os.path.join(os.environ["DIR"], _name) + +# 已經驗過並移進 verified/ 的,不要再生一次。 +if os.path.exists(os.path.join(os.environ["DIR"], "verified", _name)): + print("SKIP:already-verified"); raise SystemExit def block(title, items, howto, cap): if not items: -- 2.52.0