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: